feat: Studio op.84 n.10 di Dancla tra gli esercizi

177 note (Sol3-Re6, Sol maggiore, 4/4) estratte dal MusicXML con il
parser dell'app; livello 4, con test di presenza e sanità.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
lucianoandClaude Fable 5 committed 2026-07-22 20:50:20 +02:00
1 parent da0d67864f
commit d0d94c30fa
3 files changed
+217 -1

No files matched your search

-1
View File
@@ -1 +0,0 @@
{"sessionId":"db412f81-3e15-4e3f-9010-4a026dced776","pid":79175,"procStart":"Tue Jul 21 20:39:41 2026","acquiredAt":1784666538953}
@@ -1,6 +1,7 @@
package com.notemusicali.exercises
import com.notemusicali.music.MusicalNote
import com.notemusicali.music.NoteDuration
import com.notemusicali.music.NoteSequence
data class Exercise(
@@ -125,5 +126,195 @@ object ExerciseRepository {
),
),
),
Exercise(
id = 6,
title = "Studio op.84 n.10 — Dancla",
description = "Studio per violino in Sol maggiore",
level = 4,
sequence = NoteSequence(
name = "Studio op.84 n.10 — Dancla",
notes = listOf(
MusicalNote.fromMidi(55, NoteDuration.EIGHTH),
MusicalNote.fromMidi(59, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.HALF),
MusicalNote.fromMidi(59, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(72, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(83, NoteDuration.HALF),
MusicalNote.fromMidi(55, NoteDuration.EIGHTH),
MusicalNote.fromMidi(59, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.HALF),
MusicalNote.fromMidi(59, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(72, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.HALF),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.HALF),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.EIGHTH),
MusicalNote.fromMidi(73, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.HALF),
MusicalNote.fromMidi(64, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(73, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.HALF),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.HALF),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(83, NoteDuration.HALF),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.HALF),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.EIGHTH),
MusicalNote.fromMidi(73, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.HALF),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.HALF),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.HALF),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(70, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.HALF),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(70, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(70, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(86, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.HALF),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(70, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(70, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(62, NoteDuration.HALF),
MusicalNote.fromMidi(55, NoteDuration.EIGHTH),
MusicalNote.fromMidi(58, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(58, NoteDuration.EIGHTH, preferFlat = true),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(83, NoteDuration.EIGHTH),
MusicalNote.fromMidi(86, NoteDuration.HALF),
MusicalNote.fromMidi(86, NoteDuration.EIGHTH),
MusicalNote.fromMidi(84, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(78, NoteDuration.EIGHTH),
MusicalNote.fromMidi(81, NoteDuration.EIGHTH),
MusicalNote.fromMidi(86, NoteDuration.HALF),
MusicalNote.fromMidi(83, NoteDuration.EIGHTH),
MusicalNote.fromMidi(79, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.HALF),
MusicalNote.fromMidi(60, NoteDuration.EIGHTH),
MusicalNote.fromMidi(64, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(72, NoteDuration.EIGHTH),
MusicalNote.fromMidi(76, NoteDuration.HALF),
MusicalNote.fromMidi(59, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(71, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(57, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(66, NoteDuration.EIGHTH),
MusicalNote.fromMidi(69, NoteDuration.EIGHTH),
MusicalNote.fromMidi(74, NoteDuration.HALF),
MusicalNote.fromMidi(67, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(59, NoteDuration.EIGHTH),
MusicalNote.fromMidi(62, NoteDuration.EIGHTH),
MusicalNote.fromMidi(55, NoteDuration.QUARTER),
),
beats = 4,
beatType = 4,
),
),
)
}
@@ -0,0 +1,26 @@
package com.notemusicali.exercises
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
class ExerciseRepositoryTest {
@Test
fun `dancla study op84 n10 is available as exercise`() {
val exercise = ExerciseRepository.all.firstOrNull { it.title.contains("Dancla") }
assertNotNull(exercise, "lo studio di Dancla deve essere tra gli esercizi")
assertTrue(exercise.sequence.notes.size > 100, "atteso lo studio completo, trovate ${exercise.sequence.notes.size} note")
assertEquals(4, exercise.sequence.beats)
assertEquals(4, exercise.sequence.beatType)
// Studio per violino: tutte le note dentro l'estensione del violino (G3..E7)
assertTrue(exercise.sequence.notes.all { it.midiNumber in 55..100 })
}
@Test
fun `exercise ids are unique`() {
val ids = ExerciseRepository.all.map { it.id }
assertEquals(ids.size, ids.toSet().size)
}
}