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 #include "synthesizer.h"
p_igmon 0:ad6637c36dc7 2
p_igmon 0:ad6637c36dc7 3 U8 PresetVoiceNum;
p_igmon 0:ad6637c36dc7 4 U8 MidiChannel;
p_igmon 0:ad6637c36dc7 5 S8 MasterTune;
p_igmon 0:ad6637c36dc7 6 int rch_pol;
p_igmon 0:ad6637c36dc7 7
p_igmon 0:ad6637c36dc7 8 extern S16 limit;
p_igmon 0:ad6637c36dc7 9
p_igmon 0:ad6637c36dc7 10 extern S16 MasterVolume;
p_igmon 0:ad6637c36dc7 11 U8 midi_base_ch;
p_igmon 0:ad6637c36dc7 12 extern volatile int KeyValDiv;
p_igmon 0:ad6637c36dc7 13
p_igmon 0:ad6637c36dc7 14 char lcd_string[20];
p_igmon 0:ad6637c36dc7 15 U8 selectsw = 0;
p_igmon 0:ad6637c36dc7 16 extern int menu_index;
p_igmon 0:ad6637c36dc7 17 char str[5];
p_igmon 0:ad6637c36dc7 18 char wave_type[5][5]={"Sine","Saw1","Saw2","Tri ","Squr"};
p_igmon 0:ad6637c36dc7 19
p_igmon 0:ad6637c36dc7 20 extern volatile U8 key;
p_igmon 0:ad6637c36dc7 21 extern KeyState_TypeDef keystate;
p_igmon 0:ad6637c36dc7 22
p_igmon 0:ad6637c36dc7 23 extern GENERATOR sgen[];
p_igmon 0:ad6637c36dc7 24 extern GENERATOR dgen[];
p_igmon 0:ad6637c36dc7 25 extern GENERATOR_TEMP dgen_temp[];
p_igmon 0:ad6637c36dc7 26 extern GENERATOR *gen ;// = &sgen[(PresetVoiceNum - 1)*PRGGENMAX] set by Menu PresetVoice
p_igmon 0:ad6637c36dc7 27 extern GENERATOR *pgen;// = &dgen[0];
p_igmon 0:ad6637c36dc7 28 extern GENERATOR_TEMP *pgen_temp;// = &dgen_temp[0];
p_igmon 0:ad6637c36dc7 29
p_igmon 0:ad6637c36dc7 30 extern PresetVoiceDef PresetVoice[];
p_igmon 0:ad6637c36dc7 31 extern WaveDef Wave[];
p_igmon 0:ad6637c36dc7 32
p_igmon 0:ad6637c36dc7 33 MenuListDef MenuList[] ={
p_igmon 0:ad6637c36dc7 34 {"Parameter" ,param ,0 ,0}, // index 0
p_igmon 0:ad6637c36dc7 35 {"RchOut Polarity" ,rch_polarity ,-1 ,1},
p_igmon 0:ad6637c36dc7 36 {"Voice " ,presetvoice ,1 ,64},
p_igmon 0:ad6637c36dc7 37 {"Midi Channel" ,midichannel ,1 ,16},
p_igmon 0:ad6637c36dc7 38 {"MasterTune " ,mastertune ,-128 ,127},
p_igmon 0:ad6637c36dc7 39 // {"DCFF Q FE QE" ,dcfcontrol ,0 ,0},
p_igmon 0:ad6637c36dc7 40 {"Generator Switch" ,gen_sw ,0 ,0},
p_igmon 0:ad6637c36dc7 41 {"Gen WaveNumber" ,gen_wave ,1 ,100},
p_igmon 0:ad6637c36dc7 42 {"Gen NoteShift" ,gen_notebias ,-128 ,127},
p_igmon 0:ad6637c36dc7 43 {"Gen OutputLevel" ,gen_outlevel ,0 ,127},
p_igmon 0:ad6637c36dc7 44 {"Gen Detune" ,gen_detune ,-512 ,511},
p_igmon 0:ad6637c36dc7 45 {"Gen AttackTime" ,gen_attacktime ,1 ,9999},
p_igmon 0:ad6637c36dc7 46 {"Gen DecayTime" ,gen_decaytime ,1 ,9999},
p_igmon 0:ad6637c36dc7 47 {"Gen SustainLevel" ,gen_sustainlevel ,0 ,100},
p_igmon 0:ad6637c36dc7 48 {"Gen ReleaseTime" ,gen_relesetime ,0 ,21}, // 13
p_igmon 0:ad6637c36dc7 49
p_igmon 0:ad6637c36dc7 50 {"Gen LFO1 WavForm" ,gen_lfo1_wavetype ,0 ,4}, // 14 Sine Saw1 Saw2 Tri Rect
p_igmon 0:ad6637c36dc7 51 {"Gen LFO1 Speed" ,gen_lfo1_speed ,0 ,127},
p_igmon 0:ad6637c36dc7 52 {"Gen LFO1 Depth" ,gen_lfo1_depth ,0 ,999},
p_igmon 0:ad6637c36dc7 53 {"Gen LFO1 Delay" ,gen_lfo1_delaytime ,0 ,3000},
p_igmon 0:ad6637c36dc7 54
p_igmon 0:ad6637c36dc7 55 {"Gen LFO2 Speed" ,gen_lfo2_speed ,0 ,127},
p_igmon 0:ad6637c36dc7 56 {"Gen LFO2 Depth" ,gen_lfo2_depth ,0 ,127}, // 19
p_igmon 0:ad6637c36dc7 57 {"Gen LFO2 Delay" ,gen_lfo2_delaytime ,0 ,3000}, // 20
p_igmon 0:ad6637c36dc7 58 {"Gen Limit" ,gen_limit ,0 ,127} // 21
p_igmon 0:ad6637c36dc7 59 };
p_igmon 0:ad6637c36dc7 60
p_igmon 0:ad6637c36dc7 61 void lcd_print(char *str){
p_igmon 0:ad6637c36dc7 62 lcd.printf(str);
p_igmon 0:ad6637c36dc7 63 }
p_igmon 0:ad6637c36dc7 64
p_igmon 0:ad6637c36dc7 65 void lcd_print1(char *str){
p_igmon 0:ad6637c36dc7 66 lcd.cls();
p_igmon 0:ad6637c36dc7 67 lcd.printf(str);
p_igmon 0:ad6637c36dc7 68 }
p_igmon 0:ad6637c36dc7 69
p_igmon 0:ad6637c36dc7 70 void lcd_print2(char *str){
p_igmon 0:ad6637c36dc7 71 lcd.locate(0,1);
p_igmon 0:ad6637c36dc7 72 lcd.printf(str);
p_igmon 0:ad6637c36dc7 73 }
p_igmon 0:ad6637c36dc7 74
p_igmon 0:ad6637c36dc7 75 /* Title "μGen4" */
p_igmon 0:ad6637c36dc7 76 void lcd_print_title(void){
p_igmon 0:ad6637c36dc7 77 lcd.setCGRAM(1<<3,&cgfont[0]);
p_igmon 0:ad6637c36dc7 78 lcd_string[0] = 1;// 'μ'
p_igmon 0:ad6637c36dc7 79 lcd_string[1] = 0;// NULL
p_igmon 0:ad6637c36dc7 80 strcat ((char *)lcd_string,"Gen4 ");
p_igmon 0:ad6637c36dc7 81
p_igmon 0:ad6637c36dc7 82 // strcpy ((char *)lcd_string,"uGen4 ");
p_igmon 0:ad6637c36dc7 83 strcat ((char *)lcd_string,FWVERSION);
p_igmon 0:ad6637c36dc7 84 lcd_print1((char *)lcd_string);
p_igmon 0:ad6637c36dc7 85 strcpy((char *)lcd_string," Synthesizer");
p_igmon 0:ad6637c36dc7 86 lcd_print2((char *)lcd_string);
p_igmon 0:ad6637c36dc7 87
p_igmon 0:ad6637c36dc7 88 }
p_igmon 0:ad6637c36dc7 89
p_igmon 0:ad6637c36dc7 90 void gen_limit(void){
p_igmon 0:ad6637c36dc7 91 int value = limit;
p_igmon 0:ad6637c36dc7 92 if(key & 0x10){
p_igmon 0:ad6637c36dc7 93 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 94 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 95 }else if(key & 0x20){
p_igmon 0:ad6637c36dc7 96 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 97 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 98
p_igmon 0:ad6637c36dc7 99 }
p_igmon 0:ad6637c36dc7 100 limit = value;
p_igmon 0:ad6637c36dc7 101 val2str4(limit);
p_igmon 0:ad6637c36dc7 102 lcd_print(&str[0]);
p_igmon 0:ad6637c36dc7 103 }
p_igmon 0:ad6637c36dc7 104
p_igmon 0:ad6637c36dc7 105 void presetvoice(void){
p_igmon 0:ad6637c36dc7 106 int value = PresetVoiceNum;
p_igmon 0:ad6637c36dc7 107 if(key & 0x10){
p_igmon 0:ad6637c36dc7 108 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 109 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 110 }else if(key & 0x20){
p_igmon 0:ad6637c36dc7 111 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 112 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 113
p_igmon 0:ad6637c36dc7 114 }
p_igmon 0:ad6637c36dc7 115 lcd_print1("Voice ");
p_igmon 0:ad6637c36dc7 116 PresetVoiceNum = value;
p_igmon 0:ad6637c36dc7 117 gen = (GENERATOR *)&sgen[(PresetVoiceNum - 1)*PRGGENMAX];
p_igmon 0:ad6637c36dc7 118 val2str4(PresetVoiceNum);
p_igmon 0:ad6637c36dc7 119 lcd_print(&str[0]);
p_igmon 0:ad6637c36dc7 120 lcd_print2(PresetVoice[PresetVoiceNum-1].name);
p_igmon 0:ad6637c36dc7 121 }
p_igmon 0:ad6637c36dc7 122
p_igmon 0:ad6637c36dc7 123 void param(void){
p_igmon 0:ad6637c36dc7 124 lcd_print2("SaveLoad PC");
p_igmon 0:ad6637c36dc7 125 if(SELECTSW1){
p_igmon 0:ad6637c36dc7 126 save2from();
p_igmon 0:ad6637c36dc7 127 lcd_print2("Saved Parameter ");
p_igmon 0:ad6637c36dc7 128 }else if(SELECTSW2){
p_igmon 0:ad6637c36dc7 129 load2from();
p_igmon 0:ad6637c36dc7 130 lcd_print2("Loaded Parameter");
p_igmon 0:ad6637c36dc7 131 }else if(SELECTSW3){
p_igmon 0:ad6637c36dc7 132 lcd_print2("DumppingToSerial");
p_igmon 0:ad6637c36dc7 133 dump2serial();
p_igmon 0:ad6637c36dc7 134 lcd_print2("Complete ");
p_igmon 0:ad6637c36dc7 135 }
p_igmon 0:ad6637c36dc7 136 }
p_igmon 0:ad6637c36dc7 137
p_igmon 0:ad6637c36dc7 138 void mastertune(void){
p_igmon 0:ad6637c36dc7 139 int value = MasterTune;
p_igmon 0:ad6637c36dc7 140 if(key & 0x10){
p_igmon 0:ad6637c36dc7 141 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 142 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 143 }else if(key & 0x20){
p_igmon 0:ad6637c36dc7 144 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 145 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 146
p_igmon 0:ad6637c36dc7 147 }
p_igmon 0:ad6637c36dc7 148 MasterTune = value;
p_igmon 0:ad6637c36dc7 149 val2str4(MasterTune);
p_igmon 0:ad6637c36dc7 150 lcd_print(&str[0]);
p_igmon 0:ad6637c36dc7 151 }
p_igmon 0:ad6637c36dc7 152
p_igmon 0:ad6637c36dc7 153 void rch_polarity(void){
p_igmon 0:ad6637c36dc7 154 int value = rch_pol;
p_igmon 0:ad6637c36dc7 155 if(key & 0x10){
p_igmon 0:ad6637c36dc7 156 value = -1;
p_igmon 0:ad6637c36dc7 157 }else if(key & 0x20){
p_igmon 0:ad6637c36dc7 158 value = 1;
p_igmon 0:ad6637c36dc7 159 }
p_igmon 0:ad6637c36dc7 160 rch_pol = value;
p_igmon 0:ad6637c36dc7 161
p_igmon 0:ad6637c36dc7 162 if (rch_pol > 0){
p_igmon 0:ad6637c36dc7 163 strcpy(lcd_string,"Same as LchOut");
p_igmon 0:ad6637c36dc7 164 }else{
p_igmon 0:ad6637c36dc7 165 strcpy(lcd_string,"Invert");
p_igmon 0:ad6637c36dc7 166 }
p_igmon 0:ad6637c36dc7 167 lcd_print1("RchOut Polarity");
p_igmon 0:ad6637c36dc7 168 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 169 }
p_igmon 0:ad6637c36dc7 170
p_igmon 0:ad6637c36dc7 171 void dcfcontrol(void){
p_igmon 0:ad6637c36dc7 172 /* DCFF Q FE QE */
p_igmon 0:ad6637c36dc7 173 int value = PresetVoice[PresetVoiceNum - 1].dcf_freq;
p_igmon 0:ad6637c36dc7 174 if (selectsw & 1){
p_igmon 0:ad6637c36dc7 175 if(key & 0x20){
p_igmon 0:ad6637c36dc7 176 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 177 if(value > 30) value = 30;
p_igmon 0:ad6637c36dc7 178 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 179 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 180 if(value < 0) value = 0;
p_igmon 0:ad6637c36dc7 181 }
p_igmon 0:ad6637c36dc7 182 PresetVoice[PresetVoiceNum - 1].dcf_freq = value;
p_igmon 0:ad6637c36dc7 183 }
p_igmon 0:ad6637c36dc7 184 val2str4(value);
p_igmon 0:ad6637c36dc7 185 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 186
p_igmon 0:ad6637c36dc7 187 value = PresetVoice[PresetVoiceNum - 1].dcf_q;
p_igmon 0:ad6637c36dc7 188 if (selectsw & 2){
p_igmon 0:ad6637c36dc7 189 if(key & 0x20){
p_igmon 0:ad6637c36dc7 190 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 191 if(value > 10) value = 10;
p_igmon 0:ad6637c36dc7 192 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 193 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 194 if(value < 0) value = 0;
p_igmon 0:ad6637c36dc7 195 }
p_igmon 0:ad6637c36dc7 196 PresetVoice[PresetVoiceNum - 1].dcf_q = value;
p_igmon 0:ad6637c36dc7 197 }
p_igmon 0:ad6637c36dc7 198 val2str4(value);
p_igmon 0:ad6637c36dc7 199 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 200
p_igmon 0:ad6637c36dc7 201 value = PresetVoice[PresetVoiceNum - 1].dcf_freqsence;
p_igmon 0:ad6637c36dc7 202 if (selectsw & 4){
p_igmon 0:ad6637c36dc7 203 if(key & 0x20){
p_igmon 0:ad6637c36dc7 204 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 205 if(value > 10) value = 10;
p_igmon 0:ad6637c36dc7 206 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 207 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 208 if(value < 0) value = 0;
p_igmon 0:ad6637c36dc7 209 }
p_igmon 0:ad6637c36dc7 210 PresetVoice[PresetVoiceNum - 1].dcf_freqsence = value;
p_igmon 0:ad6637c36dc7 211 }
p_igmon 0:ad6637c36dc7 212 val2str4(value);
p_igmon 0:ad6637c36dc7 213 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 214
p_igmon 0:ad6637c36dc7 215
p_igmon 0:ad6637c36dc7 216 value = PresetVoice[PresetVoiceNum - 1].dcf_qsence;
p_igmon 0:ad6637c36dc7 217 if (selectsw & 8){
p_igmon 0:ad6637c36dc7 218 if(key & 0x20){
p_igmon 0:ad6637c36dc7 219 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 220 if(value > 10) value = 10;
p_igmon 0:ad6637c36dc7 221 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 222 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 223 if(value < 0) value = 0;
p_igmon 0:ad6637c36dc7 224 }
p_igmon 0:ad6637c36dc7 225 PresetVoice[PresetVoiceNum - 1].dcf_qsence = value;
p_igmon 0:ad6637c36dc7 226 }
p_igmon 0:ad6637c36dc7 227 val2str4(value);
p_igmon 0:ad6637c36dc7 228 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 229
p_igmon 0:ad6637c36dc7 230 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 231 }
p_igmon 0:ad6637c36dc7 232
p_igmon 0:ad6637c36dc7 233 void gen_sw(void){
p_igmon 0:ad6637c36dc7 234 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 235 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 236 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 237 while(n--){
p_igmon 0:ad6637c36dc7 238 if(key & bitsw){
p_igmon 0:ad6637c36dc7 239 gena->sw ^= 1;
p_igmon 0:ad6637c36dc7 240 gena->sw &= 1;
p_igmon 0:ad6637c36dc7 241 }
p_igmon 0:ad6637c36dc7 242 if(gena->sw){
p_igmon 0:ad6637c36dc7 243 strcat(lcd_string," On ");
p_igmon 0:ad6637c36dc7 244 }else{
p_igmon 0:ad6637c36dc7 245 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 246 }
p_igmon 0:ad6637c36dc7 247 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 248 gena++;
p_igmon 0:ad6637c36dc7 249 }
p_igmon 0:ad6637c36dc7 250 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 251 }
p_igmon 0:ad6637c36dc7 252
p_igmon 0:ad6637c36dc7 253 void midichannel(void){
p_igmon 0:ad6637c36dc7 254 int value = MidiChannel;
p_igmon 0:ad6637c36dc7 255 if(key & 0x10){
p_igmon 0:ad6637c36dc7 256 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 257 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 258 }else if(key & 0x20){
p_igmon 0:ad6637c36dc7 259 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 260 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 261
p_igmon 0:ad6637c36dc7 262 }
p_igmon 0:ad6637c36dc7 263 MidiChannel = value;
p_igmon 0:ad6637c36dc7 264 midi_base_ch = value -1;
p_igmon 0:ad6637c36dc7 265 val2str4(MidiChannel);
p_igmon 0:ad6637c36dc7 266 lcd_print(&str[0]);
p_igmon 0:ad6637c36dc7 267 }
p_igmon 0:ad6637c36dc7 268
p_igmon 0:ad6637c36dc7 269 void gen_outlevel(void){
p_igmon 0:ad6637c36dc7 270 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 271 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 272 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 273 while(n--){
p_igmon 0:ad6637c36dc7 274 int value = (gena->volume>>8);
p_igmon 0:ad6637c36dc7 275 if (gena->sw){
p_igmon 0:ad6637c36dc7 276 if(selectsw & bitsw){
p_igmon 0:ad6637c36dc7 277 if(key & 0x20){
p_igmon 0:ad6637c36dc7 278 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 279 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 280 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 281 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 282 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 283 }
p_igmon 0:ad6637c36dc7 284 gena->volume = (value<<8);
p_igmon 0:ad6637c36dc7 285 }
p_igmon 0:ad6637c36dc7 286 val2str4((gena->volume)>>8);
p_igmon 0:ad6637c36dc7 287 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 288 }else{
p_igmon 0:ad6637c36dc7 289 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 290 }
p_igmon 0:ad6637c36dc7 291 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 292 gena++;
p_igmon 0:ad6637c36dc7 293 }
p_igmon 0:ad6637c36dc7 294
p_igmon 0:ad6637c36dc7 295 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 296 }
p_igmon 0:ad6637c36dc7 297
p_igmon 0:ad6637c36dc7 298 void gen_lfo1_wavetype(void){
p_igmon 0:ad6637c36dc7 299 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 300 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 301 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 302 while(n--){
p_igmon 0:ad6637c36dc7 303 int value = gena->lfo1type;
p_igmon 0:ad6637c36dc7 304 if (gena->sw){
p_igmon 0:ad6637c36dc7 305 if(selectsw & bitsw){
p_igmon 0:ad6637c36dc7 306 if(key & 0x10){
p_igmon 0:ad6637c36dc7 307 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 308 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 309 }else if(key & 0x20){
p_igmon 0:ad6637c36dc7 310 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 311 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 312 }
p_igmon 0:ad6637c36dc7 313 }
p_igmon 0:ad6637c36dc7 314 gena->lfo1type = value;
p_igmon 0:ad6637c36dc7 315 strcat(lcd_string, &wave_type[value][0]);
p_igmon 0:ad6637c36dc7 316 }else{
p_igmon 0:ad6637c36dc7 317 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 318 }
p_igmon 0:ad6637c36dc7 319 gena++;
p_igmon 0:ad6637c36dc7 320 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 321 }
p_igmon 0:ad6637c36dc7 322 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 323 }
p_igmon 0:ad6637c36dc7 324
p_igmon 0:ad6637c36dc7 325
p_igmon 0:ad6637c36dc7 326 U8 gen_function_type_byte(GENERATOR *gena_value){
p_igmon 0:ad6637c36dc7 327 int value ,value1;
p_igmon 0:ad6637c36dc7 328 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 329 U32 temp = (U32)gena_value - (U32)gena;
p_igmon 0:ad6637c36dc7 330 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 331 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 332 while(n--){
p_igmon 0:ad6637c36dc7 333 value = *(U8 *)( (U32)gena + temp );
p_igmon 0:ad6637c36dc7 334 if(gena->sw){
p_igmon 0:ad6637c36dc7 335 if (selectsw & bitsw){
p_igmon 0:ad6637c36dc7 336 if(key & 0x20){
p_igmon 0:ad6637c36dc7 337 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 338 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 339 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 340 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 341 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 342 }
p_igmon 0:ad6637c36dc7 343 *(U8 *)( (U32)gena + temp )= value;
p_igmon 0:ad6637c36dc7 344 value1 = value;
p_igmon 0:ad6637c36dc7 345 }
p_igmon 0:ad6637c36dc7 346 val2str4(value);
p_igmon 0:ad6637c36dc7 347 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 348 }else{
p_igmon 0:ad6637c36dc7 349 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 350 }
p_igmon 0:ad6637c36dc7 351 gena++;
p_igmon 0:ad6637c36dc7 352 gena_value++;
p_igmon 0:ad6637c36dc7 353 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 354 }
p_igmon 0:ad6637c36dc7 355
p_igmon 0:ad6637c36dc7 356 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 357 return (U8)value1;
p_igmon 0:ad6637c36dc7 358 }
p_igmon 0:ad6637c36dc7 359
p_igmon 0:ad6637c36dc7 360 void gen_function_type_word(GENERATOR *gena_value){
p_igmon 0:ad6637c36dc7 361 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 362 U32 temp = (U32)gena_value - (U32)gena;
p_igmon 0:ad6637c36dc7 363 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 364 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 365 while(n--){
p_igmon 0:ad6637c36dc7 366 int value = *(U16 *)( (U32)gena + temp );
p_igmon 0:ad6637c36dc7 367 if(gena->sw){
p_igmon 0:ad6637c36dc7 368 if (selectsw & bitsw){
p_igmon 0:ad6637c36dc7 369 if(key & 0x20){
p_igmon 0:ad6637c36dc7 370 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 371 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 372 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 373 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 374 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 375 }
p_igmon 0:ad6637c36dc7 376 *(U16 *)( (U32)gena + temp )= value;
p_igmon 0:ad6637c36dc7 377 }
p_igmon 0:ad6637c36dc7 378 val2str4(value);
p_igmon 0:ad6637c36dc7 379 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 380 }else{
p_igmon 0:ad6637c36dc7 381 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 382 }
p_igmon 0:ad6637c36dc7 383 gena++;
p_igmon 0:ad6637c36dc7 384 gena_value++;
p_igmon 0:ad6637c36dc7 385 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 386 }
p_igmon 0:ad6637c36dc7 387
p_igmon 0:ad6637c36dc7 388 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 389 }
p_igmon 0:ad6637c36dc7 390
p_igmon 0:ad6637c36dc7 391 void gen_function_type_sbyte(GENERATOR *gena_value){
p_igmon 0:ad6637c36dc7 392 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 393 U32 temp = (U32)gena_value - (U32)gena;
p_igmon 0:ad6637c36dc7 394 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 395 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 396 while(n--){
p_igmon 0:ad6637c36dc7 397 int value = *(S8 *)( (U32)gena + temp );
p_igmon 0:ad6637c36dc7 398 if(gena->sw){
p_igmon 0:ad6637c36dc7 399 if (selectsw & bitsw){
p_igmon 0:ad6637c36dc7 400 if(key & 0x20){
p_igmon 0:ad6637c36dc7 401 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 402 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 403 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 404 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 405 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 406 }
p_igmon 0:ad6637c36dc7 407 *(S8 *)( (U32)gena + temp )= value;
p_igmon 0:ad6637c36dc7 408
p_igmon 0:ad6637c36dc7 409 }
p_igmon 0:ad6637c36dc7 410 val2str4(value);
p_igmon 0:ad6637c36dc7 411 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 412 }else{
p_igmon 0:ad6637c36dc7 413 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 414 }
p_igmon 0:ad6637c36dc7 415 gena++;
p_igmon 0:ad6637c36dc7 416 gena_value++;
p_igmon 0:ad6637c36dc7 417 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 418 }
p_igmon 0:ad6637c36dc7 419
p_igmon 0:ad6637c36dc7 420 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 421
p_igmon 0:ad6637c36dc7 422 }
p_igmon 0:ad6637c36dc7 423 void gen_function_type_sword(GENERATOR *gena_value){
p_igmon 0:ad6637c36dc7 424 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 425 U32 temp = (U32)gena_value - (U32)gena;
p_igmon 0:ad6637c36dc7 426 int n = PRGGENMAX;
p_igmon 0:ad6637c36dc7 427 U8 bitsw = 1;
p_igmon 0:ad6637c36dc7 428 while(n--){
p_igmon 0:ad6637c36dc7 429 int value = *(S16 *)( (U32)gena + temp );
p_igmon 0:ad6637c36dc7 430 if(gena->sw){
p_igmon 0:ad6637c36dc7 431 if (selectsw & bitsw){
p_igmon 0:ad6637c36dc7 432 if(key & 0x20){
p_igmon 0:ad6637c36dc7 433 value += KeyValDiv;
p_igmon 0:ad6637c36dc7 434 if(value > MenuList[menu_index].max) value = MenuList[menu_index].max;
p_igmon 0:ad6637c36dc7 435 }else if(key & 0x10){
p_igmon 0:ad6637c36dc7 436 value -= KeyValDiv;
p_igmon 0:ad6637c36dc7 437 if(value < MenuList[menu_index].min) value = MenuList[menu_index].min;
p_igmon 0:ad6637c36dc7 438 }
p_igmon 0:ad6637c36dc7 439 *(S16 *)( (U32)gena + temp )= value;
p_igmon 0:ad6637c36dc7 440
p_igmon 0:ad6637c36dc7 441 }
p_igmon 0:ad6637c36dc7 442 val2str4(value);
p_igmon 0:ad6637c36dc7 443 strcat(lcd_string, &str[0]);
p_igmon 0:ad6637c36dc7 444 }else{
p_igmon 0:ad6637c36dc7 445 strcat(lcd_string," Off");
p_igmon 0:ad6637c36dc7 446 }
p_igmon 0:ad6637c36dc7 447 gena++;
p_igmon 0:ad6637c36dc7 448 gena_value++;
p_igmon 0:ad6637c36dc7 449 bitsw <<= 1;
p_igmon 0:ad6637c36dc7 450 }
p_igmon 0:ad6637c36dc7 451
p_igmon 0:ad6637c36dc7 452 lcd_print2(lcd_string);
p_igmon 0:ad6637c36dc7 453
p_igmon 0:ad6637c36dc7 454 }
p_igmon 0:ad6637c36dc7 455
p_igmon 0:ad6637c36dc7 456
p_igmon 0:ad6637c36dc7 457 void gen_attacktime(void){
p_igmon 0:ad6637c36dc7 458 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 459 GENERATOR *gena_value = (GENERATOR *)&gena->attacktime;
p_igmon 0:ad6637c36dc7 460 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 461 }
p_igmon 0:ad6637c36dc7 462
p_igmon 0:ad6637c36dc7 463 void gen_wave (void){
p_igmon 0:ad6637c36dc7 464 // pc.printf("PresetVoiceNum = %d\r\n",PresetVoiceNum);
p_igmon 0:ad6637c36dc7 465 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 466 GENERATOR *gena_value = (GENERATOR *)&gena->wave_num;
p_igmon 0:ad6637c36dc7 467 U8 value = gen_function_type_byte(gena_value);
p_igmon 0:ad6637c36dc7 468 if(key & 0x30){// when push Value+- key
p_igmon 0:ad6637c36dc7 469 lcd_print2(" ");
p_igmon 0:ad6637c36dc7 470 lcd_print2(Wave[value - 1].name);
p_igmon 0:ad6637c36dc7 471 // keystate = KEY_GEN_WAVE1;
p_igmon 0:ad6637c36dc7 472 // TimerCount10mS= 100;// 1000mS Wait
p_igmon 0:ad6637c36dc7 473 }
p_igmon 0:ad6637c36dc7 474 }
p_igmon 0:ad6637c36dc7 475
p_igmon 0:ad6637c36dc7 476 void gen_notebias(void){
p_igmon 0:ad6637c36dc7 477 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 478 GENERATOR *gena_value = (GENERATOR *)&gena->notebias;
p_igmon 0:ad6637c36dc7 479 gen_function_type_sbyte(gena_value);
p_igmon 0:ad6637c36dc7 480 }
p_igmon 0:ad6637c36dc7 481
p_igmon 0:ad6637c36dc7 482 void gen_detune(void){
p_igmon 0:ad6637c36dc7 483 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 484 GENERATOR *gena_value = (GENERATOR *)&gena->detune;
p_igmon 0:ad6637c36dc7 485 gen_function_type_sword(gena_value);
p_igmon 0:ad6637c36dc7 486 }
p_igmon 0:ad6637c36dc7 487
p_igmon 0:ad6637c36dc7 488 void gen_decaytime(void){
p_igmon 0:ad6637c36dc7 489 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 490 GENERATOR *gena_value = (GENERATOR *)&gena->decaytime;
p_igmon 0:ad6637c36dc7 491 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 492 }
p_igmon 0:ad6637c36dc7 493 void gen_sustainlevel(void){
p_igmon 0:ad6637c36dc7 494 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 495 GENERATOR *gena_value = (GENERATOR *)&gena->sustainlevel;
p_igmon 0:ad6637c36dc7 496 gen_function_type_byte(gena_value);
p_igmon 0:ad6637c36dc7 497 }
p_igmon 0:ad6637c36dc7 498 void gen_relesetime(void){
p_igmon 0:ad6637c36dc7 499 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 500 GENERATOR *gena_value = (GENERATOR *)&gena->releasetime;
p_igmon 0:ad6637c36dc7 501 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 502 }
p_igmon 0:ad6637c36dc7 503
p_igmon 0:ad6637c36dc7 504 void gen_lfo1_speed (void){
p_igmon 0:ad6637c36dc7 505 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 506 GENERATOR *gena_value = (GENERATOR *)&gena->lfo1speed;
p_igmon 0:ad6637c36dc7 507 gen_function_type_byte(gena_value);
p_igmon 0:ad6637c36dc7 508 }
p_igmon 0:ad6637c36dc7 509
p_igmon 0:ad6637c36dc7 510
p_igmon 0:ad6637c36dc7 511 void gen_lfo1_depth(void){
p_igmon 0:ad6637c36dc7 512 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 513 GENERATOR *gena_value = (GENERATOR *)&gena->lfo1depth;
p_igmon 0:ad6637c36dc7 514 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 515 }
p_igmon 0:ad6637c36dc7 516
p_igmon 0:ad6637c36dc7 517 void gen_lfo1_delaytime(void){
p_igmon 0:ad6637c36dc7 518 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 519 GENERATOR *gena_value = (GENERATOR *)&gena->lfo1delaytime;
p_igmon 0:ad6637c36dc7 520 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 521 }
p_igmon 0:ad6637c36dc7 522
p_igmon 0:ad6637c36dc7 523 void gen_lfo2_delaytime(void){
p_igmon 0:ad6637c36dc7 524 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 525 GENERATOR *gena_value = (GENERATOR *)&gena->lfo2delaytime;
p_igmon 0:ad6637c36dc7 526 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 527 }
p_igmon 0:ad6637c36dc7 528
p_igmon 0:ad6637c36dc7 529 void gen_lfo2_speed (void){
p_igmon 0:ad6637c36dc7 530 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 531 GENERATOR *gena_value = (GENERATOR *)&gena->lfo2speed;
p_igmon 0:ad6637c36dc7 532 gen_function_type_byte(gena_value);
p_igmon 0:ad6637c36dc7 533 }
p_igmon 0:ad6637c36dc7 534
p_igmon 0:ad6637c36dc7 535 void gen_lfo2_depth(void){
p_igmon 0:ad6637c36dc7 536 GENERATOR *gena = &sgen[(PresetVoiceNum-1) * PRGGENMAX];
p_igmon 0:ad6637c36dc7 537 GENERATOR *gena_value = (GENERATOR *)&gena->lfo2depth;
p_igmon 0:ad6637c36dc7 538 gen_function_type_word(gena_value);
p_igmon 0:ad6637c36dc7 539 }
p_igmon 0:ad6637c36dc7 540
p_igmon 0:ad6637c36dc7 541 char *val2str4(int value){
p_igmon 0:ad6637c36dc7 542 uint8_t n;
p_igmon 0:ad6637c36dc7 543 char *c;
p_igmon 0:ad6637c36dc7 544 int value_temp = value;
p_igmon 0:ad6637c36dc7 545 if (value < 0){
p_igmon 0:ad6637c36dc7 546 str[0] = '-';
p_igmon 0:ad6637c36dc7 547 value_temp *= -1;
p_igmon 0:ad6637c36dc7 548
p_igmon 0:ad6637c36dc7 549 n = 0;
p_igmon 0:ad6637c36dc7 550 while(value_temp >= 100){
p_igmon 0:ad6637c36dc7 551 value_temp -= 100;
p_igmon 0:ad6637c36dc7 552 n++;
p_igmon 0:ad6637c36dc7 553 }
p_igmon 0:ad6637c36dc7 554 str[1] = 0x30 + n;
p_igmon 0:ad6637c36dc7 555 n = 0;
p_igmon 0:ad6637c36dc7 556 while(value_temp >= 10){
p_igmon 0:ad6637c36dc7 557 value_temp -= 10;
p_igmon 0:ad6637c36dc7 558 n++;
p_igmon 0:ad6637c36dc7 559 }
p_igmon 0:ad6637c36dc7 560 str[2] = 0x30 + n;
p_igmon 0:ad6637c36dc7 561 str[3] = 0x30 + value_temp;
p_igmon 0:ad6637c36dc7 562 /*
p_igmon 0:ad6637c36dc7 563 if (value_temp >99){
p_igmon 0:ad6637c36dc7 564 str[1] = '1';
p_igmon 0:ad6637c36dc7 565 value_temp -= 100;
p_igmon 0:ad6637c36dc7 566 }else{
p_igmon 0:ad6637c36dc7 567 str[1] = '0';
p_igmon 0:ad6637c36dc7 568 }
p_igmon 0:ad6637c36dc7 569 n = 0;
p_igmon 0:ad6637c36dc7 570 while(value_temp >= 10){
p_igmon 0:ad6637c36dc7 571 value_temp -= 10;
p_igmon 0:ad6637c36dc7 572 n++;
p_igmon 0:ad6637c36dc7 573 }
p_igmon 0:ad6637c36dc7 574 str[2] = 0x30 + n;
p_igmon 0:ad6637c36dc7 575 str[3] = 0x30 + value_temp;
p_igmon 0:ad6637c36dc7 576 */
p_igmon 0:ad6637c36dc7 577 }else{
p_igmon 0:ad6637c36dc7 578 n = 0;
p_igmon 0:ad6637c36dc7 579 while(value_temp >= 1000){
p_igmon 0:ad6637c36dc7 580 value_temp -= 1000;
p_igmon 0:ad6637c36dc7 581 n++;
p_igmon 0:ad6637c36dc7 582 }
p_igmon 0:ad6637c36dc7 583 str[0] = 0x30 + n;
p_igmon 0:ad6637c36dc7 584 n = 0;
p_igmon 0:ad6637c36dc7 585 while(value_temp >= 100){
p_igmon 0:ad6637c36dc7 586 value_temp -= 100;
p_igmon 0:ad6637c36dc7 587 n++;
p_igmon 0:ad6637c36dc7 588 }
p_igmon 0:ad6637c36dc7 589 str[1] = 0x30 + n;
p_igmon 0:ad6637c36dc7 590 n = 0;
p_igmon 0:ad6637c36dc7 591 while(value_temp >= 10){
p_igmon 0:ad6637c36dc7 592 value_temp -= 10;
p_igmon 0:ad6637c36dc7 593 n++;
p_igmon 0:ad6637c36dc7 594 }
p_igmon 0:ad6637c36dc7 595 str[2] = 0x30 + n;
p_igmon 0:ad6637c36dc7 596 str[3] = 0x30 + value_temp;
p_igmon 0:ad6637c36dc7 597 }
p_igmon 0:ad6637c36dc7 598
p_igmon 0:ad6637c36dc7 599 n = 3;
p_igmon 0:ad6637c36dc7 600 c = &str[0];
p_igmon 0:ad6637c36dc7 601 while(n-- >0){
p_igmon 0:ad6637c36dc7 602 if ((*c != '0')&&(*c != '-')) break;
p_igmon 0:ad6637c36dc7 603 if (*c != '-') *c = ' ';
p_igmon 0:ad6637c36dc7 604 c++;
p_igmon 0:ad6637c36dc7 605 }
p_igmon 0:ad6637c36dc7 606 if (str[0] == '-'){
p_igmon 0:ad6637c36dc7 607 if (str[2] == ' '){// - n -> -n
p_igmon 0:ad6637c36dc7 608 str[0] = str[1] = ' ';
p_igmon 0:ad6637c36dc7 609 str[2] = '-';
p_igmon 0:ad6637c36dc7 610 }else if (str[1] == ' '){// - mn -> -mn
p_igmon 0:ad6637c36dc7 611 str[0] = ' ';
p_igmon 0:ad6637c36dc7 612 str[1] = '-';
p_igmon 0:ad6637c36dc7 613 }
p_igmon 0:ad6637c36dc7 614 }
p_igmon 0:ad6637c36dc7 615 str[4] = 0;
p_igmon 0:ad6637c36dc7 616 return &str[4];
p_igmon 0:ad6637c36dc7 617 }
p_igmon 0:ad6637c36dc7 618
p_igmon 0:ad6637c36dc7 619