2024-06-06 17:05:17 +02:00
|
|
|
#ifndef _SEQUENCER_H_
|
|
|
|
#define _SEQUENCER_H_
|
|
|
|
|
2024-06-11 21:24:54 +02:00
|
|
|
#include <stdint.h>
|
2024-06-06 17:05:17 +02:00
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
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;
|
|
|
|
|
2024-06-11 21:24:54 +02:00
|
|
|
#define W(X0) (sequencerAction_t) { \
|
|
|
|
.type = SA_WAIT, \
|
|
|
|
.u.wait = X0 \
|
|
|
|
}
|
2024-06-06 17:05:17 +02:00
|
|
|
|
2024-06-11 21:24:54 +02:00
|
|
|
#define CS(X0, X1, X2, X3) (sequencerAction_t) { \
|
|
|
|
.type = SA_CHANGE_SOUND, \
|
|
|
|
.u.cs.frequency_a = X0, \
|
|
|
|
.u.cs.volume_a = X1, \
|
|
|
|
.u.cs.frequency_b = X2, \
|
|
|
|
.u.cs.volume_b = X3 \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define MS(X0, X1, X2, X3, \
|
|
|
|
X4, X5, X6, X7, X8) (sequencerAction_t) { \
|
|
|
|
.type = SA_MOVE_SOUND, \
|
|
|
|
.u.ms.frequency_a_0 = X0, \
|
|
|
|
.u.ms.volume_a_0 = X1, \
|
|
|
|
.u.ms.frequency_b_0 = X2, \
|
|
|
|
.u.ms.volume_b_0 = X3, \
|
|
|
|
.u.ms.frequency_a_1 = X4, \
|
|
|
|
.u.ms.volume_a_1 = X5, \
|
|
|
|
.u.ms.frequency_b_1 = X6, \
|
|
|
|
.u.ms.volume_b_1 = X7, \
|
|
|
|
.u.ms.move_time = X8 \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define CV(X0, X1) (sequencerAction_t) { \
|
|
|
|
.type = SA_CHANGE_VOLUME, \
|
|
|
|
.u.cv.volume_a = X0, \
|
|
|
|
.u.cv.volume_b = X1 \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define MV(X0, X1, X2, X3, X4) (sequencerAction_t) { \
|
|
|
|
.type = SA_MOVE_VOLUME, \
|
|
|
|
.u.mv.volume_a_0 = X0, \
|
|
|
|
.u.mv.volume_b_0 = X1, \
|
|
|
|
.u.mv.volume_a_1 = X2, \
|
|
|
|
.u.mv.volume_b_1 = X3, \
|
|
|
|
.u.mv.move_time = X4 \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define R() (sequencerAction_t) { \
|
|
|
|
.type = SA_REPEAT \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define E() (sequencerAction_t) { \
|
|
|
|
.type = SA_END \
|
|
|
|
}
|
|
|
|
|
|
|
|
void sequencerStart(const sequencerAction_t *sequence);
|
2024-06-06 17:05:17 +02:00
|
|
|
|
|
|
|
void sequencerInit();
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _SEQUENCER_H_
|