tetris/sound-driver/sequencer.c

61 lines
1.7 KiB
C
Raw Normal View History

2024-03-26 15:58:45 +01:00
#include "sequencer.h"
#include "scheduler.h"
#include "psg.h"
2024-03-26 22:12:46 +01:00
2024-03-26 15:58:45 +01:00
void sequencerInit() {
}
void sequencerExec(void *handle) {
t_melody *melody = (t_melody*) handle;
2024-03-26 21:05:48 +01:00
switch (melody->state) {
2024-03-26 23:21:24 +01:00
case e_Init:
psgAmplitude(melody->channel, melody->amplitude);
melody->state = e_PlayTone;
break;
2024-03-26 22:12:46 +01:00
case e_PlayTone:
2024-03-26 21:05:48 +01:00
if (melody->tones[melody->idx].length == e_L_EndMark) {
melody->idx = 0;
}
psgPlayTone(melody->channel, melody->tones[melody->idx].octave, melody->tones[melody->idx].note);
2024-03-26 23:13:59 +01:00
melody->lengthCnt = (melody->tones[melody->idx].staccato) ? (melody->tones[melody->idx].length / 2) : melody->tones[melody->idx].length;
2024-03-26 22:12:46 +01:00
melody->state = e_HoldTone;
2024-03-26 21:05:48 +01:00
break;
2024-03-26 22:12:46 +01:00
case e_HoldTone:
2024-03-26 23:13:59 +01:00
melody->lengthCnt -= 1;
if (melody->lengthCnt == 0) {
melody->state = (melody->tones[melody->idx].staccato) ? e_StaccatoBreak : e_SeparateTone;
}
break;
case e_StaccatoBreak:
psgPlayTone(melody->channel, e_O_Null, e_Pause);
melody->lengthCnt = melody->tones[melody->idx].length / 2;
melody->state = e_HoldStaccatoBreak;
break;
case e_HoldStaccatoBreak:
2024-03-26 21:05:48 +01:00
melody->lengthCnt -= 1;
if (melody->lengthCnt == 0) {
2024-03-26 22:12:46 +01:00
melody->state = e_SeparateTone;
2024-03-26 21:05:48 +01:00
}
break;
2024-03-26 22:12:46 +01:00
case e_SeparateTone:
2024-03-26 21:05:48 +01:00
if (! (melody->tones[melody->idx].legato)) {
psgPlayTone(melody->channel, e_O_Null, e_Pause);
}
melody->idx += 1;
2024-03-26 22:12:46 +01:00
melody->state = e_PlayTone;
2024-03-26 21:05:48 +01:00
break;
2024-03-26 15:58:45 +01:00
}
}
2024-03-26 23:13:59 +01:00
uint16_t sequencerPlayMelody(t_melody *melody) {
2024-03-26 15:58:45 +01:00
melody->idx = 0;
melody->lengthCnt = 0;
2024-03-26 22:12:46 +01:00
melody->state = e_PlayTone;
2024-03-26 23:13:59 +01:00
return schAdd(sequencerExec, (void*) melody, 0, melody->pace);
2024-03-26 15:58:45 +01:00
}