sounds good

This commit is contained in:
2024-03-26 23:13:59 +01:00
parent 2e629f12aa
commit 1c2414463b
5 changed files with 89 additions and 73 deletions

View File

@ -4,88 +4,83 @@
const t_tone notes[] = { const t_tone notes[] = {
{ .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_F, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, // Triller
{ .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_32, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_32, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_32, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_32, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_C, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_D, .length = e_L_1_4, .legato = true }, { .octave = e_O_3, .note = e_D, .length = e_L_1_4, .legato = true , .staccato = false },
{ .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_F, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = false },
// Staccato { .octave = e_O_3, .note = e_Es, .length = e_L_1_4, .legato = false, .staccato = true },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = true }, { .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_16, .legato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_8, .legato = true },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_16, .legato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_4, .legato = false }, { .octave = e_O_Null, .note = e_Pause, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_8, .legato = false }, { .octave = e_O_Null, .note = e_Pause, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = true }, { .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = true , .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_As, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_As, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_4, .note = e_C, .length = e_L_1_4, .legato = false }, { .octave = e_O_4, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_B, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_B, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_As, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_As, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = true }, { .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = true , .staccato = false },
{ .octave = e_O_3, .note = e_G, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_G, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_F, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_D, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_D, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_D, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false }, { .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_F, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_F, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_G, .length = e_L_1_4, .legato = false, .staccato = false },
// Staccato { .octave = e_O_3, .note = e_Es, .length = e_L_1_4, .legato = false, .staccato = true },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_8, .legato = true }, { .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = true },
{ .octave = e_O_3, .note = e_Es, .length = e_L_1_16, .legato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_8, .legato = true },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_16, .legato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_16, .legato = false },
{ .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false }, { .octave = e_O_3, .note = e_C, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Pause, .length = e_L_1_4, .legato = false }, { .octave = e_O_Null, .note = e_Pause, .length = e_L_1_4, .legato = false, .staccato = false },
{ .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false }, { .octave = e_O_Null, .note = e_Null, .length = e_L_EndMark, .legato = false, .staccato = false },
}; };
t_melody melody= { t_melody melody = {
.pace = 4,
.amplitude = 3,
.channel = 0, .channel = 0,
.tones = notes .tones = notes
}; };
void melodyInit() { void melodyInit() {
psgAmplitude(melody.channel, 3);
sequencerPlayMelody(&melody); sequencerPlayMelody(&melody);
} }

View File

@ -34,7 +34,8 @@ void __attribute__ ((interrupt (TIMER0_A0_VECTOR))) schUpdate() {
} }
} }
void schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t period) { uint16_t schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t period) {
uint16_t taskId = 0xffff;
for (uint16_t i = 0; i < MAX_NUM_OF_TASKS; i++) { for (uint16_t i = 0; i < MAX_NUM_OF_TASKS; i++) {
if (tasks[i].exec == NULL) { if (tasks[i].exec == NULL) {
tasks[i].delay = delay; tasks[i].delay = delay;
@ -46,9 +47,11 @@ void schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t period)
} }
tasks[i].exec = exec; tasks[i].exec = exec;
tasks[i].handle = handle; tasks[i].handle = handle;
taskId = i;
break; break;
} }
} }
return taskId;
} }
/* /*
@ -61,6 +64,9 @@ void schDel(void (*exec)(void *), void *handle) {
} }
} }
*/ */
void schDel(uint16_t taskId) {
tasks[taskId].exec = NULL;
}
void schExec() { void schExec() {
for (uint16_t i = 0; i < MAX_NUM_OF_TASKS; i++) { for (uint16_t i = 0; i < MAX_NUM_OF_TASKS; i++) {

View File

@ -19,11 +19,10 @@ typedef struct {
void schInit(); void schInit();
void schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t period); uint16_t schAdd(void (*exec)(void *), void *handle, uint32_t delay, uint32_t period);
void schDel(void (*exec)(void *), void *handle); // void schDel(void (*exec)(void *), void *handle);
void schDel(uint16_t taskId);
void schExec(); void schExec();
void schUpdate();
uint8_t schTaskCnt();
#endif /* PONTCOOPSCHEDULER_H_ */ #endif /* PONTCOOPSCHEDULER_H_ */

View File

@ -15,13 +15,22 @@ void sequencerExec(void *handle) {
if (melody->tones[melody->idx].length == e_L_EndMark) { if (melody->tones[melody->idx].length == e_L_EndMark) {
melody->idx = 0; melody->idx = 0;
} }
psgPlayTone(melody->channel, melody->tones[melody->idx].octave, melody->tones[melody->idx].note); psgPlayTone(melody->channel, melody->tones[melody->idx].octave, melody->tones[melody->idx].note);
melody->lengthCnt = (melody->tones[melody->idx].staccato) ? (melody->tones[melody->idx].length / 2) : melody->tones[melody->idx].length;
melody->lengthCnt = melody->tones[melody->idx].length;
melody->state = e_HoldTone; melody->state = e_HoldTone;
break; break;
case e_HoldTone: case e_HoldTone:
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:
melody->lengthCnt -= 1; melody->lengthCnt -= 1;
if (melody->lengthCnt == 0) { if (melody->lengthCnt == 0) {
melody->state = e_SeparateTone; melody->state = e_SeparateTone;
@ -37,11 +46,12 @@ void sequencerExec(void *handle) {
} }
} }
uint8_t sequencerPlayMelody(t_melody *melody) { uint16_t sequencerPlayMelody(t_melody *melody) {
melody->idx = 0; melody->idx = 0;
melody->lengthCnt = 0; melody->lengthCnt = 0;
melody->state = e_PlayTone; melody->state = e_PlayTone;
schAdd(sequencerExec, (void*) melody, 0, 10);
return 0; psgAmplitude(melody->channel, melody->amplitude);
return schAdd(sequencerExec, (void*) melody, 0, melody->pace);
} }

View File

@ -8,11 +8,12 @@
typedef enum { typedef enum {
e_L_EndMark = 0, e_L_EndMark = 0,
e_L_1 = 80, e_L_1 = 320,
e_L_1_2 = 40, e_L_1_2 = 160,
e_L_1_4 = 20, e_L_1_4 = 80,
e_L_1_8 = 10, e_L_1_8 = 40,
e_L_1_16 = 5 e_L_1_16 = 20,
e_L_1_32 = 10,
} t_noteLength; } t_noteLength;
typedef struct { typedef struct {
@ -20,11 +21,14 @@ typedef struct {
t_note note; t_note note;
t_noteLength length; t_noteLength length;
bool legato; bool legato;
bool staccato;
} t_tone; } t_tone;
typedef enum { typedef enum {
e_PlayTone, e_PlayTone,
e_HoldTone, e_HoldTone,
e_StaccatoBreak,
e_HoldStaccatoBreak,
e_SeparateTone e_SeparateTone
} t_sequencerState; } t_sequencerState;
@ -32,12 +36,14 @@ typedef struct {
uint16_t idx; uint16_t idx;
uint8_t lengthCnt; uint8_t lengthCnt;
t_sequencerState state; t_sequencerState state;
uint8_t pace;
uint8_t amplitude;
uint8_t channel; uint8_t channel;
const t_tone *tones; const t_tone *tones;
} t_melody; } t_melody;
void sequencerInit(); void sequencerInit();
uint8_t sequencerPlayMelody(t_melody *melody); uint16_t sequencerPlayMelody(t_melody *melody);
#endif // _SEQUENCER_H_ #endif // _SEQUENCER_H_