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
|
||||
|
||||
$(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
10
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);
|
||||
}
|
||||
|
||||
|
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