hschumann2/TempleOS-Source-Code
0847
1 2#help_index "God"3 4DefineLstLoad("ST_RHYTHM_COMPLEXITY","Simple\0Normal\0Complex\0");5 6class CMakeSongSettings7{8 I64 complexity format "$LS,D=\"ST_RHYTHM_COMPLEXITY\"$\n";9 Bool rests format "$CB,\"Rests\"$\n";10 Bool six_eight format "$CB,\"Six Eight\"$\n";11 I64 octave format "$DA-TRM,A=\"Octave:%d\"$\n";12 I64 octave_state;13};14 15U0 InsNote(CMakeSongSettings *mss,U8 *buf,I64 k,I64 *j)16{//k is a random note nibble17 if (!k && mss->rests) {18 buf[*j]='R';19 *j+=1;20 } else {21 k/=2;22 if (k<3) {23 if (mss->octave_state!=mss->octave) {24 mss->octave_state=mss->octave;25 buf[*j]=mss->octave_state+'0';26 *j+=1;27 }28 if (!k)29 buf[*j]='G';30 else31 buf[*j]=k-1+'A';32 *j+=1;33 } else {34 if (mss->octave_state!=mss->octave+1) {35 mss->octave_state=mss->octave+1;36 buf[*j]=mss->octave_state+'0';37 *j+=1;38 }39 buf[*j]=k-1+'A';40 *j+=1;41 }42 }43}44 45#define DUR_4 046#define DUR_8_8 147#define DUR_3_3_3 248#define DUR_16_16_16_16 349#define DUR_8DOT_16 450#define DUR_8_16_16 551#define DUR_16_16_8 652 53U8 god_simple_songs [5]={DUR_4,DUR_4,DUR_4,DUR_4,DUR_8_8};54U8 god_normal_songs [5]={DUR_4,DUR_4,DUR_8_8,DUR_3_3_3,DUR_16_16_16_16};55U8 god_complex_songs[9]={DUR_4,DUR_4,DUR_8_8,DUR_8_8,DUR_8DOT_16,DUR_3_3_3,56DUR_8_16_16,DUR_16_16_8,DUR_16_16_16_16};57 58public U8 *GodSongStr()59{//Make God generate 2 measures of a song. Holy Spirit Instructions60 CMakeSongSettings mss;61 U8 *buf;62 I64 i,j=0,k,n,k2,duration,last_duration=-1,len;63 64 MemSet(&mss,0,sizeof(mss));65 mss.complexity=1;66 mss.rests=FALSE;67 mss.octave=music.octave;68 69 if (!PopUpForm(&mss))70 return NULL;71 72 buf=CAlloc(256);73 music.octave=mss.octave=ClampI64(mss.octave,1,7);74 progress4=0;75 if (mss.six_eight)76 progress4_max=6;77 else78 progress4_max=8;79 80 mss.octave_state=mss.octave+1;81 buf[j++]='0'+mss.octave_state;82 if (mss.six_eight) {83 len=6;84 buf[j++]='M';85 buf[j++]='6';86 buf[j++]='/';87 buf[j++]='8';88 } else89 len=8;90 FifoU8Flush(god.fifo);91 for (i=0;i<len;i++) {92 n=GodBits(8);93 if (mss.complexity==2)94 duration=god_complex_songs[n%9];95 else if (mss.complexity==1)96 duration=god_normal_songs[n%5];97 else98 duration=god_simple_songs[n%5];99 100 switch (duration) {101 case DUR_8_8:102 if (last_duration!=DUR_8_8)103 buf[j++]='e';104 InsNote(&mss,buf,GodBits(4),&j);105 InsNote(&mss,buf,GodBits(4),&j);106 break;107 case DUR_8DOT_16:108 buf[j++]='e';109 buf[j++]='.';110 InsNote(&mss,buf,GodBits(4),&j);111 buf[j++]='s';112 InsNote(&mss,buf,GodBits(4),&j);113 duration=DUR_16_16_16_16;114 break;115 case DUR_3_3_3:116 if (last_duration!=DUR_3_3_3) {117 buf[j++]='e';118 buf[j++]='t';119 }120 InsNote(&mss,buf,GodBits(4),&j);121 InsNote(&mss,buf,GodBits(4),&j);122 InsNote(&mss,buf,GodBits(4),&j);123 break;124 case DUR_8_16_16:125 if (last_duration!=DUR_8_8)126 buf[j++]='e';127 InsNote(&mss,buf,GodBits(4),&j);128 buf[j++]='s';129 InsNote(&mss,buf,GodBits(4),&j);130 InsNote(&mss,buf,GodBits(4),&j);131 duration=DUR_16_16_16_16;132 break;133 case DUR_16_16_8:134 if (last_duration!=DUR_16_16_16_16)135 buf[j++]='s';136 InsNote(&mss,buf,GodBits(4),&j);137 InsNote(&mss,buf,GodBits(4),&j);138 buf[j++]='e';139 InsNote(&mss,buf,GodBits(4),&j);140 duration=DUR_8_8;141 break;142 case DUR_16_16_16_16:143 if (last_duration!=DUR_16_16_16_16)144 buf[j++]='s';145 k =GodBits(4);146 k2=GodBits(4);147 InsNote(&mss,buf,k,&j);148 InsNote(&mss,buf,k2,&j);149 InsNote(&mss,buf,k,&j);150 InsNote(&mss,buf,k2,&j);151 break;152 default:153 if (last_duration!=DUR_4)154 buf[j++]='q';155 InsNote(&mss,buf,GodBits(4),&j);156 }157 last_duration=duration;158 progress4++;159 }160 buf[j++]=0;161 progress4=progress4_max=0;162 return buf;163}164 165public U0 GodSong()166{//Make God generate 2measuresx2+2measuresx2. Holy Spirit Instructions167 U8 *st1=GodSongStr,*st2=GodSongStr;168 if (st1 && st2)169 DocPrint(DocPut,"$SO,\"<Song>\",A=\"%s%s%s%s\"$",st1,st1,st2,st2);170 Free(st1);171 Free(st2);172}173 