Files
TempleOS-Rijn/LT/ADAM/MUSIC.CPZ
T
2018-09-08 21:45:17 +02:00

82 lines
1.7 KiB
Plaintext

I1 *cur_song=NULL;
TssStruct *cur_song_tss=NULL;
U8 music_octive;
double music_note_len;
U1 music_note_map[7]={0,2,3,5,7,8,10};
public double music_tempo,music_stacatto_factor=1.0;
I1 *MusicSetOctive(I1 *st)
{
I1 ch=*st++;
while (ch>='0' && ch<='9') {
music_octive=ch-'0';
ch=*st++;
}
return --st;
}
I1 *MusicSetNoteLen(I1 *st)
{
BoolU4 cont=TRUE;
do {
switch (*st++) {
case 'w': music_note_len=4.0; break;
case 'h': music_note_len=2.0; break;
case 'q': music_note_len=1.0; break;
case 'e': music_note_len=0.5; break;
case 's': music_note_len=0.25; break;
case 't': music_note_len=2.0*music_note_len/3.0; break;
case '.': music_note_len=1.5*music_note_len; break;
default:
st--;
cont=FALSE;
}
} while (cont);
return st;
}
public void Play(I1 *st,I1 *words=NULL)
{
I1 *word;
U8 note,i=0;
double f;
while (*st) {
st=MusicSetOctive(st);
st=MusicSetNoteLen(st);
st=MusicSetOctive(st);
if (!*st) break;
note=*st++-'A';
if (note<7) {
note=music_note_map[note];
if (*st=='b') {
note--;
st++;
} else if (*st=='#') {
note++;
st++;
}
f=2.0`(6+music_octive+(note-3)/12.0);
} else
f=0;
if (words) {
if (word=PointAtListEntry(i++,words))
if (StrCmp(word," "))
PutS(word);
}
Sound(f);
Sleep(1000*music_stacatto_factor*music_note_len/music_tempo);
Sound(0);
Sleep(1000*(1.0-music_stacatto_factor)*music_note_len/music_tempo);
}
}
void ResetMusicSettings()
{
music_stacatto_factor=1.0;
music_tempo=2.5;
music_octive=3;
music_note_len=1.0;
}
ResetMusicSettings;