diff --git a/charts/high/high-erect.json b/charts/high/high-erect.json new file mode 100644 index 0000000..d3e19b2 --- /dev/null +++ b/charts/high/high-erect.json @@ -0,0 +1,4180 @@ +{ + "song": { + "player1": "bf2", + "player2": "mom-car", + "events": [], + "notes": [ + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 4320, + 0, + 0 + ], + [ + 4560, + 2, + 0 + ], + [ + 4800, + 1, + 0 + ], + [ + 4920, + 0, + 0 + ], + [ + 5160, + 2, + 240 + ], + [ + 5520, + 0, + 0 + ], + [ + 3840, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 6240, + 0, + 0 + ], + [ + 6480, + 2, + 0 + ], + [ + 6720, + 1, + 0 + ], + [ + 6840, + 0, + 0 + ], + [ + 7440, + 0, + 0 + ], + [ + 7080, + 2, + 240 + ], + [ + 5760, + 0, + 0 + ], + [ + 7560, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 7680, + 0, + 240 + ], + [ + 8160, + 0, + 0 + ], + [ + 8400, + 2, + 0 + ], + [ + 8640, + 1, + 0 + ], + [ + 8760, + 2, + 0 + ], + [ + 9000, + 0, + 0 + ], + [ + 9360, + 2, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 9600, + 0, + 0 + ], + [ + 9720, + 2, + 0 + ], + [ + 9840, + 0, + 0 + ], + [ + 9960, + 1, + 0 + ], + [ + 10080, + 3, + 0 + ], + [ + 10320, + 1, + 0 + ], + [ + 10440, + 0, + 0 + ], + [ + 10560, + 2, + 0 + ], + [ + 10800, + 0, + 0 + ], + [ + 11040, + 2, + 0 + ], + [ + 11160, + 0, + 0 + ], + [ + 11280, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 12000, + 0, + 0 + ], + [ + 12600, + 0, + 0 + ], + [ + 11520, + 0, + 0 + ], + [ + 11760, + 0, + 0 + ], + [ + 12240, + 1, + 0 + ], + [ + 12480, + 2, + 0 + ], + [ + 12960, + 2, + 0 + ], + [ + 13320, + 2, + 0 + ], + [ + 12840, + 1, + 0 + ], + [ + 13200, + 3, + 0 + ], + [ + 13080, + 1, + 0 + ], + [ + 11880, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 13440, + 0, + 0 + ], + [ + 13680, + 0, + 0 + ], + [ + 13920, + 0, + 0 + ], + [ + 14160, + 1, + 0 + ], + [ + 14400, + 2, + 0 + ], + [ + 14520, + 0, + 0 + ], + [ + 15120, + 0, + 0 + ], + [ + 14760, + 1, + 240 + ], + [ + 13800, + 0, + 0 + ], + [ + 15240, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 15360, + 0, + 0 + ], + [ + 15600, + 0, + 0 + ], + [ + 15840, + 0, + 0 + ], + [ + 16080, + 1, + 0 + ], + [ + 16320, + 2, + 0 + ], + [ + 16440, + 1, + 0 + ], + [ + 16680, + 0, + 240 + ], + [ + 17040, + 1, + 0 + ], + [ + 15480, + 1, + 0 + ], + [ + 15720, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 17280, + 0, + 0 + ], + [ + 17520, + 0, + 0 + ], + [ + 17760, + 3, + 0 + ], + [ + 17400, + 2, + 0 + ], + [ + 17640, + 1, + 0 + ], + [ + 18000, + 1, + 0 + ], + [ + 18120, + 0, + 0 + ], + [ + 18240, + 2, + 0 + ], + [ + 18480, + 0, + 0 + ], + [ + 18720, + 2, + 0 + ], + [ + 18840, + 0, + 0 + ], + [ + 18960, + 3, + 0 + ], + [ + 17280, + 7, + 360 + ], + [ + 17760, + 6, + 360 + ], + [ + 18240, + 5, + 360 + ], + [ + 18720, + 6, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 19200, + 1, + 120 + ], + [ + 19440, + 0, + 0 + ], + [ + 19560, + 1, + 0 + ], + [ + 20040, + 0, + 0 + ], + [ + 20160, + 3, + 0 + ], + [ + 20520, + 1, + 0 + ], + [ + 20880, + 1, + 0 + ], + [ + 21000, + 3, + 0 + ], + [ + 19680, + 2, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 21120, + 1, + 120 + ], + [ + 21360, + 0, + 0 + ], + [ + 21480, + 1, + 0 + ], + [ + 21960, + 0, + 0 + ], + [ + 22440, + 1, + 0 + ], + [ + 21600, + 2, + 0 + ], + [ + 22080, + 1, + 0 + ], + [ + 22200, + 3, + 120 + ], + [ + 22800, + 2, + 0 + ], + [ + 22920, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 23280, + 0, + 0 + ], + [ + 23400, + 1, + 0 + ], + [ + 23880, + 0, + 0 + ], + [ + 24360, + 1, + 0 + ], + [ + 23520, + 2, + 0 + ], + [ + 24000, + 3, + 0 + ], + [ + 24720, + 1, + 0 + ], + [ + 24840, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 24960, + 7, + 360 + ], + [ + 25920, + 6, + 0 + ], + [ + 26040, + 4, + 0 + ], + [ + 25440, + 5, + 360 + ], + [ + 26160, + 6, + 0 + ], + [ + 26280, + 7, + 0 + ], + [ + 26400, + 5, + 0 + ], + [ + 26520, + 7, + 0 + ], + [ + 26640, + 6, + 0 + ], + [ + 26760, + 4, + 0 + ], + [ + 24960, + 2, + 360 + ], + [ + 25440, + 0, + 0 + ], + [ + 25680, + 1, + 0 + ], + [ + 25920, + 2, + 0 + ], + [ + 26040, + 0, + 0 + ], + [ + 26160, + 2, + 0 + ], + [ + 26280, + 3, + 0 + ], + [ + 26400, + 1, + 0 + ], + [ + 26520, + 3, + 0 + ], + [ + 26640, + 2, + 0 + ], + [ + 26760, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 26880, + 1, + 120 + ], + [ + 27120, + 0, + 0 + ], + [ + 27240, + 1, + 0 + ], + [ + 27600, + 1, + 0 + ], + [ + 27720, + 0, + 0 + ], + [ + 27840, + 3, + 0 + ], + [ + 28680, + 3, + 0 + ], + [ + 27360, + 2, + 0 + ], + [ + 27480, + 3, + 0 + ], + [ + 28200, + 3, + 0 + ], + [ + 28560, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 28800, + 1, + 120 + ], + [ + 29040, + 0, + 0 + ], + [ + 29160, + 1, + 0 + ], + [ + 29280, + 2, + 0 + ], + [ + 29400, + 3, + 0 + ], + [ + 29520, + 1, + 0 + ], + [ + 29640, + 0, + 0 + ], + [ + 29760, + 2, + 0 + ], + [ + 29820, + 3, + 60 + ], + [ + 30000, + 2, + 0 + ], + [ + 30120, + 1, + 0 + ], + [ + 30240, + 0, + 0 + ], + [ + 30360, + 2, + 0 + ], + [ + 30480, + 1, + 0 + ], + [ + 30600, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 30720, + 1, + 120 + ], + [ + 30960, + 0, + 0 + ], + [ + 31080, + 1, + 0 + ], + [ + 31200, + 2, + 0 + ], + [ + 31320, + 3, + 0 + ], + [ + 31440, + 1, + 0 + ], + [ + 31560, + 0, + 0 + ], + [ + 31680, + 3, + 0 + ], + [ + 31800, + 2, + 0 + ], + [ + 31920, + 0, + 0 + ], + [ + 32040, + 3, + 0 + ], + [ + 32280, + 1, + 0 + ], + [ + 32400, + 3, + 0 + ], + [ + 32520, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 32640, + 0, + 0 + ], + [ + 32880, + 0, + 0 + ], + [ + 33480, + 0, + 0 + ], + [ + 33600, + 1, + 0 + ], + [ + 33720, + 3, + 0 + ], + [ + 33840, + 2, + 0 + ], + [ + 33960, + 1, + 0 + ], + [ + 34080, + 0, + 0 + ], + [ + 34200, + 2, + 0 + ], + [ + 34320, + 1, + 0 + ], + [ + 34440, + 3, + 0 + ], + [ + 32760, + 2, + 0 + ], + [ + 33000, + 2, + 0 + ], + [ + 33120, + 1, + 0 + ], + [ + 33240, + 3, + 0 + ], + [ + 33360, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 34560, + 0, + 0 + ], + [ + 34680, + 2, + 0 + ], + [ + 34800, + 1, + 0 + ], + [ + 34920, + 3, + 0 + ], + [ + 35040, + 2, + 360 + ], + [ + 36000, + 0, + 360 + ], + [ + 35520, + 1, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 36960, + 2, + 0 + ], + [ + 36840, + 1, + 0 + ], + [ + 36480, + 1, + 0 + ], + [ + 37080, + 3, + 0 + ], + [ + 37200, + 0, + 0 + ], + [ + 37320, + 2, + 0 + ], + [ + 37440, + 1, + 240 + ], + [ + 37800, + 2, + 0 + ], + [ + 37920, + 0, + 240 + ], + [ + 38280, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 38880, + 3, + 360 + ], + [ + 39360, + 0, + 360 + ], + [ + 38400, + 2, + 360 + ], + [ + 39840, + 1, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 40560, + 1, + 0 + ], + [ + 41760, + 0, + 240 + ], + [ + 42120, + 2, + 0 + ], + [ + 40800, + 0, + 0 + ], + [ + 41160, + 3, + 0 + ], + [ + 41280, + 2, + 240 + ], + [ + 41640, + 1, + 0 + ], + [ + 40440, + 0, + 0 + ], + [ + 40680, + 2, + 0 + ], + [ + 40920, + 1, + 0 + ], + [ + 41040, + 2, + 0 + ], + [ + 40320, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 42240, + 4, + 360 + ], + [ + 42720, + 5, + 360 + ], + [ + 43200, + 7, + 360 + ], + [ + 43680, + 4, + 360 + ], + [ + 42240, + 2, + 0 + ], + [ + 42360, + 0, + 0 + ], + [ + 42480, + 1, + 0 + ], + [ + 42600, + 3, + 0 + ], + [ + 42720, + 0, + 0 + ], + [ + 42840, + 1, + 0 + ], + [ + 42960, + 2, + 0 + ], + [ + 43080, + 3, + 0 + ], + [ + 43680, + 2, + 0 + ], + [ + 43800, + 0, + 0 + ], + [ + 44040, + 3, + 0 + ], + [ + 43920, + 2, + 0 + ], + [ + 43320, + 0, + 0 + ], + [ + 43200, + 1, + 0 + ], + [ + 43440, + 1, + 120 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 44160, + 0, + 0 + ], + [ + 44520, + 0, + 0 + ], + [ + 44640, + 1, + 0 + ], + [ + 44280, + 3, + 0 + ], + [ + 44400, + 1, + 0 + ], + [ + 45000, + 1, + 0 + ], + [ + 45480, + 1, + 0 + ], + [ + 45960, + 1, + 0 + ], + [ + 45000, + 5, + 0 + ], + [ + 45120, + 4, + 240 + ], + [ + 45480, + 5, + 0 + ], + [ + 45600, + 7, + 240 + ], + [ + 45960, + 5, + 0 + ], + [ + 44160, + 6, + 360 + ], + [ + 44760, + 3, + 0 + ], + [ + 44880, + 2, + 0 + ], + [ + 45120, + 3, + 240 + ], + [ + 45600, + 2, + 240 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 46080, + 0, + 0 + ], + [ + 46800, + 2, + 0 + ], + [ + 46920, + 1, + 0 + ], + [ + 47040, + 3, + 0 + ], + [ + 47160, + 2, + 0 + ], + [ + 47280, + 3, + 0 + ], + [ + 46080, + 4, + 360 + ], + [ + 46560, + 6, + 1080 + ], + [ + 46200, + 2, + 0 + ], + [ + 46440, + 2, + 0 + ], + [ + 46560, + 0, + 0 + ], + [ + 46680, + 3, + 0 + ], + [ + 47760, + 3, + 120 + ], + [ + 47400, + 0, + 0 + ], + [ + 47520, + 1, + 0 + ], + [ + 47640, + 2, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 48720, + 2, + 0 + ], + [ + 48840, + 3, + 0 + ], + [ + 48960, + 1, + 240 + ], + [ + 49320, + 0, + 0 + ], + [ + 49800, + 3, + 0 + ], + [ + 49440, + 2, + 240 + ], + [ + 48480, + 0, + 0 + ], + [ + 48600, + 1, + 0 + ], + [ + 48000, + 1, + 0 + ], + [ + 48120, + 0, + 0 + ], + [ + 48240, + 1, + 0 + ], + [ + 48360, + 2, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 49920, + 6, + 840 + ], + [ + 49920, + 1, + 600 + ], + [ + 50640, + 2, + 0 + ], + [ + 50880, + 2, + 0 + ], + [ + 51000, + 3, + 120 + ], + [ + 51240, + 2, + 0 + ], + [ + 51360, + 0, + 0 + ], + [ + 51720, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 51840, + 0, + 360 + ], + [ + 52920, + 3, + 120 + ], + [ + 52320, + 1, + 120 + ], + [ + 52560, + 2, + 0 + ], + [ + 52800, + 2, + 0 + ], + [ + 53160, + 2, + 0 + ], + [ + 53280, + 0, + 120 + ], + [ + 53640, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 55560, + 0, + 0 + ], + [ + 53760, + 3, + 360 + ], + [ + 54240, + 0, + 120 + ], + [ + 54480, + 2, + 0 + ], + [ + 54720, + 2, + 0 + ], + [ + 54840, + 3, + 120 + ], + [ + 55080, + 2, + 0 + ], + [ + 55200, + 1, + 120 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 55680, + 2, + 0 + ], + [ + 55920, + 2, + 0 + ], + [ + 56040, + 1, + 0 + ], + [ + 56160, + 0, + 0 + ], + [ + 56280, + 3, + 0 + ], + [ + 56400, + 2, + 0 + ], + [ + 56760, + 2, + 0 + ], + [ + 56520, + 0, + 0 + ], + [ + 56640, + 1, + 0 + ], + [ + 56880, + 3, + 120 + ], + [ + 57120, + 2, + 0 + ], + [ + 57360, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 57600, + 6, + 360 + ], + [ + 57600, + 2, + 120 + ], + [ + 58140, + 3, + 0 + ], + [ + 58320, + 2, + 0 + ], + [ + 58440, + 0, + 0 + ], + [ + 58200, + 1, + 0 + ], + [ + 58080, + 0, + 0 + ], + [ + 58560, + 2, + 0 + ], + [ + 58680, + 3, + 0 + ], + [ + 58800, + 1, + 0 + ], + [ + 58920, + 0, + 0 + ], + [ + 59040, + 2, + 0 + ], + [ + 59160, + 1, + 0 + ], + [ + 59280, + 2, + 0 + ], + [ + 59400, + 3, + 0 + ], + [ + 57840, + 3, + 120 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 59520, + 2, + 0 + ], + [ + 59640, + 1, + 0 + ], + [ + 59760, + 0, + 0 + ], + [ + 59880, + 3, + 0 + ], + [ + 60000, + 0, + 0 + ], + [ + 60120, + 1, + 0 + ], + [ + 60240, + 2, + 0 + ], + [ + 60480, + 2, + 0 + ], + [ + 60600, + 1, + 0 + ], + [ + 60720, + 3, + 0 + ], + [ + 60840, + 0, + 0 + ], + [ + 60360, + 3, + 0 + ], + [ + 61320, + 3, + 0 + ], + [ + 60960, + 2, + 240 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 61440, + 1, + 120 + ], + [ + 61680, + 0, + 0 + ], + [ + 61800, + 3, + 0 + ], + [ + 61920, + 2, + 0 + ], + [ + 62280, + 2, + 0 + ], + [ + 62400, + 0, + 0 + ], + [ + 62520, + 1, + 120 + ], + [ + 62160, + 0, + 0 + ], + [ + 62040, + 1, + 0 + ], + [ + 62880, + 2, + 0 + ], + [ + 63120, + 2, + 0 + ], + [ + 63240, + 1, + 0 + ], + [ + 62760, + 0, + 0 + ], + [ + 63000, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 63360, + 0, + 0 + ], + [ + 63480, + 2, + 0 + ], + [ + 63600, + 0, + 0 + ], + [ + 63720, + 1, + 0 + ], + [ + 63840, + 2, + 0 + ], + [ + 63960, + 3, + 0 + ], + [ + 64080, + 0, + 0 + ], + [ + 64200, + 1, + 0 + ], + [ + 64320, + 2, + 0 + ], + [ + 64440, + 0, + 0 + ], + [ + 64560, + 1, + 120 + ], + [ + 64800, + 0, + 0 + ], + [ + 65040, + 3, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 65280, + 4, + 0 + ], + [ + 65400, + 6, + 0 + ], + [ + 65520, + 4, + 120 + ], + [ + 65280, + 0, + 0 + ], + [ + 65400, + 2, + 0 + ], + [ + 65520, + 1, + 0 + ], + [ + 65640, + 3, + 0 + ], + [ + 65760, + 2, + 360 + ], + [ + 66240, + 0, + 360 + ], + [ + 66720, + 1, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 67200, + 4, + 0 + ], + [ + 67560, + 4, + 0 + ], + [ + 67680, + 5, + 0 + ], + [ + 67800, + 6, + 0 + ], + [ + 67920, + 7, + 0 + ], + [ + 68040, + 4, + 0 + ], + [ + 68160, + 5, + 240 + ], + [ + 68520, + 4, + 0 + ], + [ + 68640, + 6, + 240 + ], + [ + 69000, + 4, + 0 + ], + [ + 67200, + 0, + 0 + ], + [ + 67200, + 0, + 0 + ], + [ + 67560, + 0, + 0 + ], + [ + 67680, + 1, + 0 + ], + [ + 67800, + 2, + 0 + ], + [ + 67920, + 3, + 0 + ], + [ + 68040, + 0, + 0 + ], + [ + 68160, + 1, + 240 + ], + [ + 68520, + 0, + 0 + ], + [ + 68640, + 2, + 240 + ], + [ + 69000, + 0, + 0 + ], + [ + 67200, + 4, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 69120, + 7, + 360 + ], + [ + 69120, + 1, + 360 + ], + [ + 69600, + 3, + 360 + ], + [ + 70080, + 0, + 360 + ], + [ + 70560, + 2, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 71040, + 0, + 0 + ], + [ + 71160, + 2, + 0 + ], + [ + 71280, + 1, + 0 + ], + [ + 71400, + 3, + 0 + ], + [ + 71520, + 2, + 0 + ], + [ + 71640, + 1, + 0 + ], + [ + 71760, + 0, + 0 + ], + [ + 71880, + 2, + 0 + ], + [ + 72000, + 3, + 240 + ], + [ + 72360, + 2, + 0 + ], + [ + 72480, + 0, + 240 + ], + [ + 72840, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 73440, + 5, + 360 + ], + [ + 73920, + 6, + 360 + ], + [ + 72960, + 7, + 360 + ], + [ + 74400, + 4, + 360 + ], + [ + 73080, + 0, + 0 + ], + [ + 72960, + 2, + 0 + ], + [ + 73200, + 1, + 0 + ], + [ + 73320, + 3, + 0 + ], + [ + 73440, + 0, + 0 + ], + [ + 73560, + 1, + 0 + ], + [ + 73680, + 2, + 0 + ], + [ + 73800, + 3, + 0 + ], + [ + 73920, + 1, + 0 + ], + [ + 74160, + 0, + 0 + ], + [ + 74040, + 2, + 0 + ], + [ + 74280, + 1, + 0 + ], + [ + 74400, + 3, + 0 + ], + [ + 74520, + 1, + 0 + ], + [ + 74760, + 3, + 0 + ], + [ + 74640, + 2, + 0 + ], + [ + 74520, + 0, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 74880, + 0, + 0 + ], + [ + 75240, + 0, + 0 + ], + [ + 75360, + 1, + 0 + ], + [ + 75120, + 1, + 0 + ], + [ + 75000, + 3, + 0 + ], + [ + 75480, + 2, + 0 + ], + [ + 75600, + 3, + 0 + ], + [ + 75720, + 1, + 0 + ], + [ + 75840, + 0, + 0 + ], + [ + 75960, + 2, + 0 + ], + [ + 76080, + 0, + 0 + ], + [ + 76200, + 1, + 0 + ], + [ + 76320, + 3, + 0 + ], + [ + 76560, + 1, + 0 + ], + [ + 76440, + 2, + 0 + ], + [ + 76680, + 0, + 0 + ], + [ + 74880, + 6, + 360 + ], + [ + 75840, + 7, + 240 + ], + [ + 76200, + 5, + 0 + ], + [ + 76320, + 4, + 240 + ], + [ + 76680, + 5, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 76800, + 1, + 0 + ], + [ + 76920, + 3, + 0 + ], + [ + 77040, + 2, + 0 + ], + [ + 77160, + 3, + 0 + ], + [ + 77280, + 1, + 0 + ], + [ + 77400, + 0, + 0 + ], + [ + 77520, + 2, + 0 + ], + [ + 77640, + 1, + 0 + ], + [ + 77760, + 3, + 0 + ], + [ + 77880, + 0, + 0 + ], + [ + 78000, + 3, + 0 + ], + [ + 78240, + 0, + 0 + ], + [ + 78120, + 1, + 0 + ], + [ + 78360, + 2, + 0 + ], + [ + 76800, + 7, + 360 + ], + [ + 77280, + 6, + 1080 + ], + [ + 78480, + 3, + 120 + ], + [ + 78480, + 1, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 79200, + 0, + 0 + ], + [ + 79320, + 1, + 0 + ], + [ + 79440, + 2, + 0 + ], + [ + 79080, + 2, + 0 + ], + [ + 79560, + 3, + 0 + ], + [ + 79680, + 1, + 240 + ], + [ + 80040, + 3, + 0 + ], + [ + 80160, + 2, + 0 + ], + [ + 80280, + 1, + 0 + ], + [ + 80400, + 0, + 0 + ], + [ + 80520, + 3, + 0 + ], + [ + 78720, + 0, + 0 + ], + [ + 78840, + 1, + 0 + ], + [ + 78960, + 3, + 0 + ], + [ + 79800, + 0, + 120 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 80640, + 6, + 840 + ], + [ + 80640, + 2, + 840 + ], + [ + 82080, + 5, + 360 + ], + [ + 82080, + 4, + 0 + ], + [ + 82080, + 3, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 82560, + 4, + 0 + ], + [ + 82800, + 4, + 0 + ], + [ + 83040, + 4, + 0 + ], + [ + 83280, + 5, + 0 + ], + [ + 83400, + 7, + 0 + ], + [ + 83520, + 5, + 0 + ], + [ + 83760, + 5, + 0 + ], + [ + 84000, + 6, + 360 + ], + [ + 82560, + 1, + 360 + ], + [ + 83280, + 2, + 360 + ], + [ + 84000, + 0, + 360 + ], + [ + 82680, + 6, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 85440, + 6, + 0 + ], + [ + 85560, + 4, + 0 + ], + [ + 86280, + 4, + 0 + ], + [ + 84720, + 7, + 0 + ], + [ + 84840, + 4, + 0 + ], + [ + 84960, + 7, + 0 + ], + [ + 85080, + 5, + 0 + ], + [ + 85200, + 7, + 0 + ], + [ + 85320, + 4, + 0 + ], + [ + 85680, + 7, + 0 + ], + [ + 85800, + 4, + 0 + ], + [ + 85920, + 7, + 0 + ], + [ + 86040, + 5, + 0 + ], + [ + 86160, + 7, + 0 + ], + [ + 84480, + 6, + 120 + ], + [ + 85440, + 2, + 0 + ], + [ + 85560, + 0, + 0 + ], + [ + 86280, + 0, + 0 + ], + [ + 84720, + 3, + 0 + ], + [ + 84840, + 0, + 0 + ], + [ + 84960, + 3, + 0 + ], + [ + 85080, + 1, + 0 + ], + [ + 85200, + 3, + 0 + ], + [ + 85320, + 0, + 0 + ], + [ + 85680, + 3, + 0 + ], + [ + 85800, + 0, + 0 + ], + [ + 85920, + 3, + 0 + ], + [ + 86040, + 1, + 0 + ], + [ + 86160, + 3, + 0 + ], + [ + 84480, + 2, + 120 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 87360, + 6, + 0 + ], + [ + 87480, + 4, + 0 + ], + [ + 88200, + 4, + 0 + ], + [ + 86640, + 7, + 0 + ], + [ + 86760, + 4, + 0 + ], + [ + 86880, + 7, + 0 + ], + [ + 87000, + 5, + 0 + ], + [ + 87120, + 7, + 0 + ], + [ + 87240, + 4, + 0 + ], + [ + 87600, + 7, + 0 + ], + [ + 87720, + 4, + 0 + ], + [ + 87840, + 7, + 0 + ], + [ + 87960, + 5, + 0 + ], + [ + 88080, + 7, + 0 + ], + [ + 86400, + 6, + 120 + ], + [ + 87360, + 2, + 0 + ], + [ + 87480, + 0, + 0 + ], + [ + 88200, + 0, + 0 + ], + [ + 86640, + 3, + 0 + ], + [ + 86760, + 0, + 0 + ], + [ + 86880, + 3, + 0 + ], + [ + 87000, + 1, + 0 + ], + [ + 87120, + 3, + 0 + ], + [ + 87240, + 0, + 0 + ], + [ + 87600, + 3, + 0 + ], + [ + 87720, + 0, + 0 + ], + [ + 87840, + 3, + 0 + ], + [ + 87960, + 1, + 0 + ], + [ + 88080, + 3, + 0 + ], + [ + 86400, + 2, + 120 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 88320, + 2, + 840 + ], + [ + 89760, + 1, + 360 + ], + [ + 89760, + 0, + 0 + ], + [ + 88320, + 6, + 840 + ], + [ + 89760, + 5, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 90240, + 0, + 0 + ], + [ + 90360, + 3, + 0 + ], + [ + 90480, + 0, + 0 + ], + [ + 90720, + 0, + 0 + ], + [ + 90960, + 1, + 0 + ], + [ + 91080, + 3, + 0 + ], + [ + 91200, + 1, + 0 + ], + [ + 91440, + 1, + 0 + ], + [ + 91680, + 2, + 360 + ], + [ + 91680, + 3, + 0 + ], + [ + 90720, + 4, + 0 + ], + [ + 91440, + 6, + 0 + ], + [ + 90240, + 4, + 240 + ], + [ + 90960, + 6, + 240 + ], + [ + 91680, + 5, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 93120, + 2, + 0 + ], + [ + 93240, + 0, + 0 + ], + [ + 93960, + 0, + 0 + ], + [ + 92400, + 3, + 0 + ], + [ + 92520, + 0, + 0 + ], + [ + 92640, + 3, + 0 + ], + [ + 92760, + 1, + 0 + ], + [ + 92880, + 3, + 0 + ], + [ + 93000, + 0, + 0 + ], + [ + 93360, + 3, + 0 + ], + [ + 93480, + 0, + 0 + ], + [ + 93600, + 3, + 0 + ], + [ + 93720, + 1, + 0 + ], + [ + 93840, + 3, + 0 + ], + [ + 92160, + 2, + 120 + ], + [ + 92160, + 6, + 360 + ], + [ + 92640, + 4, + 360 + ], + [ + 93120, + 7, + 360 + ], + [ + 93600, + 4, + 360 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 95040, + 2, + 0 + ], + [ + 95160, + 0, + 0 + ], + [ + 94320, + 3, + 0 + ], + [ + 94440, + 0, + 0 + ], + [ + 94680, + 1, + 0 + ], + [ + 94800, + 3, + 0 + ], + [ + 94920, + 0, + 0 + ], + [ + 94080, + 2, + 120 + ], + [ + 94080, + 6, + 360 + ], + [ + 95640, + 5, + 0 + ], + [ + 95880, + 5, + 0 + ], + [ + 95880, + 1, + 0 + ], + [ + 95760, + 0, + 0 + ], + [ + 95640, + 1, + 0 + ], + [ + 95520, + 4, + 0 + ], + [ + 95760, + 4, + 0 + ], + [ + 95040, + 7, + 360 + ], + [ + 94560, + 3, + 0 + ], + [ + 94560, + 4, + 360 + ], + [ + 95280, + 3, + 0 + ], + [ + 95520, + 0, + 0 + ], + [ + 95400, + 2, + 0 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [ + [ + 96000, + 6, + 840 + ], + [ + 96000, + 2, + 720 + ] + ], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": false + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 150, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "typeOfSection": 0, + "sectionNotes": [], + "sectionBeats": 4, + "altAnim": false, + "gfSection": false, + "bpm": 125, + "changeBPM": false, + "mustHitSection": true + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "sectionBeats": 4, + "sectionNotes": [], + "typeOfSection": 0, + "gfSection": false, + "altAnim": false, + "mustHitSection": true, + "changeBPM": false, + "bpm": 125 + }, + { + "gfSection": false, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 125, + "sectionBeats": 4, + "changeBPM": false, + "mustHitSection": true + }, + { + "gfSection": false, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 125, + "sectionBeats": 4, + "changeBPM": false, + "mustHitSection": true + }, + { + "gfSection": false, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 125, + "sectionBeats": 4, + "changeBPM": false, + "mustHitSection": true + }, + { + "gfSection": false, + "altAnim": false, + "typeOfSection": 0, + "sectionNotes": [], + "bpm": 125, + "sectionBeats": 4, + "changeBPM": false, + "mustHitSection": true + } + ], + "gfVersion": "gf-car", + "song": "High Erect", + "needsVoices": true, + "stage": "limo", + "validScore": true, + "bpm": 125, + "speed": 2.4 + } +} \ No newline at end of file diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..ae2b7d3 --- /dev/null +++ b/main.lua @@ -0,0 +1,53 @@ +local Height = 0 +local Width = 0 + +local myMath = require("modules.math") +local myTypes = require("modules.types") +local conductor = require("modules.conductor") +local json = require("modules.json") +local files = require("modules.files") +local socket = require("socket") + +local newVector2 = myTypes.Vector2(10, 10) + +local startTime = socket.gettime() + +local songName = "high" +local songDifficulty = "erect" + +local chartString = files.read_file(string.format("charts/%s/%s-%s.json", songName, songName, songDifficulty)) + +print(chartString) +local chart = json.parse(chartString).song + +local inst = love.audio.newSource(string.format("songs/%s/Inst.ogg", chart.song), "stream") +local voices = love.audio.newSource(string.format("songs/%s/Voices.ogg", chart.song), "stream") + +conductor:setBpm(chart.bpm) +conductor:mapBpmChanges(chart) + +inst:play() +voices:play() + +local step = 0 +local beat = 0 + + +function love.draw() + local currentTime = socket.gettime() + local elapsed = math.floor((currentTime - startTime) * 1000) + + local oldStep = step + local oldBeat = beat + + step = conductor:getStepRounded(elapsed) + beat = conductor:getBeatRounded(elapsed) + + if step ~= oldStep then + print("Step", step) + end + + if beat ~= oldBeat then + print("Beat", beat) + end +end \ No newline at end of file diff --git a/modules/conductor.lua b/modules/conductor.lua new file mode 100644 index 0000000..317dde5 --- /dev/null +++ b/modules/conductor.lua @@ -0,0 +1,98 @@ +local myMath = require("modules.math") +local logging = require("modules.logging") + +local conductor = {} +conductor.bpm = 120 +conductor.crochet = 1000 +conductor.stepCrochet = conductor.crochet/4 +conductor.songPosition = 0 + +conductor.bpmChangeMap = {} + +function conductor:getBPMFromSeconds(time) + local lastChange = { + stepTime = 0, + songTime = 0, + bpm = self.bpm, + stepCrochet = self.stepCrochet + } + + for _, change in next, self.bpmChangeMap do + if change.songTime > lastChange.songTime then + lastChange = change + end + end + + return lastChange +end + +function conductor:calculateCrochet(bpm) + return (60/bpm) * 1000 +end + +function conductor:setBpm(newBpm) + self.bpm = newBpm + self.crochet = self:calculateCrochet(newBpm) + self.stepCrochet = self.crochet / 4 +end + +function conductor:getStep(time) + local lastChange = self:getBPMFromSeconds(time) + + return lastChange.stepTime + (time - lastChange.songTime) / lastChange.stepCrochet +end + +function conductor:getStepRounded(time) + local lastChange = self:getBPMFromSeconds(time) + + return math.floor(lastChange.stepTime + math.floor(time - lastChange.songTime) / lastChange.stepCrochet) +end + +function conductor:getBeat(time) + return self:getStep(time) / 4 +end + +function conductor:getBeatRounded(time) + return math.floor(self:getStep(time) / 4) +end + +function conductor:getSectionBeats(song, section) + local beats = nil + if song["notes"][section] then + beats = song["notes"][section]["sectionBeats"] + end + return beats or 4 +end + +function conductor:mapBpmChanges(song) + print(logging.dump(song)) + + local curBPM = song["bpm"] + local totalSteps = 0 + local totalPos = 0 + + + + for index, section in next, song["notes"] do + if section["changeBPM"] then + curBPM = section["bpm"] + + local change = { + stepTime = totalSteps, + songTime = totalPos, + bpm = curBPM, + stepCrochet = self:calculateCrochet(curBPM)/4 + } + + table.insert(self.bpmChangeMap, change) + end + + local deltaSteps = myMath.round(self:getSectionBeats(song, index) * 4) + totalSteps = totalSteps + deltaSteps + totalPos = (totalPos + (60/curBPM) * 1000 / 4) * deltaSteps + end + + print("Mapped the song BPM changes.") +end + +return conductor \ No newline at end of file diff --git a/modules/files.lua b/modules/files.lua new file mode 100644 index 0000000..f40afd4 --- /dev/null +++ b/modules/files.lua @@ -0,0 +1,13 @@ +local files = {} + +local open = io.open + +function files.read_file(path) + local file = open(path, "rb") -- r read mode and b binary mode + if not file then return nil end + local content = file:read "*a" -- *a or *all reads the whole file + file:close() + return content +end + +return files \ No newline at end of file diff --git a/modules/json.lua b/modules/json.lua new file mode 100644 index 0000000..50610de --- /dev/null +++ b/modules/json.lua @@ -0,0 +1,194 @@ +--[[ json.lua + +A compact pure-Lua JSON library. +The main functions are: json.stringify, json.parse. + +## json.stringify: + +This expects the following to be true of any tables being encoded: + * They only have string or number keys. Number keys must be represented as + strings in json; this is part of the json spec. + * They are not recursive. Such a structure cannot be specified in json. + +A Lua table is considered to be an array if and only if its set of keys is a +consecutive sequence of positive integers starting at 1. Arrays are encoded like +so: `[2, 3, false, "hi"]`. Any other type of Lua table is encoded as a json +object, encoded like so: `{"key1": 2, "key2": false}`. + +Because the Lua nil value cannot be a key, and as a table value is considerd +equivalent to a missing key, there is no way to express the json "null" value in +a Lua table. The only way this will output "null" is if your entire input obj is +nil itself. + +An empty Lua table, {}, could be considered either a json object or array - +it's an ambiguous edge case. We choose to treat this as an object as it is the +more general type. + +To be clear, none of the above considerations is a limitation of this code. +Rather, it is what we get when we completely observe the json specification for +as arbitrary a Lua object as json is capable of expressing. + +## json.parse: + +This function parses json, with the exception that it does not pay attention to +\u-escaped unicode code points in strings. + +It is difficult for Lua to return null as a value. In order to prevent the loss +of keys with a null value in a json string, this function uses the one-off +table value json.null (which is just an empty table) to indicate null values. +This way you can check if a value is null with the conditional +`val == json.null`. + +If you have control over the data and are using Lua, I would recommend just +avoiding null values in your data to begin with. + +--]] + + +local json = {} + + +-- Internal functions. + +local function kind_of(obj) + if type(obj) ~= 'table' then return type(obj) end + local i = 1 + for _ in pairs(obj) do + if obj[i] ~= nil then i = i + 1 else return 'table' end + end + if i == 1 then return 'table' else return 'array' end +end + +local function escape_str(s) + local in_char = {'\\', '"', '/', '\b', '\f', '\n', '\r', '\t'} + local out_char = {'\\', '"', '/', 'b', 'f', 'n', 'r', 't'} + for i, c in ipairs(in_char) do + s = s:gsub(c, '\\' .. out_char[i]) + end + return s +end + +-- Returns pos, did_find; there are two cases: +-- 1. Delimiter found: pos = pos after leading space + delim; did_find = true. +-- 2. Delimiter not found: pos = pos after leading space; did_find = false. +-- This throws an error if err_if_missing is true and the delim is not found. +local function skip_delim(str, pos, delim, err_if_missing) + pos = pos + #str:match('^%s*', pos) + if str:sub(pos, pos) ~= delim then + if err_if_missing then + error('Expected ' .. delim .. ' near position ' .. pos) + end + return pos, false + end + return pos + 1, true +end + +-- Expects the given pos to be the first character after the opening quote. +-- Returns val, pos; the returned pos is after the closing quote character. +local function parse_str_val(str, pos, val) + val = val or '' + local early_end_error = 'End of input found while parsing string.' + if pos > #str then error(early_end_error) end + local c = str:sub(pos, pos) + if c == '"' then return val, pos + 1 end + if c ~= '\\' then return parse_str_val(str, pos + 1, val .. c) end + -- We must have a \ character. + local esc_map = {b = '\b', f = '\f', n = '\n', r = '\r', t = '\t'} + local nextc = str:sub(pos + 1, pos + 1) + if not nextc then error(early_end_error) end + return parse_str_val(str, pos + 2, val .. (esc_map[nextc] or nextc)) +end + +-- Returns val, pos; the returned pos is after the number's final character. +local function parse_num_val(str, pos) + local num_str = str:match('^-?%d+%.?%d*[eE]?[+-]?%d*', pos) + local val = tonumber(num_str) + if not val then error('Error parsing number at position ' .. pos .. '.') end + return val, pos + #num_str +end + + +-- Public values and functions. + +function json.stringify(obj, as_key) + local s = {} -- We'll build the string as an array of strings to be concatenated. + local kind = kind_of(obj) -- This is 'array' if it's an array or type(obj) otherwise. + if kind == 'array' then + if as_key then error('Can\'t encode array as key.') end + s[#s + 1] = '[' + for i, val in ipairs(obj) do + if i > 1 then s[#s + 1] = ', ' end + s[#s + 1] = json.stringify(val) + end + s[#s + 1] = ']' + elseif kind == 'table' then + if as_key then error('Can\'t encode table as key.') end + s[#s + 1] = '{' + for k, v in pairs(obj) do + if #s > 1 then s[#s + 1] = ', ' end + s[#s + 1] = json.stringify(k, true) + s[#s + 1] = ':' + s[#s + 1] = json.stringify(v) + end + s[#s + 1] = '}' + elseif kind == 'string' then + return '"' .. escape_str(obj) .. '"' + elseif kind == 'number' then + if as_key then return '"' .. tostring(obj) .. '"' end + return tostring(obj) + elseif kind == 'boolean' then + return tostring(obj) + elseif kind == 'nil' then + return 'null' + else + error('Unjsonifiable type: ' .. kind .. '.') + end + return table.concat(s) +end + +json.null = {} -- This is a one-off table to represent the null value. + +function json.parse(str, pos, end_delim) + pos = pos or 1 + if pos > #str then error('Reached unexpected end of input.') end + local pos = pos + #str:match('^%s*', pos) -- Skip whitespace. + local first = str:sub(pos, pos) + if first == '{' then -- Parse an object. + local obj, key, delim_found = {}, true, true + pos = pos + 1 + while true do + key, pos = json.parse(str, pos, '}') + if key == nil then return obj, pos end + if not delim_found then error('Comma missing between object items.') end + pos = skip_delim(str, pos, ':', true) -- true -> error if missing. + obj[key], pos = json.parse(str, pos) + pos, delim_found = skip_delim(str, pos, ',') + end + elseif first == '[' then -- Parse an array. + local arr, val, delim_found = {}, true, true + pos = pos + 1 + while true do + val, pos = json.parse(str, pos, ']') + if val == nil then return arr, pos end + if not delim_found then error('Comma missing between array items.') end + arr[#arr + 1] = val + pos, delim_found = skip_delim(str, pos, ',') + end + elseif first == '"' then -- Parse a string. + return parse_str_val(str, pos + 1) + elseif first == '-' or first:match('%d') then -- Parse a number. + return parse_num_val(str, pos) + elseif first == end_delim then -- End of an object or array. + return nil, pos + 1 + else -- Parse true, false, or null. + local literals = {['true'] = true, ['false'] = false, ['null'] = json.null} + for lit_str, lit_val in pairs(literals) do + local lit_end = pos + #lit_str - 1 + if str:sub(pos, lit_end) == lit_str then return lit_val, lit_end + 1 end + end + local pos_info_str = 'position ' .. pos .. ': ' .. str:sub(pos, pos + 10) + error('Invalid json syntax starting at ' .. pos_info_str) + end +end + +return json diff --git a/modules/logging.lua b/modules/logging.lua new file mode 100644 index 0000000..cd74f2a --- /dev/null +++ b/modules/logging.lua @@ -0,0 +1,16 @@ +local logging = {} + +function logging.dump(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. logging.dump(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end +end + +return logging \ No newline at end of file diff --git a/modules/math.lua b/modules/math.lua new file mode 100644 index 0000000..87f1029 --- /dev/null +++ b/modules/math.lua @@ -0,0 +1,11 @@ +local module = {} + +function module.lerp(a, b,c) + return a + (b - a) * c +end + +function module.round(a) + return math.floor(a + .5) +end + +return module \ No newline at end of file diff --git a/modules/types.lua b/modules/types.lua new file mode 100644 index 0000000..90fea1c --- /dev/null +++ b/modules/types.lua @@ -0,0 +1,20 @@ +local module = {} + +local myMath = require("modules.math") + +local Vector2 = {} +Vector2.__index = Vector2 + +function Vector2:Lerp(newVector2, position) + return module.Vector2(myMath.lerp(self.x, newVector2.x, position), myMath.lerp(self.x, newVector2.x, position)) +end + +function Vector2:Get() + return self.x, self.y +end + +function module.Vector2(x, y) + return setmetatable({x = x, y = y}, Vector2) +end + +return module \ No newline at end of file diff --git a/songs/High Erect/Inst.ogg b/songs/High Erect/Inst.ogg new file mode 100644 index 0000000..8f34a71 Binary files /dev/null and b/songs/High Erect/Inst.ogg differ diff --git a/songs/High Erect/Voices.ogg b/songs/High Erect/Voices.ogg new file mode 100644 index 0000000..6c9ab21 Binary files /dev/null and b/songs/High Erect/Voices.ogg differ