start sequencer
This commit is contained in:
parent
9cf2ca6453
commit
e9baf05baf
2
Makefile
2
Makefile
@ -12,7 +12,7 @@ ASFLAGS=$(COMMONFLAGS) -D__ASSEMBLER__
|
|||||||
|
|
||||||
LDFLAGS=-mmcu=$(MCU) -L $(TOOLCHAIN_PREFIX)/include
|
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) $^
|
$(CC) -o $@ $(LDFLAGS) $^
|
||||||
$(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt
|
$(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt
|
||||||
|
|
||||||
|
10
psg.c
10
psg.c
@ -171,7 +171,13 @@ void psgInit() {
|
|||||||
psgAmplitude(1, 2, 0);
|
psgAmplitude(1, 2, 0);
|
||||||
psgAmplitude(1, 3, 0); // noise
|
psgAmplitude(1, 3, 0); // noise
|
||||||
|
|
||||||
psgPlayTone(0, 0, 15, e_O_4, e_C);
|
//psgPlayTone(0, 0, 15, e_O_4, e_A);
|
||||||
psgPlayTone(1, 0, 15, e_O_3, e_C);
|
//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
143
sequencer.c
Normal 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
68
sequencer.h
Normal 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_
|
Loading…
x
Reference in New Issue
Block a user