diff --git a/asoft_sound/asoft_sound.c b/asoft_sound/asoft_sound.c index c5b38997..dfb3de17 100644 --- a/asoft_sound/asoft_sound.c +++ b/asoft_sound/asoft_sound.c @@ -1,14 +1,236 @@ #include +#include + +static int line=0; + + +static int get_freq(int note, int octave, int flat, int sharp) { + + if (octave==0) { + + switch(note) { + case 'A': + if (sharp) return 143; + if (flat) return 161; + return 152; + case 'B': + if (flat) return 143; + return 135; + case 'C': + if (sharp) return 241; + return 255; + case 'D': + if (sharp) return 214; + if (flat) return 241; + return 227; + case 'E': + if (flat) return 214; + return 202; + case 'F': + if (sharp) return 180; + return 191; + case 'G': + if (sharp) return 161; + if (flat) return 180; + return 170; + default: fprintf(stderr,"Unknown note %c Line %d\n", + note,line); + } + + } else + + if (octave==1) { + + switch(note) { + case 'A': + if (sharp) return 72; + if (flat) return 81; + return 76; + case 'B': + if (flat) return 72; + return 68; + case 'C': + if (sharp) return 121; + return 128; + case 'D': + if (sharp) return 108; + if (flat) return 121; + return 114; + case 'E': + if (flat) return 108; + return 102; + case 'F': + if (sharp) return 91; + return 96; + case 'G': + if (sharp) return 81; + if (flat) return 91; + return 85; + default: fprintf(stderr,"Unknown note %c\n",note); + } + } else + + if (octave==2) { + + switch(note) { + case 'A': + if (sharp) return 36; + if (flat) return 40; + return 38; + case 'B': + if (flat) return 36; + return 34; + case 'C': + if (sharp) return 60; + return 64; + case 'D': + if (sharp) return 54; + if (flat) return 60; + return 57; + case 'E': + if (flat) return 54; + return 51; + case 'F': + if (sharp) return 45; + return 48; + case 'G': + if (sharp) return 40; + if (flat) return 45; + return 43; + default: fprintf(stderr,"Unknown note %c\n",note); + } + + } else { + fprintf(stderr,"Unknown octave %d!\n",octave); + } + + return 0; +} + +static int get_duration(int length) { + + int d=0; + + if (length==2) { + d=216; + } else if (length==4) { + d=108; + } else if (length==8) { + d=54; + } else if (length==16) { + d=27; + } else if (length==3) { + d=162; + } else { + fprintf(stderr,"Unknown duration %d Line %d\n",length,line); + } + + return d; +} + +static int get_rest(int length) { + + int rest=0; + + switch(length) { + case 1: rest=128; break; + case 2: rest=64; break; + case 4: rest=32; break; + case 8: rest=16; break; + case 16: rest=8; break; + default: fprintf(stderr,"Unknown rest length %d Line %d!\n", + length,line); + } + + return rest*5; +} int main(int argc, char **argv) { char string[BUFSIZ]; char *result; + int basic_line=100; + int i; + int length=8,last_length=0,duration; + int rest_length,sharp,flat; + int octave=1; + int freq; + int note; + + /* Routine from http://eightbitsoundandfury.ld8.org/programming.html */ + printf("50 FOR L = 770 TO 790: READ V: POKE L,V: NEXT L\n"); + printf("51 DATA 173,48,192,136,208,5,206,1,3,240,9\n"); + printf("52 DATA 202,208,245,174,0,3,76,2,3,96\n"); + printf("53 GOTO 100\n"); + printf("90 POKE 768,F:POKE 769,D:CALL 770:RETURN\n"); while(1) { result=fgets(string,BUFSIZ,stdin); + line++; if (result==NULL) break; - printf("%s",result); + + if (string[0]=='\'') continue; + + i=0; + while(1) { + + if (string[i]=='\n') break; + if (string[i]=='\0') break; + if ((string[i]==' ') || (string[i]=='\t')) { + i++; + continue; + } + + if (string[i]=='<') { + octave--; + } + else if (string[i]=='>') { + octave++; + } + else if (string[i]=='L') { + i++; + length=string[i]-'0'; + if ((length==1) && (string[i+1]=='6')) { + length=16; + i++; + } + } + else if (string[i]=='R') { + i++; + rest_length=get_rest(string[i]-'0'); + printf("%d FOR I=1 TO %d: NEXT I\n", + basic_line,rest_length); + basic_line++; + } + else if ((string[i]>='A') && (string[i]<='G')) { + sharp=0; flat=0; + note=string[i]; + if (string[i+1]=='#') { + sharp=1; + i++; + } + if (string[i+1]=='-') { + flat=1; + i++; + } + printf("%d ",basic_line); + if (length!=last_length) { + duration=get_duration(length); + printf("D=%d:",duration); + last_length=length; + } + + freq=get_freq(note,octave,flat,sharp); + + printf("F=%d:GOSUB 90\n",freq); + basic_line++; + } + else { + fprintf(stderr,"Unknown char %c\n",string[i]); + } + i++; + + } } return 0; diff --git a/glados3.3/Makefile b/glados3.3/Makefile index 55551bd4..f2ac39c0 100644 --- a/glados3.3/Makefile +++ b/glados3.3/Makefile @@ -1,7 +1,7 @@ DOS33 = ../dos33fs-utils/dos33 TXT2BAS = ../asoft_basic-utils/tokenize_asoft SHAPETABLE = ../hgr-utils/shape_table - +SOUNDCONVERT = ../asoft_sound/asoft_sound all: glados33.dsk @@ -17,11 +17,19 @@ shape_test.bas: objects.shape SHAPE_TEST.BAS: shape_test.bas $(TXT2BAS) < shape_test.bas > SHAPE_TEST.BAS -glados33.dsk: STILL_ALIVE.BAS OBJECTS.SHAPE SHAPE_TEST.BAS +sound_test.bas: still_alive.notes + $(SOUNDCONVERT) < still_alive.notes > sound_test.bas + +SOUND_TEST.BAS: sound_test.bas + + $(TXT2BAS) < sound_test.bas > SOUND_TEST.BAS + +glados33.dsk: STILL_ALIVE.BAS OBJECTS.SHAPE SHAPE_TEST.BAS SOUND_TEST.BAS $(DOS33) -y glados33.dsk SAVE A STILL_ALIVE.BAS $(DOS33) -y glados33.dsk SAVE B OBJECTS.SHAPE $(DOS33) -y glados33.dsk SAVE A SHAPE_TEST.BAS + $(DOS33) -y glados33.dsk SAVE A SOUND_TEST.BAS clean: - rm -f *~ *.BAS *.SHAPE *.lst + rm -f *~ *.BAS *.SHAPE sound_test.bas shape_test.bas *.lst diff --git a/glados3.3/still_alive.notes b/glados3.3/still_alive.notes new file mode 100644 index 00000000..fbb8c138 --- /dev/null +++ b/glados3.3/still_alive.notes @@ -0,0 +1,80 @@ +' This was a triumph +L8 G F# E E F# R8 R4 R2 R4 R8 +' I'm making a note here, HUGE SUCCESS + L8 < A > G F# E L4 E L8 F# R4 L4 D L8 E < L4 A > R8 R4 R4 R8 +' It's hard to overstate my satisfaction +'L8 < A > L4 E L8 F# G L4 G L8 F# C# C# L3 D L4 E L8 < A A A > L4 F# R8 R2 R2 + L8 < A > L4 E L8 F# L3 G L8 F# L4 C# L3 D L4 E L8 < A L4 A> L4 F# R8 R2 R2 +' Aperture Science +L8 G F# E E F# R8 R4 R2 R4 R8 +' we do what we must because we can. +L8 < A > G F# E E R4 F# D R4 E < L3 A > R8 R4 R2 +' for the good of all of us except the ones who are dead. +L4 E L8 F# L3 G L8 E L3 C# L8 D E R8 < A > D E F E D C R4 +' But there's no sense crying over every mistake +L8 < A B- > L4 C F L8 E D D C D C L4 C C +' you just keep on trying till you run out of cake +L8 L4 C F L8 G F E D D E L4 F F +' and the Science gets done and you make a neat gun +L8 G A B- B- L4 A G L8 F G A A L4 G F +' for the people who are still alive. +L8 D C L8 D F F L4 E L8 E F# L3 F# R4 R2 R1 R1 R4 R8 +' I'm not even angry +' Note 8-16 and dotted 8 +L8 < A > G F# E E F# R4 R2 R2 +' I'm being so sincere right now +L8 G F# E L3 E L8 F# L4 D E < A > R8 R4 R2 +' even though you broke my heart and killed me. +L4 E L8 F# L3 G L4 E C# L8 D L3 E L8 < A L4 A > L8 F# R4 R2 R4 R8 +' and tore me to pieces + L8 < A > G F# E E F# R8 R4 R2 R4 R8 +' L8 C# B A G G A R8 R4 R2 R4 R8 +' and threw every piece into a fire +L8 < A > G F# E E R4 F# D R4 E < L4 A > R8 R4 R2 +' As they burned it hurt because +L4 E F# L3 G L4 E C# L8 D E R8 +' I was so happy for you +L8 < A > D E F E D C R4 +' Now these points of data make a beautiful line +L8 < A B- > L4 C F L8 E D D C D C L4 C C +' and we're out of beta, we're releasing on time. +L8 < A B- > L4 C F L8 G F E D D E L4 F F +' So I'm GLaD. I got burned. Think of all the things we learned +L8 G A B- B- L4 A G L8 F G A A G F L4 F +' for the people who are still alive +L8 D C D F F L4 E L8 E F# L3 F# R8 R2 R1 R1 R2 +' Go ahead and leave me +L8 G L16 F# F# L8 E L4 E L8 F# R4 R2 R4 R8 +' I think I'd prefer to stay inside +L8 < A > L8 G F# E E R4 L8 F# D R4 L8 E L4 < A > R8 R4 R2 +' Maybe you'll find someone else to help you. +L4 E L8 F# L3 G L4 E C# L8 D L3 E L8 < A L4 A> L8 F# R4 R2 R2 +' Maybe Black Mesa +L8 G F# E L4 E L8 F# R4 R2 R2 +' THAT WAS A JOKE, HA HA, FAT CHANCE +L8 G F# E E R4 F# D R4 E < L4 A > R8 R4 R2 +' Anyway this cake is great, it's so delicious and moist. +L4 E L8 F# L3 G L4 E C# L8 D E R8 < A > D E F E D C R4 +' Look at me still talking when there's Science to do +L8 < A B- > L4 C F L8 E D D C D L4 C C +' When I look out there is makes me GLaD I'm not you. +L8 < A B- > L4 C F L8 G F E D D E L4 F F +' I've experiments to run. There is research to be done. +L8 G A B- B- A G L4 G L8 F G A A G F L4 F +' On the people who are still alive. +L8 D C D F F L4 E L8 E F# L3 F# R4 R4 +' And believe me I am still alive. +L8 A A B A F# L4 D L8 E F# L3 F# R4 R8 +' I'm doing science and I'm still alive. +L8 A A A B A F# L4 D L8 E F# L3 F# R4 R8 +' I feel FANTASTIC and I'm still alive. +L8 A A A B A F# L4 D L8 E F# L3 F# R4 R4 +' While you're dying I'll be still aliave +L8 A A B A F# L4 D L8 E F# L3 F# R4 R8 +' And when you're dead I will be still alive +L8 A A A B A F# L4 D L8 E F# L3 F# R4 R8 +' STILL ALIVE +L8 G A L3 A R4 R8 +' STILL ALIVE +L8 G F# L3 F# R4 R2 +