Кастомный чиптюн
Помню, как в детстве с восхищением смотрел на динамик в колонке, чудесным образом воспроизводящий музыку/звуки с помощью колебаний картонной мембраны. Сейчас решил сделать в игре собственный синтезатор в реальном времени.
Никакой записанной заранее музыки. Все должно генерироваться на лету. Захотелось попробовать сделать 100% контроль над звуковой волной. По сути, сделать формулу, в которую передаешь текущее время, а она возвращает позицию картонки мембраны динамика.
Сделал)) Вот на SoundCloud музыка для главного меню игры. Как вам?
Исходный код музыки (на встроенном языке Sandbasix):
10 // ***********************************
20 // *** SPETROMSX Main Menu Theme ***
30 // *** by Andrey Fomin ***
40 // ***********************************
50 //
60 // 0 - High Arpegio
70 TRACK:0 vol=6 sqr=5 oct=4
80 STEREO min=-8 max=5
90 LFGVOL per=16 min=10 max=15 bynote=true adsr=90,5,100,30
100 ARPEGIO steps=--0--1&2--3-4--5-6--0&3--2-1 shift=16 dur=8 mode=ext
110 DELAY:0 fading=40 time=8 count=2 pan=-5,5
120 // 1 - Mid Bass Arpegio
130 TRACK:1 vol=3 oct=3 sqr=10 adsr=1,30,30,20
140 LFGPAN:1 per=8 min=-12 max=0 bynote=true
150 LFGDUTY:1 per=0.125 min=0 max=8 bynote=false
160 ARPEGIO:1 steps=0-1--0-1-2-0-1-2----0--2 shift=16 dur=24 mode=ext
170 DELAY:1 fading=50 time=8 count=2 pan=10,-5
180 // 2 - Strings
190 TRACK:2 vol=6 oct=3 sqr=12 adsr=90,8,70,50
200 LFGVOL:2 per=16 min=8 max=15 bynote=true adsr=50,8,100,50
210 STEREO:2 min=0 max=12
220 // 3 - Bass
230 TRACK:3 vol=12 oct=1 sqr=4 duty=2 adsr=4,30,30,40
240 LFGPAN:3 per=8 min=-7 max=3 bynote=true
250 ARPEGIO:3 steps=0--0--0--0-0- shift=8 dur=8
260 // 4 - Drums
270 TRACK:4 vol=11
280 // 5 - Solo
290 TRACK:5 vol=3 sqr=10 oct=4 duty=2 adsr=10,50,50,10
300 LFGPAN:5 per=8 min=-10 max=10 bynote=true
310 DELAY:5 fading=75 time=8 count=4 pan=-13,13,-7,7
320 LFGSQR:5 per=8 min=0 max=15 bynote=true
330 //
340 // *** MAIN CHORDS ***
350 SET:A F#maj9| Bmaj9| Amaj9| Emaj9|
360 SET:a F#maj9| Bmaj9| Amaj9| Dmaj9|
370 SET:B Gm9| D#9| Cm11| D#mMaj7|
380 SET:C Am11| D7| Fmaj7| Cmaj7|
390 SET:D Fm9| D#maj9| Fm9| D#maj9|
400 // *** POWER CHORDS ***
410 SET:pA F#5| B5| A5| E5| F#5| B5| A5| D5|
420 SET:pB G5| D#5| C5| D#5| G5| D#5| C5| D#5|
430 SET:pC A5| D5| F5| C5| A5| D5| F5| C5|
440 SET:pD F5| D#5| F5| G5| F5| D#5| F5| G5|
450 // *** DRUMS ***
460 SET:d1 @*-%-%-*-!-$-*-^-%-*-_-*-!-*-%-$-
470 SET:d2 *-%-%-*-!-%-*-!-%*-^-!-*-!-_-%-$-
480 SET:d3 %*--$-*-%!--$*--%-*-$-*-%!-*-$--
490 SET:d4 *---*-!--*-*-^_-^_-!-~_-~_-!-*_-*_-
500 SET:d ?d1 ?d2 ?d1 ?d4 ?d1 ?d2 ?d3 ?d4
510 SET:e1 %*--$-%-!%--$-^-_-%-$--!%-%-$-%-
520 SET:e2 %*-*-$-%-!%--$-~-*-%-$--!%-%-$-%-
530 SET:e3 %*-*-$-%-!%--$-~-*-%-$-*-!%-%-!$-*%-
540 SET:e ?e1 ?e2 ?e1 ?e3
550 //
560 // *** PLAY ***
570 //
590 PLAY:1 ?pA :1
600 PLAY:4 R0.5 ?e1 ?e3 ?e
610 PLAY:0 R0.25 ?a
630 REWIND 1
640 PLAY:0 ?A ?a :2
650 PLAY:1 ?pA
660 PLAY:3 ?pA
670 PLAY:4 ?e ?e
690 REWIND 2
700 PLAY:0 ?B ?B :3
710 PLAY:2 v5 ?B ?B
720 PLAY:3 ?pB
730 PLAY:4 ?d
750 REWIND 3
760 PLAY:0 ?C ?C :4
770 PLAY:1 ?pC
780 PLAY:3 ?pC
790 PLAY:4 ?e ?e
810 REWIND 4
820 PLAY:0 ?D ?D :5
830 PLAY:2 v5 ?D ?D
840 PLAY:3 ?pD
850 PLAY:4 ?d
870 REWIND 5
880 PLAY:2 v5 ?A ?a
890 PLAY:3 ?pA
900 PLAY:5 A#8 F>4 F>4 C#>4 F>8 D#>8 R2 R4 R8 C#>4 R8 G#4 R4 R8 B4 R8 D#4 R4 R8 F
910 LOOP