p igmon
/
uGen4x
PCM Digital Synthesizer
main.cpp
- Committer:
- p_igmon
- Date:
- 2016-09-02
- Revision:
- 0:ad6637c36dc7
File content as of revision 0:ad6637c36dc7:
#include "synthesizer.h" Serial pc(SERIAL_TX, SERIAL_RX); //RawSerial pc(SERIAL_TX, SERIAL_RX); RawSerial midi(PB_6, PB_7); // tx, rx USART1 when use I2C_LCD LCD lcd(PB_9,PB_8); DigitalOut myled(LED1); DigitalOut generating(PC_10); DigitalIn SW1(PC_0,PullUp); DigitalIn SW2(PC_1,PullUp); DigitalIn SW3(PC_2,PullUp); DigitalIn SW4(PC_3,PullUp); DigitalIn SW5(PA_0,PullUp); DigitalIn SW6(PA_1,PullUp); DigitalIn SW7(PB_0,PullUp); DigitalIn SW8(PC_12,PullUp); STR_VOICE voice[VOICEMAX]; GENERATOR sgen[PRGGENMAX * 64]; GENERATOR dgen[PRGGENMAX * VOICEMAX]; GENERATOR_TEMP dgen_temp[PRGGENMAX * VOICEMAX]; STR_VOICE *voice_ptr = &voice[0]; GENERATOR *gen ;// = &sgen[PresetVoiceNum - 1] set by Menu PresetVoice GENERATOR *pgen = &dgen[0]; GENERATOR_TEMP *pgen_temp = &dgen_temp[0]; KeyState_TypeDef keystate; #ifdef REVERVE16BIT extern S16 reverve_buf[22000]; extern S16 *reverve_wtemp; #else extern S8 reverve_buf[44000]; extern S8 *reverve_wtemp; #endif extern uint8_t com[16]; extern uint8_t *com_ptr; volatile int TimerCount10mS; volatile int KeyValDiv; U32 PresetVoiceAmount; U32 SGenAmount; int menu_index; volatile U8 key; extern int gen_encount; extern U8 PresetVoiceNum; extern U8 MidiChannel; extern U16 MasterVolume; extern S8 MasterTune; extern U8 midi_base_ch; extern char lcd_string[]; extern char str[]; extern U8 selectsw; extern MenuListDef MenuList[]; extern int rch_pol; extern volatile U8 *midi_rdptr; extern volatile U8 *midi_wrptr; extern volatile U8 midi_receivebuf[]; extern volatile U8 *param_wrptr; extern volatile U8 param_receivebuf[PARAM_BUFSIZE]; extern S16 * DMA_Buffer; extern __IO BUFFER_StateTypeDef BufferOffset; WaveDef Wave[100];// ={ #if 0 /*Name[16] ,startadr ,p1 ,p2 ,cycle */ {"SineWave" ,0 ,50 ,150 ,0}, {"SawWave" ,0 ,100 ,200 ,0}, {"Saw1kWave" ,0 ,1 ,101 ,0}, {"SquareWave" ,0 ,50 ,150 ,0}, {"Square4QWave" ,0 ,1 ,101 ,0}, {"Square8QWave" ,0 ,1 ,101 ,0}, {"Sin124Wave" ,0 ,1 ,101 ,0}, {"Sin13Wave" ,0 ,1 ,43 ,0}, {"fluto" ,0 ,1 ,68 ,0}, {"EnglishHorn" ,0 ,3030 ,3142 ,0}, {"FrenchHorn" ,0 ,3033 ,3132 ,0}, {"1278_trumpet" ,0 ,9089 ,9200 ,0}, {"1507_trumpet" ,0 ,6612 ,6718 ,0}, {"BrassP-C6" ,0 ,2965 ,3133 ,0}, {"Trombone" ,0 ,6852 ,6991 ,0}, {"Tuba_Loud" ,0 ,12686 ,13088 ,0}, {"2524_cello" ,0 ,8683 ,9157 ,0}, {"Contrabassoon" ,0 ,5004 ,5759 ,0}, {"Base-Elec" ,0 ,17400 ,17934 ,0}, {"EFEKTOharp" ,0 ,9423 ,9522 ,0}, {"Harpsicord" ,0 ,21595 ,21764 ,0}, {"Glockenspie" ,0 ,3886 ,3911 ,0}, {"Xylofon" ,0 ,1126 ,1150 ,0}, {"Acoustic Guitar" ,0 ,11422 ,11622 ,0}, {"Piano" ,0 ,6699 ,6783 ,0}, {"Piano 5" ,0 ,13937 ,14335 ,0}, {"Piano 10" ,0 ,11837 ,12005 ,0}, {"VIOLIN1" ,0 ,1 ,56 ,0}, {"Strings" ,0 ,3606 ,37992 ,84}, }; #endif PresetVoiceDef PresetVoice[65];//={ #if 0 /*Name[16] ,DCF Freq ,Q ,FreqEnv ,QEnv */ {"Piano " ,30 ,0 ,0 ,0},// 1 {"Piano 5" ,30 ,0 ,0 ,0},// {"Piano 10" ,30 ,0 ,0 ,0},// {"Electo Piano" ,30 ,0 ,0 ,0},// {"Organ 1" ,30 ,0 ,0 ,0}, {"Organ 2" ,30 ,0 ,0 ,0}, {"Organ 2B" ,30 ,0 ,0 ,0}, {"Synth Strings 1" ,30 ,0 ,0 ,0}, {"Strings 1" ,30 ,0 ,0 ,0}, {"Synthe Brass" ,30 ,0 ,0 ,0}, {"Brass 1" ,30 ,0 ,0 ,0}, {"Brass 2" ,30 ,0 ,0 ,0}, {"EnglishHorn" ,30 ,0 ,0 ,0}, {"Trb" ,30 ,0 ,0 ,0}, {"Tuba" ,30 ,0 ,0 ,0}, {"Harp" ,30 ,0 ,0 ,0}, {"Harpsicord" ,30 ,0 ,0 ,0}, {"Gloccken" ,30 ,0 ,0 ,0}, {"Xylofon" ,30 ,0 ,0 ,0}, {"Fluto" ,30 ,0 ,0 ,0}, {"ContraBass" ,30 ,0 ,0 ,0}, {"Chello&ContBass" ,30 ,0 ,0 ,0}, {"Acoustic Guitar" ,30 ,0 ,0 ,0}, {"Bass" ,30 ,0 ,0 ,0}, {"Bass 2" ,30 ,0 ,0 ,0}, {"User 1" ,30 ,0 ,0 ,0}, {"User 2" ,30 ,0 ,0 ,0}, {"User 3" ,30 ,0 ,0 ,0}, {"User 4" ,30 ,0 ,0 ,0}, {"User 5" ,30 ,0 ,0 ,0}, {"User 6" ,30 ,0 ,0 ,0}, {"User 7" ,30 ,0 ,0 ,0}, {"User 8" ,30 ,0 ,0 ,0}, {"User 9" ,30 ,0 ,0 ,0}, {"User 10" ,30 ,0 ,0 ,0} }; #endif void my_inthandler(void){ while (USART1->SR & (1<<5)){ // RXNE 1: Received data is ready to be read. *midi_wrptr = (uint8_t)(USART1->DR & 0xFF); if (++midi_wrptr >&midi_receivebuf[255]) midi_wrptr = &midi_receivebuf[0];// } } void my_inthandler2(void){ while (USART2->SR & (1<<5)){ // RXNE 1: Received data is ready to be read. *param_wrptr = (uint8_t)(USART2->DR & 0xFF); if (++param_wrptr >¶m_receivebuf[255]) param_wrptr = ¶m_receivebuf[0];// } } void anykeyon(U8 inkey){ U8 temp = inkey & 0x0f; /* Select OneGenSw of them */ if (temp > 7){selectsw = 8;} else if(temp > 3){selectsw = 4;} else if(temp > 1){selectsw = 2;} else if(temp > 0){selectsw = 1;} if (inkey == 0x80){ if (++menu_index > MENU_INDEXMAX) menu_index = MENU_INDEXMAX; }else if(inkey == 0x40){ if(--menu_index < 0) menu_index = 0; } lcd_print1((char *)&MenuList[menu_index].menu); lcd_string[0] = 0; (*MenuList[menu_index].function)(); } int main(){ int temp2; uint8_t *test; uGen4_device_init(); pc.baud(115200); pc.attach(my_inthandler2, Serial::RxIrq); // pc.format(8,RawSerial::None,1); pc.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock); PresetVoiceAmount = (U32)&PresetVoice[63]-(U32)&PresetVoice[0]+sizeof(PresetVoiceDef); SGenAmount = (U32)&sgen[PRGGENMAX * 64-1]-(U32)&sgen[0]+sizeof(GENERATOR); // pc.printf("%d\r\n",PresetVoiceAmount); // pc.printf("%d\r\n",SGenAmount); lcd_print_title(); PresetVoiceNum = 1; MasterVolume = 127<<8; MidiChannel = 1; midi_base_ch = MidiChannel - 1; menu_index = 2; selectsw = 1; keystate = KEY_FIRST_WAIT; MasterTune = 0; rch_pol = 1; limit = 8; TimerCount10mS= 0; KeyValDiv = 1; int KeyAutoLoopCount = 0; reverve_wtemp = reverve_buf; if (temp2 = get_wave_addr(&Wave[0])){ pc.printf("Wave Format Eror No %d\r\n",temp2); lcd_print2("WaveFormatEror"); val2str4(temp2); lcd_print(&str[0]); while(1){} } init_sgen(); voice_ptr = &voice[0]; gen = &sgen[PresetVoiceNum - 1]; pgen = &dgen[0]; pgen_temp = &dgen_temp[0]; gen_encount = 0; init_midi(); midi.attach(my_inthandler, Serial::RxIrq); midi.format(8,RawSerial::None,1); midi.baud(31250); load2from(); uGen4_init(); i2s_dma_init(); init_param(); /* test = (uint8_t *)malloc(60000); if (test == 0) myled =1; */ while(1) { if(BufferOffset != DMA_Idle) wave_generate(); midi_work(); param_work(); switch(keystate){ case KEY_FIRST_WAIT: if (ANYKEYON){ keystate = KEY_AFTER_ON; anykeyon(0); } break; case KEY_GEN_WAVE1: if (TimerCount10mS== 0){ keystate = KEY_WAIT_OFF; TimerCount10mS= 100;// 1000mS Wait } break; case KEY_WAIT_ON: if(key = ANYKEYON){ anykeyon(key);/* call function */ if(keystate == KEY_GEN_WAVE1){ }else{ keystate = KEY_AFTER_ON; TimerCount10mS= 4;// 40mS wait for key stable } } break; case KEY_AFTER_ON: if (TimerCount10mS== 0){ keystate = KEY_WAIT_OFF; TimerCount10mS= 100;// 1000mS Wait } break; case KEY_AUTO_PRESS: anykeyon(key);/* call function */ keystate = KEY_AFTER_AUTO_PRESS; TimerCount10mS = 20;// 200mS Wait break; case KEY_AFTER_AUTO_PRESS: if(key = ANYKEYON){ if (TimerCount10mS== 0){ if(++KeyAutoLoopCount > 40){ KeyAutoLoopCount = 0; KeyValDiv *= 10; if(KeyValDiv >500) KeyValDiv = 500; } keystate = KEY_AUTO_PRESS; } }else{ KeyValDiv = 1; keystate = KEY_AFTER_OFF; TimerCount10mS= 4;// 40mS wait for key stable } break; case KEY_WAIT_OFF: if (TimerCount10mS== 0){ KeyValDiv <<= 2; if(KeyValDiv >500) KeyValDiv = 500; keystate = KEY_AUTO_PRESS; }else if(ANYKEYON == 0){ KeyValDiv = 1; keystate = KEY_AFTER_OFF; TimerCount10mS= 7;// 70mS wait for key stable } break; case KEY_AFTER_OFF: if (TimerCount10mS== 0){ keystate = KEY_WAIT_ON; } break; } } }