start sequencer

This commit is contained in:
Wolfgang Hottgenroth 2024-06-06 17:05:17 +02:00
parent 9cf2ca6453
commit e9baf05baf
4 changed files with 220 additions and 3 deletions

View File

@ -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

10
psg.c
View File

@ -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);
}

143
sequencer.c Normal file
View File

@ -0,0 +1,143 @@
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#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);
}

68
sequencer.h Normal file
View File

@ -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_