PCM Digital Synthesizer

Dependencies:   LCD mbed

/media/uploads/p_igmon/img_1731-w480.jpg

Committer:
p_igmon
Date:
Fri Sep 02 13:24:16 2016 +0000
Revision:
0:ad6637c36dc7
for Micro Gen4 Synthesizer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p_igmon 0:ad6637c36dc7 1 #ifndef SYNTHESIZER_H
p_igmon 0:ad6637c36dc7 2 #define SYNTHESIZER_H
p_igmon 0:ad6637c36dc7 3
p_igmon 0:ad6637c36dc7 4 typedef signed long S32;
p_igmon 0:ad6637c36dc7 5 typedef signed short S16;
p_igmon 0:ad6637c36dc7 6 typedef signed char S8;
p_igmon 0:ad6637c36dc7 7 typedef unsigned long U32;
p_igmon 0:ad6637c36dc7 8 typedef unsigned short U16;
p_igmon 0:ad6637c36dc7 9 typedef unsigned char U8;
p_igmon 0:ad6637c36dc7 10
p_igmon 0:ad6637c36dc7 11 #include "mbed.h"
p_igmon 0:ad6637c36dc7 12 #include "cmsis.h"
p_igmon 0:ad6637c36dc7 13 #include "stm32f401xe.h"
p_igmon 0:ad6637c36dc7 14 #include "stm32f4xx.h"
p_igmon 0:ad6637c36dc7 15 #include "stm32f4xx_hal.h"
p_igmon 0:ad6637c36dc7 16 #include "stm32f4xx_hal_dma_ex.h"
p_igmon 0:ad6637c36dc7 17 #include "stm32f4xx_hal_dma.h"
p_igmon 0:ad6637c36dc7 18 #include "stm32f4xx_hal_i2s.h"
p_igmon 0:ad6637c36dc7 19 #include "stm32f4xx_hal_flash.h"
p_igmon 0:ad6637c36dc7 20 #include "stm32f4xx_hal_conf.h"
p_igmon 0:ad6637c36dc7 21 #include "stm32f4xx_it.h"
p_igmon 0:ad6637c36dc7 22
p_igmon 0:ad6637c36dc7 23 #include "error.h"
p_igmon 0:ad6637c36dc7 24 #include "pinmap.h"
p_igmon 0:ad6637c36dc7 25 #include "PinNames.h"
p_igmon 0:ad6637c36dc7 26 #include "gpio_irq_api.h"
p_igmon 0:ad6637c36dc7 27
p_igmon 0:ad6637c36dc7 28 #include "LCD.h"
p_igmon 0:ad6637c36dc7 29
p_igmon 0:ad6637c36dc7 30 #include "reverve_tap.h"
p_igmon 0:ad6637c36dc7 31 #include "from_save.h"
p_igmon 0:ad6637c36dc7 32 #include "lcd_sw.h"
p_igmon 0:ad6637c36dc7 33 #include "releasetime_table.h"
p_igmon 0:ad6637c36dc7 34
p_igmon 0:ad6637c36dc7 35 #include "lfo_table.h"
p_igmon 0:ad6637c36dc7 36 #include "dcf_table.h"
p_igmon 0:ad6637c36dc7 37
p_igmon 0:ad6637c36dc7 38 #define FWVERSION " Ver 2.1"
p_igmon 0:ad6637c36dc7 39
p_igmon 0:ad6637c36dc7 40 #define DIST
p_igmon 0:ad6637c36dc7 41 //#define REVERVE16BIT
p_igmon 0:ad6637c36dc7 42 //#define DCF
p_igmon 0:ad6637c36dc7 43 #define INTERPO2
p_igmon 0:ad6637c36dc7 44
p_igmon 0:ad6637c36dc7 45 #define VOICEMAX 8
p_igmon 0:ad6637c36dc7 46 #define PRGGENMAX 4
p_igmon 0:ad6637c36dc7 47 //#define VOICEMAX 12
p_igmon 0:ad6637c36dc7 48 //#define PRGGENMAX 2
p_igmon 0:ad6637c36dc7 49 //#define GENMAX (PRGGENMAX*VOICEMAX)
p_igmon 0:ad6637c36dc7 50 #define GENMAX 24
p_igmon 0:ad6637c36dc7 51
p_igmon 0:ad6637c36dc7 52 #define I2S2 SPI2
p_igmon 0:ad6637c36dc7 53 #define DMA_BUFFERSIZE 2048
p_igmon 0:ad6637c36dc7 54
p_igmon 0:ad6637c36dc7 55 #define PARAM_BUFSIZE 256
p_igmon 0:ad6637c36dc7 56
p_igmon 0:ad6637c36dc7 57 #define GEN_IDLE 0
p_igmon 0:ad6637c36dc7 58 #define GEN_NOTEON 1
p_igmon 0:ad6637c36dc7 59 #define GEN_NOTEOFF 2
p_igmon 0:ad6637c36dc7 60 #define GEN_PORON 3
p_igmon 0:ad6637c36dc7 61 #define GEN_POROFF 4
p_igmon 0:ad6637c36dc7 62
p_igmon 0:ad6637c36dc7 63 /* for main Request*/
p_igmon 0:ad6637c36dc7 64 //#define REQUEST_NONE 0
p_igmon 0:ad6637c36dc7 65 //#define REQUEST_BUFFERFULL 1
p_igmon 0:ad6637c36dc7 66 //#define REQUEST_PARAM 2
p_igmon 0:ad6637c36dc7 67 //#define REQUEST_MIDI 4
p_igmon 0:ad6637c36dc7 68
p_igmon 0:ad6637c36dc7 69 /* EG Function */
p_igmon 0:ad6637c36dc7 70 #define EG_IDLE 0
p_igmon 0:ad6637c36dc7 71 #define EG_ATTACK 1
p_igmon 0:ad6637c36dc7 72 #define EG_DECAY 2
p_igmon 0:ad6637c36dc7 73 #define EG_SUSTAIN 3
p_igmon 0:ad6637c36dc7 74 #define EG_RELEASE 4
p_igmon 0:ad6637c36dc7 75 #define EG_BEFOREATTACK 5
p_igmon 0:ad6637c36dc7 76
p_igmon 0:ad6637c36dc7 77 extern S16 limit;
p_igmon 0:ad6637c36dc7 78
p_igmon 0:ad6637c36dc7 79 typedef struct {
p_igmon 0:ad6637c36dc7 80 U8 sw;// 0,1
p_igmon 0:ad6637c36dc7 81 U8 wave_num;// 1 - 100
p_igmon 0:ad6637c36dc7 82 S8 notebias;// -128 - +127
p_igmon 0:ad6637c36dc7 83 U8 pan;// 0-31
p_igmon 0:ad6637c36dc7 84 S16 detune;// -512 - +511
p_igmon 0:ad6637c36dc7 85 U16 volume;// 0-65535
p_igmon 0:ad6637c36dc7 86
p_igmon 0:ad6637c36dc7 87 U16 attacktime;//
p_igmon 0:ad6637c36dc7 88 U16 decaytime;//
p_igmon 0:ad6637c36dc7 89 U8 sustainlevel;//
p_igmon 0:ad6637c36dc7 90 U16 releasetime;// 0-21
p_igmon 0:ad6637c36dc7 91
p_igmon 0:ad6637c36dc7 92 U8 lfo1type;
p_igmon 0:ad6637c36dc7 93 U8 lfo1speed;
p_igmon 0:ad6637c36dc7 94 U16 lfo1depth;
p_igmon 0:ad6637c36dc7 95 U16 lfo1delaytime;// 0-3000
p_igmon 0:ad6637c36dc7 96
p_igmon 0:ad6637c36dc7 97 U8 lfo2type;
p_igmon 0:ad6637c36dc7 98 U8 lfo2speed;
p_igmon 0:ad6637c36dc7 99 U16 lfo2depth;
p_igmon 0:ad6637c36dc7 100 U16 lfo2delaytime;// 0-3000
p_igmon 0:ad6637c36dc7 101 }GENERATOR ;
p_igmon 0:ad6637c36dc7 102
p_igmon 0:ad6637c36dc7 103 typedef struct {
p_igmon 0:ad6637c36dc7 104 U8 status;// BUFFULL,PARAM,MIDI
p_igmon 0:ad6637c36dc7 105 U8 eg_status;// IDLE,ATTCK,DECAY,SUSTAIN,RELEASE
p_igmon 0:ad6637c36dc7 106 U8 *startadr;
p_igmon 0:ad6637c36dc7 107 U8 *p1;
p_igmon 0:ad6637c36dc7 108 U8 *p2;
p_igmon 0:ad6637c36dc7 109 U8 *samplecountp1p2;
p_igmon 0:ad6637c36dc7 110 U8 *cycle;
p_igmon 0:ad6637c36dc7 111 U32 df;// 4e28f
p_igmon 0:ad6637c36dc7 112 S32 dpf;// 4e28f portament data 110812
p_igmon 0:ad6637c36dc7 113 U8 notenum;// 0-127
p_igmon 0:ad6637c36dc7 114 volatile U32 voltemp;// 32bit
p_igmon 0:ad6637c36dc7 115 volatile U32 voltemp1;// 32bit
p_igmon 0:ad6637c36dc7 116 volatile U32 voltemp2;// 32bit
p_igmon 0:ad6637c36dc7 117 volatile U32 voltempL;// 32bit
p_igmon 0:ad6637c36dc7 118 volatile U32 voltempR;// 32bit
p_igmon 0:ad6637c36dc7 119 U8 velocity;// 0-127
p_igmon 0:ad6637c36dc7 120 U32 x;// 指数部20ビット 小数部12ビット
p_igmon 0:ad6637c36dc7 121 U32 xx;// 指数部20ビット 小数部12ビット
p_igmon 0:ad6637c36dc7 122 S16 lfo1value;
p_igmon 0:ad6637c36dc7 123 U16 lfo1count;
p_igmon 0:ad6637c36dc7 124 U16 lfo1delaycount;// 3000-0
p_igmon 0:ad6637c36dc7 125 S16 lfo2value;
p_igmon 0:ad6637c36dc7 126 U16 lfo2count;
p_igmon 0:ad6637c36dc7 127 U16 lfo2delaycount;// 3000-0
p_igmon 0:ad6637c36dc7 128 U16 zerocount;
p_igmon 0:ad6637c36dc7 129 }GENERATOR_TEMP ;
p_igmon 0:ad6637c36dc7 130
p_igmon 0:ad6637c36dc7 131 typedef struct {
p_igmon 0:ad6637c36dc7 132 U8 name[16];
p_igmon 0:ad6637c36dc7 133 U32 p1;
p_igmon 0:ad6637c36dc7 134 U32 p2;
p_igmon 0:ad6637c36dc7 135 U32 cycle;
p_igmon 0:ad6637c36dc7 136 }GEN4_CHUNK;
p_igmon 0:ad6637c36dc7 137
p_igmon 0:ad6637c36dc7 138 typedef struct {
p_igmon 0:ad6637c36dc7 139 char menu[20];
p_igmon 0:ad6637c36dc7 140 void (*function)(void);
p_igmon 0:ad6637c36dc7 141 int min;
p_igmon 0:ad6637c36dc7 142 int max;
p_igmon 0:ad6637c36dc7 143 }MenuListDef;
p_igmon 0:ad6637c36dc7 144
p_igmon 0:ad6637c36dc7 145
p_igmon 0:ad6637c36dc7 146 typedef struct {
p_igmon 0:ad6637c36dc7 147 int enable;
p_igmon 0:ad6637c36dc7 148 S32 signal[6];// sample,x1,x2,y1,y2,result
p_igmon 0:ad6637c36dc7 149 S32 *dcf_param;// pointer of dcf_table(b0a0 ,b1a0,... a2,a0)
p_igmon 0:ad6637c36dc7 150 GENERATOR *gen;// gen1_adr,gen2_adr...gen4_adr
p_igmon 0:ad6637c36dc7 151 GENERATOR_TEMP *gen_temp;// gen1_adr,gen2_adr...gen4_adr
p_igmon 0:ad6637c36dc7 152 }STR_VOICE;
p_igmon 0:ad6637c36dc7 153
p_igmon 0:ad6637c36dc7 154
p_igmon 0:ad6637c36dc7 155 typedef struct{
p_igmon 0:ad6637c36dc7 156 char name[20];
p_igmon 0:ad6637c36dc7 157 uint32_t startaddr;// Wave data Start Address
p_igmon 0:ad6637c36dc7 158 uint32_t p1;// Loop Point1
p_igmon 0:ad6637c36dc7 159 uint32_t p2;// Loop Point2
p_igmon 0:ad6637c36dc7 160 uint32_t cycle;// Loop Cycle :if (cycle == 0) cycle = P2-p1 ;
p_igmon 0:ad6637c36dc7 161 }WaveDef;
p_igmon 0:ad6637c36dc7 162
p_igmon 0:ad6637c36dc7 163 typedef struct{
p_igmon 0:ad6637c36dc7 164 char name[20];
p_igmon 0:ad6637c36dc7 165 uint8_t dcf_freq;
p_igmon 0:ad6637c36dc7 166 uint8_t dcf_q;
p_igmon 0:ad6637c36dc7 167 uint8_t dcf_freqsence;
p_igmon 0:ad6637c36dc7 168 uint8_t dcf_qsence;
p_igmon 0:ad6637c36dc7 169 }PresetVoiceDef;
p_igmon 0:ad6637c36dc7 170
p_igmon 0:ad6637c36dc7 171 typedef enum
p_igmon 0:ad6637c36dc7 172 {
p_igmon 0:ad6637c36dc7 173 DMA_Idle = 0,
p_igmon 0:ad6637c36dc7 174 DMA_HalfComplete,
p_igmon 0:ad6637c36dc7 175 DMA_FullComplete,
p_igmon 0:ad6637c36dc7 176 }BUFFER_StateTypeDef;
p_igmon 0:ad6637c36dc7 177
p_igmon 0:ad6637c36dc7 178 typedef enum
p_igmon 0:ad6637c36dc7 179 {
p_igmon 0:ad6637c36dc7 180 KEY_WAIT_ON = 0,
p_igmon 0:ad6637c36dc7 181 KEY_AFTER_ON,
p_igmon 0:ad6637c36dc7 182 KEY_WAIT_OFF,
p_igmon 0:ad6637c36dc7 183 KEY_AFTER_OFF,
p_igmon 0:ad6637c36dc7 184 KEY_AUTO_PRESS,
p_igmon 0:ad6637c36dc7 185 KEY_AFTER_AUTO_PRESS,
p_igmon 0:ad6637c36dc7 186 KEY_GEN_WAVE1,
p_igmon 0:ad6637c36dc7 187 KEY_GEN_WAVE2,
p_igmon 0:ad6637c36dc7 188 KEY_FIRST_WAIT
p_igmon 0:ad6637c36dc7 189 }KeyState_TypeDef;
p_igmon 0:ad6637c36dc7 190
p_igmon 0:ad6637c36dc7 191 void MX_GPIO_Init(void);
p_igmon 0:ad6637c36dc7 192 void uGen4_device_init(void);
p_igmon 0:ad6637c36dc7 193 void init_dmabuffer(void);
p_igmon 0:ad6637c36dc7 194 void i2s_dma_init(void);
p_igmon 0:ad6637c36dc7 195 void uGen4_init(void);
p_igmon 0:ad6637c36dc7 196
p_igmon 0:ad6637c36dc7 197 void lcd_print_title(void);
p_igmon 0:ad6637c36dc7 198 void gen_function(int *);
p_igmon 0:ad6637c36dc7 199
p_igmon 0:ad6637c36dc7 200 S32 satAdd32(S32 val1 ,S32 val2);
p_igmon 0:ad6637c36dc7 201 S16 satAdd16(S16 val1 ,S16 val2);
p_igmon 0:ad6637c36dc7 202 S16 dcf64(S32 *param ,S32 *signal);
p_igmon 0:ad6637c36dc7 203 char *val2str4(int value);
p_igmon 0:ad6637c36dc7 204 void presetvoice(void);
p_igmon 0:ad6637c36dc7 205 void param(void);
p_igmon 0:ad6637c36dc7 206 void midichannel(void);
p_igmon 0:ad6637c36dc7 207 void mastertune(void);
p_igmon 0:ad6637c36dc7 208 void dcfcontrol(void);
p_igmon 0:ad6637c36dc7 209 void gen_sw (void);
p_igmon 0:ad6637c36dc7 210 void gen_wave (void);
p_igmon 0:ad6637c36dc7 211 void gen_notebias(void);
p_igmon 0:ad6637c36dc7 212 void gen_outlevel(void);
p_igmon 0:ad6637c36dc7 213 void gen_detune(void);
p_igmon 0:ad6637c36dc7 214 void gen_attacktime(void);
p_igmon 0:ad6637c36dc7 215 void gen_decaytime(void);
p_igmon 0:ad6637c36dc7 216 void gen_sustainlevel(void);
p_igmon 0:ad6637c36dc7 217 void gen_relesetime(void);
p_igmon 0:ad6637c36dc7 218 void gen_lfo1_wavetype(void);
p_igmon 0:ad6637c36dc7 219 void gen_lfo1_speed (void);
p_igmon 0:ad6637c36dc7 220 void gen_lfo1_depth(void);
p_igmon 0:ad6637c36dc7 221 void gen_lfo2_speed (void);
p_igmon 0:ad6637c36dc7 222 void gen_lfo2_depth(void);
p_igmon 0:ad6637c36dc7 223 void gen_lfo1_delaytime(void);
p_igmon 0:ad6637c36dc7 224 void gen_lfo2_delaytime(void);
p_igmon 0:ad6637c36dc7 225 void gen_limit(void);
p_igmon 0:ad6637c36dc7 226
p_igmon 0:ad6637c36dc7 227 void Erase_Sector2(void);
p_igmon 0:ad6637c36dc7 228
p_igmon 0:ad6637c36dc7 229 HAL_StatusTypeDef WriteBlockFrom(uint32_t *src_address ,uint32_t *dst_address,uint32_t length);
p_igmon 0:ad6637c36dc7 230
p_igmon 0:ad6637c36dc7 231 int strcmp(U8 *a ,U8 *b);
p_igmon 0:ad6637c36dc7 232
p_igmon 0:ad6637c36dc7 233 void init_voice(void);
p_igmon 0:ad6637c36dc7 234 void init_sgen(void);
p_igmon 0:ad6637c36dc7 235 void noteon(U8 notenum ,U8 velocity);
p_igmon 0:ad6637c36dc7 236 void noteoff(U8 notenum ,U8 velocity);
p_igmon 0:ad6637c36dc7 237 void pgmchg(U8 number);
p_igmon 0:ad6637c36dc7 238 void change_endian16(U16 *data);
p_igmon 0:ad6637c36dc7 239 void wave_generate(void);
p_igmon 0:ad6637c36dc7 240
p_igmon 0:ad6637c36dc7 241 void gen_attack(GENERATOR *gena,GENERATOR_TEMP *gena_temp);
p_igmon 0:ad6637c36dc7 242 void notenum2df(GENERATOR *gen ,GENERATOR_TEMP *gen_temp);
p_igmon 0:ad6637c36dc7 243 void envelope_work(void);
p_igmon 0:ad6637c36dc7 244 void midi_work(void);
p_igmon 0:ad6637c36dc7 245 void param_work(void);
p_igmon 0:ad6637c36dc7 246 void init_midi(void);
p_igmon 0:ad6637c36dc7 247 void init_param(void);
p_igmon 0:ad6637c36dc7 248
p_igmon 0:ad6637c36dc7 249 int get_wave_addr (WaveDef *wave);
p_igmon 0:ad6637c36dc7 250 void load2from(void);
p_igmon 0:ad6637c36dc7 251
p_igmon 0:ad6637c36dc7 252 void lcd_print(char *str);
p_igmon 0:ad6637c36dc7 253 void lcd_print1(char *str);
p_igmon 0:ad6637c36dc7 254 void lcd_print2(char *str);
p_igmon 0:ad6637c36dc7 255
p_igmon 0:ad6637c36dc7 256 void anykeyon(U8 inkey);
p_igmon 0:ad6637c36dc7 257
p_igmon 0:ad6637c36dc7 258 U8 gen_function_type_byte(GENERATOR *gena_value);
p_igmon 0:ad6637c36dc7 259
p_igmon 0:ad6637c36dc7 260 void test_loop(void);
p_igmon 0:ad6637c36dc7 261 void test_loop2(void);
p_igmon 0:ad6637c36dc7 262
p_igmon 0:ad6637c36dc7 263 extern WaveDef Wave[];
p_igmon 0:ad6637c36dc7 264 extern PresetVoiceDef PresetVoice[];
p_igmon 0:ad6637c36dc7 265 extern GENERATOR sgen[];
p_igmon 0:ad6637c36dc7 266
p_igmon 0:ad6637c36dc7 267
p_igmon 0:ad6637c36dc7 268 #endif
p_igmon 0:ad6637c36dc7 269
p_igmon 0:ad6637c36dc7 270
p_igmon 0:ad6637c36dc7 271
p_igmon 0:ad6637c36dc7 272
p_igmon 0:ad6637c36dc7 273
p_igmon 0:ad6637c36dc7 274
p_igmon 0:ad6637c36dc7 275
p_igmon 0:ad6637c36dc7 276
p_igmon 0:ad6637c36dc7 277