diff --git a/Makefile b/Makefile index 76257d5..1f223b5 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__ LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include -$(ARTIFACT).elf: main.o scheduler.o psg.o +$(ARTIFACT).elf: main.o scheduler.o psg.o sequencer.o $(CC) -o $@ $(LDFLAGS) $^ $(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt diff --git a/psg.c b/psg.c index 57d2ca7..1ae899f 100644 --- a/psg.c +++ b/psg.c @@ -171,7 +171,13 @@ void psgInit() { psgAmplitude(1, 2, 0); psgAmplitude(1, 3, 0); // noise - psgPlayTone(0, 0, 15, e_O_4, e_C); - psgPlayTone(1, 0, 15, e_O_3, e_C); + //psgPlayTone(0, 0, 15, e_O_4, e_A); + //psgPlayTone(1, 0, 15, e_O_5, e_A); + psgPlayFrequency(0, 0, 15, 500); + psgPlayFrequency(1, 0, 15, 500); +// psgAmplitude(0, 0, 15); +// psgWriteFrequencyCode(0, 0, 1023); +// psgAmplitude(1, 0, 15); +// psgWriteFrequencyCode(1, 0, 100); } diff --git a/sequencer.c b/sequencer.c new file mode 100644 index 0000000..010f692 --- /dev/null +++ b/sequencer.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include "scheduler.h" +#include "sequencer.h" +#include "psg.h" + + +const uint32_t CYCLE_TIME = 5; // ms + +typedef enum { + ACTION_RESULT_STAY, + ACTION_RESULT_NEXT, + ACTION_RESULT_REPEAT, + ACTION_RESULT_END +} actionResult_t; + + + +sequencerAction_t w(uint32_t wait) { + sequencerAction_t s = { + .type = SA_WAIT, + .u.wait = wait + }; + return s; +} + +sequencerAction_t cs(uint16_t frequency_a, uint8_t volume_a, uint16_t frequency_b, uint8_t volume_b) { + sequencerAction_t s = { + .type = SA_CHANGE_SOUND, + .u.cs.frequency_a = frequency_a, + .u.cs.frequency_b = frequency_b, + .u.cs.volume_a = volume_a, + .u.cs.volume_b = volume_b + }; + return s; +} + +sequencerAction_t ms(uint16_t frequency_a_0, uint8_t volume_a_0, uint16_t frequency_b_0, uint8_t volume_b_0, + uint16_t frequency_a_1, uint8_t volume_a_1, uint16_t frequency_b_1, uint8_t volume_b_1, + uint32_t move_time) { + sequencerAction_t s = { + .type = SA_MOVE_SOUND, + .u.ms.frequency_a_0 = frequency_a_0, + .u.ms.frequency_b_0 = frequency_b_0, + .u.ms.volume_a_0 = volume_a_0, + .u.ms.volume_b_0 = volume_b_0, + .u.ms.frequency_a_1 = frequency_a_1, + .u.ms.frequency_b_1 = frequency_b_1, + .u.ms.volume_a_1 = volume_a_1, + .u.ms.volume_b_1 = volume_b_1, + .u.ms.move_time = move_time + }; + return s; +} + +sequencerAction_t cv(uint8_t volume_a, uint8_t volume_b) { + sequencerAction_t s = { + .type = SA_CHANGE_VOLUME, + .u.cv.volume_a = volume_a, + .u.cv.volume_b = volume_b + }; + return s; +} + +sequencerAction_t mv(uint8_t volume_a_0, uint8_t volume_b_0, + uint8_t volume_a_1, uint8_t volume_b_1, + uint32_t move_time) { + sequencerAction_t s = { + .type = SA_MOVE_VOLUME, + .u.mv.volume_a_0 = volume_a_0, + .u.mv.volume_b_0 = volume_b_0, + .u.mv.volume_a_1 = volume_a_1, + .u.mv.volume_b_1 = volume_b_1, + .u.mv.move_time = move_time + }; + return s; +} + +sequencerAction_t r() { + sequencerAction_t s = { + .type = SA_REPEAT + }; + return s; +} + +sequencerAction_t e() { + sequencerAction_t s = { + .type = SA_END + }; + return s; +} + +static actionResult_t _repeat() { + return ACTION_RESULT_REPEAT; +} + +static actionResult_t _end() { + return ACTION_RESULT_END; +} + +static actionResult_t _wait(uint32_t wait) { + static bool running = false; + static uint32_t counter = 0; + + actionResult_t res; + if (! running) { + counter = wait; + res = ACTION_RESULT_STAY; + } else { + if (counter == 0) { + running = false; + res = ACTION_RESULT_NEXT; + } else { + counter -= 1; + res = ACTION_RESULT_STAY; + } + } + return res; +} + +static actionResult_t _change_sound(uint16_t frequency_a, uint8_t volume_a, uint16_t frequency_b, uint8_t volume_b) { + // set frequency_a and volume_a to generator 0 + // set frequency_b and volume_b to generator 1 + return ACTION_RESULT_NEXT; +} + +static bool _change_volume(uint8_t volume_a, uint8_t volume_b) { + // set volume_a to generator 0 + // set volume_b to generator 1 + return ACTION_RESULT_NEXT; +} + +void sequencerStart(sequencerAction_t *sequence) { +} + +void sequencerExec(void *handle) { +} + +void sequencerInit() { + schAdd(sequencerExec, NULL, 0, CYCLE_TIME); +} + diff --git a/sequencer.h b/sequencer.h new file mode 100644 index 0000000..ae8a7c1 --- /dev/null +++ b/sequencer.h @@ -0,0 +1,68 @@ +#ifndef _SEQUENCER_H_ +#define _SEQUENCER_H_ + + +typedef enum { + SA_IDLE, + SA_WAIT, + SA_CHANGE_SOUND, + SA_MOVE_SOUND, + SA_CHANGE_VOLUME, + SA_MOVE_VOLUME, + SA_REPEAT, + SA_END, +} sequencerActionType_t; + +typedef struct { + sequencerActionType_t type; + union { + uint32_t wait; + struct { + uint16_t frequency_a; + uint8_t volume_a; + uint16_t frequency_b; + uint8_t volume_b; + } cs; + struct { + uint16_t frequency_a_0; + uint8_t volume_a_0; + uint16_t frequency_b_0; + uint8_t volume_b_0; + uint16_t frequency_a_1; + uint8_t volume_a_1; + uint16_t frequency_b_1; + uint8_t volume_b_1; + uint32_t move_time; + } ms; + struct { + uint8_t volume_a; + uint8_t volume_b; + } cv; + struct { + uint8_t volume_a_0; + uint8_t volume_b_0; + uint8_t volume_a_1; + uint8_t volume_b_1; + uint32_t move_time; + } mv; + } u; +} sequencerAction_t; + +sequencerAction_t w(uint32_t wait); +sequencerAction_t cs(uint16_t frequency_a, uint8_t volume_a, uint16_t frequency_b, uint8_t volume_b); +sequencerAction_t ms(uint16_t frequency_a_0, uint8_t volume_a_0, uint16_t frequency_b_0, uint8_t volume_b_0, + uint16_t frequency_a_1, uint8_t volume_a_1, uint16_t frequency_b_1, uint8_t volume_b_1, + uint32_t move_time); +sequencerAction_t cv(uint8_t volume_a, uint8_t volume_b); +sequencerAction_t mv(uint8_t volume_a_0, uint8_t volume_b_0, + uint8_t volume_a_1, uint8_t volume_b_1, + uint32_t move_time); +sequencerAction_t r(); +sequencerAction_t e(); + +void sequencerStart(sequencerAction_t *sequence); + +void sequencerInit(); + + +#endif // _SEQUENCER_H_