faker 1968
/
Effector_110613
Diff: main.cpp
- Revision:
- 0:adfbd02222d4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jun 13 15:20:17 2011 +0000 @@ -0,0 +1,566 @@ +/*****************************************************/ +/* MBED MULTI EFFECTOR */ +/* */ +/* */ +/*****************************************************/ + +#include "mbed.h" +#include "EffectParam.h" +#include "TextLCD.h" +#include "R_Sw_Check.h" +#include "Distotion_Unit.h" +#include "Delay_Unit.h" + +//Serial debug(USBTX, USBRX); // tx, rx + +LocalFileSystem local("local"); +Ticker sampling; + +AnalogIn Ain(p17); // Audio Input +AnalogOut Aout(p18); // Audio Output +TextLCD lcd(p24, p25, p26, p27, p28, p29, p30); // rs, rw, e, d0, d1, d2, d3) +DigitalIn Rsw0A(p5); // Rotary SW 0 +DigitalIn Rsw0B(p6); +DigitalIn Rsw1A(p7); // Rotary SW 1 +DigitalIn Rsw1B(p8); +DigitalIn Rsw2A(p9); // Rotary SW 2 +DigitalIn Rsw2B(p10); +DigitalIn Rsw3A(p11); // Rotary SW 3 +DigitalIn Rsw3B(p12); +DigitalOut busyFlag(p13); // Effect Proc Busy Flag + +/*******************************/ +/* For Test Signal */ +/*******************************/ +#define TEST_SIGNAL_ENABLE (0) // 1 : Internal SinWave for Debug +#define TEST_SIGNAL_FREQ (1000.0) // Frequency [Hz] +#define TEST_SIGNAL_AMP (30000.0) // Amplitude +#define PAI (3.14159) + +/*******************************/ +/* For ADC & DAC Setting */ +/*******************************/ +#define SAMPLING_TIME (25.0) // ADC Sampling Rate [us] +volatile unsigned int *g_usiAd0cr, *g_usiAd0dr2; // ADC Reg +unsigned int *g_usiDacr; // DAC Reg + +/*******************************/ +/* Gloval Valinat */ +/*******************************/ +unsigned int g_usiFinalOut; // DAC Out Final Data +int g_ssBuff[10]; // Audio Data Buff +float g_fTestWaveT; // Test Sin Wave Phase +int g_iBankNo = 0; // Parameter Patch Bank No +int g_iProgNo = 0; // Parameter Patch Program No +int g_iFlag = 0; // Pacth Write Flag +int g_iProgPatch[BANK_MAX_NUM][PROGNO_MAX_NUM][PP_MAX_NUM]; // Parameter Data + + +/*******************************/ +/* Function */ +/*******************************/ +int main(void); +void effectProcess(void); // Effect Process Function +void paramCheck(int*, int*); // Paramter Range Check +void param1Change(int*, int*, int*, int*); // Process for Changed Rotary SW1 +void param2Change(int*, int*, int*, int*); // Process for Changed Rotary SW2 +void param3Change(int*, int*, int*, int*); // Process for Changed Rotary SW3 +void param4Change(int*, int*, int*, int*); // Process for Changed Rotary SW4 + +void progWrite(int*); // +void distParamChange(int*, int*); // Change Parameter for Ditotion +void delayParamChange(int*, int*); // Change PArameter for Delay + +void progPatchWite(int); // Paramter Write for Flash ROM +void ProgramPatchChange(int, int); // + +/*******************************/ +/* Effect Process */ +/*******************************/ +void effectProcess() { + busyFlag = 1; + // Line Out + *g_usiDacr = g_usiFinalOut; + // ADC Start + *g_usiAd0cr = 0x01200204; + +#if (TEST_SIGNAL_ENABLE == 1) // Test Signal Sin Wave + g_ssBuff[0] = TEST_SIGNAL_AMP * sin(g_fTestWaveT); + g_fTestWaveT = g_fTestWaveT + 2.0 * PAI * SAMPLING_TIME * TEST_SIGNAL_FREQ / 1e6; + if (g_fTestWaveT >= (2.0 * PAI))g_fTestWaveT = 0; +#endif + + // + // Effect Func + // + + g_ssBuff[1] = distotion(g_ssBuff[0]); // Call Distotion Function + g_ssBuff[2] = delay(g_ssBuff[1]); // CAll Delay Function + + // + // Effect Func + // + +#if (TEST_SIGNAL_ENABLE == 0) + while (1) { + if ((*g_usiAd0dr2 & 0x80000000) != 0)break; // ADC Done ? + } + g_ssBuff[0] = (int)(*g_usiAd0dr2 & 0x0000FFF0) - 32768; +#endif + + g_usiFinalOut = 0x00010000 | (g_ssBuff[2] + 32768); + + busyFlag = 0; +} + + + + +/*******************************/ +/* MAIN */ +/*******************************/ +int main() { + + int i ,j ,k; + int iTemp1, iTemp2; + int iParamSwPol[4]; + int iRsw1Num, iRsw2Num, iRsw3Num, iRsw4Num; + char str1[256], str2[256]; + + iRsw1Num = iRsw2Num = iRsw3Num = iRsw4Num = 0; + + // LCD INIT + lcd.cls(); + lcd.locate(0,0); + lcd.printf("Multi Effector"); + lcd.locate(1,1); + lcd.printf("Mode:"); + param1Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num); + + // Program Patch File Open + FILE *fp = fopen("/local/prm.txt", "r"); + if(!fp) { + progPatchWite(1); // No File + }else{ + // Read Patch from File + fgets(str1, 256, fp); + fgets(str2, 256, fp); + for(i=0;i<BANK_MAX_NUM;i++){ + for(j=0;j<PROGNO_MAX_NUM;j++){ + fscanf(fp, "%5d%5d", &iTemp1, &iTemp2); + for(k=0;k<PP_MAX_NUM;k++){ + fscanf(fp, "%5d", &g_iProgPatch[i][j][k]); + } + } + } + fclose(fp); + } + + // ADC & DAC SETTING + g_usiAd0cr = (unsigned int*)0x40034000; + g_usiAd0dr2 = (unsigned int*)0x40034018; + g_usiDacr = (unsigned int*)0x4008C000; + + // SAMPLING TIMER START + sampling.attach_us(&effectProcess, SAMPLING_TIME); + + // Rotary SW State Check + while (1) { + switch (ucRotarySwPol(Rsw0A, Rsw0B, Rsw1A, Rsw1B, Rsw2A, Rsw2B, Rsw3A, Rsw3B, iParamSwPol)) { + case 0: + iRsw1Num += iParamSwPol[0]; + param1Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num); + break; + case 1: + iRsw2Num += iParamSwPol[1]; + param2Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num); + break; + case 2: + iRsw3Num += iParamSwPol[2]; + param3Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num); + break; + case 3: + iRsw4Num += iParamSwPol[3]; + param4Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num); + break; + default: + break; + } + } +} + + +/*******************************/ +/* Param Check */ +/*******************************/ +void paramCheck(int* iParam, int iMaxValue) { + + if(*iParam >= iMaxValue)*iParam = 0; + if(*iParam < 0)*iParam = iMaxValue - 1; + +} + + +/*******************************/ +/* Param1 Change */ +/*******************************/ +void param1Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) { + + paramCheck(iParam1, MODE_MAX_NUM); + + lcd.locate(6,1); + lcd.printf(" "); + lcd.locate(0,2); + lcd.printf(" "); + lcd.locate(0,3); + lcd.printf(" "); + + switch (*iParam1) { + case MODE_PLAY: + lcd.locate(6,1); + lcd.printf("PLAY"); + lcd.locate(2,2); + lcd.printf(" Bank PrgNo"); + *iParam2 = g_iBankNo; + *iParam3 = g_iProgNo; + break; + case MODE_EDIT: + lcd.locate(6,1); + lcd.printf("EDIT"); + lcd.locate(2,2); + lcd.printf("Effct Param Value"); + *iParam2 = *iParam3 = 0; + break; + case MODE_PROGWRITE: + lcd.locate(6,1); + lcd.printf("Prog Write"); + lcd.locate(2,2); + lcd.printf(" Bank PrgNo Write"); + *iParam2 = g_iBankNo; + *iParam3 = g_iProgNo; + break; + default: + break; + } + + param2Change(iParam1, iParam2, iParam3, iParam4); + +} + + +/*******************************/ +/* Param2 Change */ +/*******************************/ +void param2Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) { + + lcd.locate(0,3); + lcd.printf(" "); + + switch (*iParam1) { + case MODE_PLAY: + paramCheck(iParam2, BANK_MAX_NUM); + g_iBankNo = *iParam2; + *iParam3 = g_iProgNo; + break; + case MODE_EDIT: + paramCheck(iParam2, EFFECT_MAX_NUM); + *iParam3 = 0; + break; + case MODE_PROGWRITE: + paramCheck(iParam2, BANK_MAX_NUM); + g_iBankNo = *iParam2; + *iParam3 = g_iProgNo; + *iParam4 = 0; + g_iFlag = 0; + default: + break; + } + + if ((*iParam1 == MODE_PLAY) || (*iParam1 == MODE_PROGWRITE)) { + lcd.locate(6,3); + lcd.printf("%d",*iParam2); + } + + if (*iParam1 == MODE_EDIT) { + switch (*iParam2) { + case EFFECT_DIST: + lcd.locate(2,3); + lcd.printf(" DIST"); + break; + case EFFECT_DELAY: + lcd.locate(2,3); + lcd.printf("DELAY"); + break; + default: + break; + } + } + + param3Change(iParam1, iParam2, iParam3, iParam4); + +} + + +/*******************************/ +/* Param3 Change */ +/*******************************/ +void param3Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) { + + lcd.locate(8,3); + lcd.printf(" "); + + switch (*iParam1) { + case MODE_PLAY: + paramCheck(iParam3, PROGNO_MAX_NUM); + g_iProgNo = *iParam3; + break; + case MODE_EDIT: + switch (*iParam2) { + case EFFECT_DIST: + paramCheck(iParam3, DIST_PARAM_MAX_NUM); + switch (*iParam3) { + case DIST_PARAM_BYPASS: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_BYPASS]; + break; + case DIST_PARAM_MODE: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_MODE]; + break; + case DIST_PARAM_INPUTGAIN: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_INPUTGAIN]; + break; + case DIST_PARAM_CLIPLEVEL: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_CLIPLEVEL]; + break; + case DIST_PARAM_OUTPUTGAIN: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_OUTPUTGAIN]; + break; + default: break; + } + distParamChange(iParam3, iParam4); + break; + case EFFECT_DELAY: + paramCheck(iParam3, DLY_PARAM_MAX_NUM); + switch (*iParam3) { + case DLY_PARAM_BYPASS: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_BYPASS]; + break; + case DLY_PARAM_DELAYTIME: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_DELAYTIME]; + break; + case DLY_PARAM_FBGAIN: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_FBGAIN]; + break; + default: break; + } + delayParamChange(iParam3, iParam4); + break; + default: + break; + } + break; + case MODE_PROGWRITE: + paramCheck(iParam3, PROGNO_MAX_NUM); + g_iProgNo = *iParam3; + *iParam4 = 0; + g_iFlag = 0; + progWrite(iParam4); + break; + default: + break; + } + + if ((*iParam1 == MODE_PLAY) || (*iParam1 == MODE_PROGWRITE)) { + lcd.locate(12,3); + lcd.printf("%d",*iParam3); + } + +} + + +/*******************************/ +/* Param4 Change */ +/*******************************/ +void param4Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) { + + lcd.locate(14,3); + lcd.printf(" "); + + switch (*iParam1) { + case MODE_EDIT: + switch (*iParam2) { + case EFFECT_DIST: + distParamChange(iParam3, iParam4); + break; + case EFFECT_DELAY: + delayParamChange(iParam3, iParam4); + break; + default: + break; + } + break; + case MODE_PROGWRITE: + progWrite(iParam4); + break; + default: + break; + } + +} + + +/*******************************/ +/* Distotion Param Change */ +/*******************************/ +void distParamChange(int* iParam3, int* iParam4) { + + lcd.locate(8,3); + lcd.printf(" "); + lcd.locate(8,3); + + switch (*iParam3) { + case DIST_PARAM_BYPASS: + paramCheck(iParam4, DIST_VALUE_BYPASS_MAX); + g_iDistBypass = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_BYPASS] = *iParam4; + if(g_iDistBypass == 0){ + lcd.printf("BYPSS OFF"); + }else{ + lcd.printf("BYPSS ON"); + } + break; + case DIST_PARAM_MODE: + paramCheck(iParam4, DIST_VALUE_MODE_MAX); + g_iDistMode = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_MODE] = *iParam4; + lcd.printf(" MODE %d", *iParam4); + break; + case DIST_PARAM_INPUTGAIN: + paramCheck(iParam4, DIST_VALUE_INPUTGAIN_MAX); + g_iDistInputGain = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_INPUTGAIN] = *iParam4; + lcd.printf("INP.G %d", *iParam4); + break; + case DIST_PARAM_CLIPLEVEL: + paramCheck(iParam4, DIST_VALUE_CLIPLEVEL_MAX); + g_iDistClipLevel = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_CLIPLEVEL] = *iParam4; + lcd.printf("CLP.L %d", *iParam4); + break; + case DIST_PARAM_OUTPUTGAIN: + paramCheck(iParam4, DIST_VALUE_OUTPUTGAIN_MAX); + g_iDistOutputGain = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_OUTPUTGAIN] = *iParam4; + lcd.printf("OUT.G %d", *iParam4); + break; + default: + break; + + } +} + +/*******************************/ +/* Delay Param Change */ +/*******************************/ +void delayParamChange(int* iParam3, int* iParam4) { + + lcd.locate(8,3); + lcd.printf(" "); + lcd.locate(8,3); + + switch (*iParam3) { + case DLY_PARAM_BYPASS: + paramCheck(iParam4, DLY_VALUE_BYPASS_MAX); + g_iDelayBypass = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_BYPASS] = *iParam4; + if(g_iDelayBypass == 0){ + lcd.printf("BYPSS OFF"); + }else{ + lcd.printf("BYPSS ON"); + } + break; + case DLY_PARAM_DELAYTIME: + paramCheck(iParam4, DLY_VALUE_DELAYTIME_MAX); + g_iDelayTime = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_DELAYTIME] = *iParam4; + lcd.printf("DLY.T %d", *iParam4); + break; + case DLY_PARAM_FBGAIN: + paramCheck(iParam4, DLY_VALUE_FBGAIN_MAX); + g_iDelayFeedBackLevel = *iParam4; + //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_FBGAIN] = *iParam4; + lcd.printf(" FB.G %d", *iParam4); + break; + default: + break; + + } +} + +/*******************************/ +/* Program Patch Write */ +/*******************************/ +void progWrite(int* param){ + + if(g_iFlag == 0){ + if((*param > 24) || (*param < -24)){ + lcd.locate(14,3); + lcd.printf(" Done"); + ProgramPatchChange(g_iBankNo, g_iProgNo); + progPatchWite(0); + g_iFlag = 1; + }else{ + lcd.locate(14,3); + lcd.printf("Unexe"); + } + }else{ + lcd.locate(14,3); + lcd.printf(" Done"); + } +} + + +/*******************************/ +/* Program Patch Wite */ +/*******************************/ +void progPatchWite(int iFlag){ + + int i, j, k; + + FILE *fp = fopen("/local/prm.txt", "w"); + if(!fp) { + while(1){ + lcd.cls(); + wait(0.5); + lcd.locate(1,1); + lcd.printf("SYSTEM ERROR #2000"); + wait(0.5); + } + } + + fprintf(fp, " BANK PROG ---- DISTOTION --- ----- DELAY ------\n"); + fprintf(fp, " BYP MODE ING C.Lv OUTG BYP TIME FB\n"); + for(i=0;i<BANK_MAX_NUM;i++){ + for(j=0;j<PROGNO_MAX_NUM;j++){ + if(iFlag == 1)ProgramPatchChange(i, j); + fprintf(fp, "%5d%5d", i, j); + for(k=0;k<PP_MAX_NUM;k++){ + fprintf(fp, "%5d\0", g_iProgPatch[i][j][k]); + } + fprintf(fp, "\n"); + } + } + + fclose(fp); +} + + +/*******************************/ +/* Program Patch Chanege */ +/*******************************/ +void ProgramPatchChange(int iBank, int iProg){ + + // Distotion Param + g_iProgPatch[iBank][iProg][PP_DIST_PARAM_BYPASS] = g_iDistBypass; + g_iProgPatch[iBank][iProg][PP_DIST_PARAM_MODE] = g_iDistMode; + g_iProgPatch[iBank][iProg][PP_DIST_PARAM_INPUTGAIN] = g_iDistInputGain; + g_iProgPatch[iBank][iProg][PP_DIST_PARAM_CLIPLEVEL] = g_iDistClipLevel; + g_iProgPatch[iBank][iProg][PP_DIST_PARAM_OUTPUTGAIN] = g_iDistOutputGain; + + // Delay Param + g_iProgPatch[iBank][iProg][PP_DLY_PARAM_BYPASS] = g_iDelayBypass; + g_iProgPatch[iBank][iProg][PP_DLY_PARAM_DELAYTIME] = g_iDelayTime; + g_iProgPatch[iBank][iProg][PP_DLY_PARAM_FBGAIN] = g_iDelayFeedBackLevel; + +} \ No newline at end of file