#ifndef _SEQUENCER_H_ #define _SEQUENCER_H_ #include 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; #define W(X0) (sequencerAction_t) { \ .type = SA_WAIT, \ .u.wait = X0 \ } #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); void sequencerInit(); #endif // _SEQUENCER_H_