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:
1 parent
da0d67864f
commit
d0d94c30fa
3 files changed
+217
-1
No files matched your search
@@ -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
|
package com.notemusicali.exercises
|
||||||
|
|
||||||
import com.notemusicali.music.MusicalNote
|
import com.notemusicali.music.MusicalNote
|
||||||
|
import com.notemusicali.music.NoteDuration
|
||||||
import com.notemusicali.music.NoteSequence
|
import com.notemusicali.music.NoteSequence
|
||||||
|
|
||||||
data class Exercise(
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user