From 7a87caa42b35f213e9021265e3bc41f957633009 Mon Sep 17 00:00:00 2001 From: stevenhowes <38082088+stevenhowes@users.noreply.github.com> Date: Sat, 3 Apr 2021 23:16:46 +0100 Subject: [PATCH] Load and save of binary audio Format in h/Sound --- !TheEsc/!RunImage,ff8 | Bin 20528 -> 18828 bytes !TheEsc/c/Intro | 53 ++---------------------------------------- !TheEsc/c/Mission1 | 39 ++++--------------------------- !TheEsc/c/Mission2 | 37 +++-------------------------- !TheEsc/c/Sound | 42 +++++++++++++++++++++++++++++++-- !TheEsc/cmpagrac,ffd | Bin 0 -> 1024 bytes !TheEsc/cmpintro,ffd | Bin 0 -> 1024 bytes !TheEsc/comp,ffd | Bin 0 -> 1024 bytes !TheEsc/h/Sound | 1 + 9 files changed, 51 insertions(+), 121 deletions(-) create mode 100644 !TheEsc/cmpagrac,ffd create mode 100644 !TheEsc/cmpintro,ffd create mode 100644 !TheEsc/comp,ffd diff --git a/!TheEsc/!RunImage,ff8 b/!TheEsc/!RunImage,ff8 index 2190d43e826d78b637b074e7c69a99a8db2a3f56..98f1bbf29b6d84916a13f66888e4e2ea8ad37285 100644 GIT binary patch delta 4318 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 delta 6127 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 diff --git a/!TheEsc/c/Intro b/!TheEsc/c/Intro index a32a322..6b32551 100644 --- a/!TheEsc/c/Intro +++ b/!TheEsc/c/Intro @@ -14,58 +14,9 @@ void intro() sound_set_voice(3,"WaveSynth-Beep"); sound_set_voice(4,"WaveSynth-Beep"); sound_composition_init(); - - // DUn, dun, daan duhhn - sound_composition_element_add(currentstart,1,sound_note("A4#"),200); - sound_composition_element_add(currentstart,2,sound_note("A5#"),200); - currentstart += 200; - sound_composition_element_add(currentstart,3,sound_note("F3"),200); - sound_composition_element_add(currentstart,4,sound_note("F4"),200); - currentstart += 200; - sound_composition_element_add(currentstart,1,sound_note("G3#"),200); - sound_composition_element_add(currentstart,2,sound_note("G4#"),200); - currentstart += 200; - sound_composition_element_add(currentstart,3,sound_note("C3"),200); - sound_composition_element_add(currentstart,4,sound_note("C4"),200); - currentstart += 200; - - // DUn, dun, daan duhhn - sound_composition_element_add(currentstart,1,sound_note("A3#"),200); - sound_composition_element_add(currentstart,2,sound_note("A4#"),200); - currentstart += 200; - sound_composition_element_add(currentstart,3,sound_note("F2"),200); - currentstart += 200; - sound_composition_element_add(currentstart,4,sound_note("G2#"),200); - currentstart += 200; - sound_composition_element_add(currentstart,1,sound_note("C2"),200); - currentstart += 200; - - // Duh - sound_composition_element_add(currentstart,2,sound_note("A3#"),400); - sound_composition_element_add(currentstart,3,sound_note("A2#"),400); - currentstart += 250; - - // Dun De Da - sound_composition_element_add(currentstart,1,sound_note("F1"),20); - currentstart += 50; - sound_composition_element_add(currentstart,4,sound_note("A2#"),5); - currentstart += 20; - sound_composition_element_add(currentstart,2,sound_note("D2#"),200); - currentstart += 180; - - - sound_composition_element_add(currentstart,3,sound_note("D2"),50); - currentstart += 50; - sound_composition_element_add(currentstart,1,sound_note("A2#"),30); - currentstart += 30; - sound_composition_element_add(currentstart,2,sound_note("G1"),50); - currentstart += 50; - sound_composition_element_add(currentstart,5,sound_note("C2"),50); - currentstart += 50; - sound_composition_element_add(currentstart,3,sound_note("A2#"),100); - sound_composition_element_add(currentstart,1,sound_note("F2"),100); - currentstart += 100; + sound_composition_load("cmpintro"); + tick = clock(); sound_composition_start(clock()); diff --git a/!TheEsc/c/Mission1 b/!TheEsc/c/Mission1 index 0bb1317..b96c6f5 100644 --- a/!TheEsc/c/Mission1 +++ b/!TheEsc/c/Mission1 @@ -8,6 +8,8 @@ //#defene PROFILE(X) lastprofile = clock(); X; printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t%s %i\n", #X, (clock() - lastprofile)) #define PROFILE(X) X +extern sound_composition_save(char *filename); +extern sound_composition_load(char *filename); enum sprite_e{player_ship, durno_ship, ship_trgt, durno_ship2, ship2_trgt, player_shipl,player_shipr,explode_start,explode_shp2,explode_shp3,explode_end,photon1,photon2,plasma1,plasma2}; char *sprites[] = {"player_ship","durno_ship","ship_trgt","durno_ship2","ship2_trgt","player_shipl","player_shipr","explode_shp1","explode_shp2","explode_shp3","explode_shp4","photon1","photon2","plasma1","plasma2"}; @@ -842,40 +844,9 @@ void game1_death() sound_set_voice(3,"WaveSynth-Beep"); sound_set_voice(4,"WaveSynth-Beep"); sound_composition_init(); - - currentstart += 100; - sound_composition_element_add(currentstart,1,sound_note("D2"),150); - currentstart += 100; - sound_composition_element_add(currentstart,2,sound_note("G2"),200); - currentstart += 200; - sound_composition_element_add(currentstart,3,sound_note("B3"),75); - currentstart += 40; - sound_composition_element_add(currentstart,4,sound_note("G2"),75); - currentstart += 50; - sound_composition_element_add(currentstart,2,sound_note("B3"),200); - currentstart += 200; - sound_composition_element_add(currentstart,1,sound_note("A3"),100); - currentstart += 100; - sound_composition_element_add(currentstart,3,sound_note("G2"),150); - currentstart += 150; - sound_composition_element_add(currentstart,2,sound_note("E2"),100); - currentstart += 100; - sound_composition_element_add(currentstart,1,sound_note("D2"),150); - currentstart += 150; - sound_composition_element_add(currentstart,3,sound_note("D2"),150); - currentstart += 100; - sound_composition_element_add(currentstart,4,sound_note("G2"),150); - currentstart += 150; - sound_composition_element_add(currentstart,1,sound_note("B3"),75); - currentstart += 40; - sound_composition_element_add(currentstart,2,sound_note("G2"),75); - currentstart += 40; - sound_composition_element_add(currentstart,3,sound_note("B3"),150); - currentstart += 150; - sound_composition_element_add(currentstart,4,sound_note("A3"),130); - currentstart += 100; - sound_composition_element_add(currentstart,1,sound_note("G2"),200); - currentstart += 300; + + sound_composition_load("cmpagrac"); + tick = clock(); sound_composition_start(clock()); diff --git a/!TheEsc/c/Mission2 b/!TheEsc/c/Mission2 index a729141..0cdd61c 100644 --- a/!TheEsc/c/Mission2 +++ b/!TheEsc/c/Mission2 @@ -74,40 +74,9 @@ void game2_death() sound_set_voice(3,"WaveSynth-Beep"); sound_set_voice(4,"WaveSynth-Beep"); sound_composition_init(); - - currentstart += 100; - sound_composition_element_add(currentstart,1,sound_note("D2"),150); - currentstart += 100; - sound_composition_element_add(currentstart,2,sound_note("G2"),200); - currentstart += 200; - sound_composition_element_add(currentstart,3,sound_note("B3"),75); - currentstart += 40; - sound_composition_element_add(currentstart,4,sound_note("G2"),75); - currentstart += 50; - sound_composition_element_add(currentstart,2,sound_note("B3"),200); - currentstart += 200; - sound_composition_element_add(currentstart,1,sound_note("A3"),100); - currentstart += 100; - sound_composition_element_add(currentstart,3,sound_note("G2"),150); - currentstart += 150; - sound_composition_element_add(currentstart,2,sound_note("E2"),100); - currentstart += 100; - sound_composition_element_add(currentstart,1,sound_note("D2"),150); - currentstart += 150; - sound_composition_element_add(currentstart,3,sound_note("D2"),150); - currentstart += 100; - sound_composition_element_add(currentstart,4,sound_note("G2"),150); - currentstart += 150; - sound_composition_element_add(currentstart,1,sound_note("B3"),75); - currentstart += 40; - sound_composition_element_add(currentstart,2,sound_note("G2"),75); - currentstart += 40; - sound_composition_element_add(currentstart,3,sound_note("B3"),150); - currentstart += 150; - sound_composition_element_add(currentstart,4,sound_note("A3"),130); - currentstart += 100; - sound_composition_element_add(currentstart,1,sound_note("G2"),200); - currentstart += 300; + + sound_composition_load("cmpagrac"); + tick = clock(); sound_composition_start(clock()); diff --git a/!TheEsc/c/Sound b/!TheEsc/c/Sound index 84dacc6..9def5ea 100644 --- a/!TheEsc/c/Sound +++ b/!TheEsc/c/Sound @@ -21,6 +21,35 @@ void sound_on() _kernel_swi(Sound_Enable,&inreg,&outreg); } +void sound_composition_load(char* filename) +{ + int length; + + // Attempt to get file info + inreg.r[0] = 13; + inreg.r[1] = (int) filename; + _kernel_swi(OS_File,&inreg,&outreg); + + // Length will be in R4 if it exists + length = outreg.r[4]; + + if(length > sizeof(composition)) + { + screen_nobuffer(); + printf("Composition exceeds %d bytes (%d bytes)",sizeof(composition),length); + exit(0); + } + + // Attempt to get file info + inreg.r[0] = 16; + inreg.r[1] = (int) filename; + inreg.r[2] = (int) composition; + inreg.r[3] = 0; + + _kernel_swi(OS_File,&inreg,&outreg); + +} + void sound_voices(int num) { inreg.r[0] = num; @@ -73,6 +102,17 @@ void sound_composition_element_add(int start, int channel, int note, int length) composition[current_element].Length = length; current_element++; } +void sound_composition_save(char *filename) +{ + // Attempt to get file info + inreg.r[0] = 10; + inreg.r[1] = (int) filename; + inreg.r[2] = 0xffd; + inreg.r[4] = (int) composition; + inreg.r[5] = (int) composition+(sizeof(composition[0]) * COMPOSITION_MAX); + + _kernel_swi(OS_File,&inreg,&outreg); +} void sound_composition_debug() { @@ -93,8 +133,6 @@ void sound_composition_debug() ); } } - - printf("%i elements at %i bytes each\n",current_element,sizeof(composition[0])); printf("------------------------------\n"); } diff --git a/!TheEsc/cmpagrac,ffd b/!TheEsc/cmpagrac,ffd new file mode 100644 index 0000000000000000000000000000000000000000..4fe45cc6c1d2f261ad7d2d84cafa2454c12e0ab2 GIT binary patch literal 1024 zcmYdcu>Ho!Fpc2^L*O?iAUT0C@f$OPH^UCbz;7%-`W28565qrW2~?NDAjTXBl%K}1 zhS?P;p28r&0@1$=NQ1<=SV8)xF)UzB1giIDI057{0qGAwK1jZeEfOf-#PEtO5Ga3w z;s1YKAfFXTJA&=`{~u(I5m=m&K@LbO0>wdm({HR$ab}>s|Nnb}-ShuH0~n0bqu~Gw Lfzfn8S~>s#hiVaC literal 0 HcmV?d00001 diff --git a/!TheEsc/cmpintro,ffd b/!TheEsc/cmpintro,ffd new file mode 100644 index 0000000000000000000000000000000000000000..fd955a49428a5f9a97d4662d406c00e232a60722 GIT binary patch literal 1024 zcmZQz=>5jXaDst>VedC4AboUvh#`$b7bq{s(88ez6gOhn#$o!66-d7TiZe5$0BKL4d5jXaDst>VedC4AboUvh#`$b7bq{s(88ez6gOhn#$o!66-d7TiZe5$0BKL4d