Search the Community
Showing results for tags 'note to frequency'.
-
the calculation from midi notes to frequency, is based on tuning of note Number A3: eg. 430-450hz the formular on the internet give me this: //Calculate Frequencys 4 notes... for (notecount = 0; notecount < 127; ++notecount) { midi[notecount] = tuning * pow(2, (float)(notecount - 69)/12); } it should fill an 127 wide array with Frequencys corresponding to its note numbers. the formular make something wrong: --- SOLVED - i updetate the working code > THX to Peter when i put in Note Nr 33, i get -14hz (A0) when i put in Note Nr 45, i get -17hz (A1) when i put in Note Nr 57, i get -12hz (A2) when i put in Note Nr 69, i get 866hz (A3) when i put in Note Nr 61, i get 129hz (A4) when i put in Note Nr 93, i get 0hz (A5) I put in: actualnote: 69 (which is A3 >>> Kammerton A) tuning: 431 (A3 = 431hz) it should put out: midi[actualnote]=431 but on the LCD i prints out:1079427072 --- and this is not right >> SOLVED: write (float) in front of a Variable if you want to print it >>> thx to TK WORKING CODE: #include <mios32.h> #include <FreeRTOS.h> #include <task.h> #include "tasks.h" #include "file.h" #include "app.h" #include <portmacro.h> #include <queue.h> #include <semphr.h> #include <string.h> #include "mios32_timer.h" #include "float.h" #include <stdio.h> #include <math.h> //#include "dmx.h" //DMX: typedef struct { int normal_access : 3; int single_bit_bb : 1; } __attribute__((bitband)) my_struct; my_struct phil; #define NUM_ENCODERS 9 //5 Menue Encoders are connectet const mios32_enc_config_t encoders[NUM_ENCODERS] = {//(SR begin with 1, ENC with 0) // setup the Pinout of that Encoders { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=0 }, //Menue Encoder 0 - only virtual, since they are mapped to differnt Variables... { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=2 }, //Menue Encoder 1 - ...if "Menue Page Encoder" has changed { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=4 }, //Menue Encoder 2 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=1, .cfg.pos=6 }, //Menue Encoder 3 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=0 }, //Menue Encoder 4 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=2 }, //Menue Encoder 5 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=4 }, //Menue Encoder 6 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=2, .cfg.pos=6 }, //Menue Encoder 7 { .cfg.type=DETENTED2, .cfg.speed=FAST, .cfg.speed_par=4, .cfg.sr=3, .cfg.pos=0 },}; //Menue Page Encoder xSemaphoreHandle xLCDSemaphore; // take and give access to LCD u32 MenueUpdateCount = 0; //to calculate the LCD-Menue-Update-Rate float value = 0; //Encoder calculation... u32 i = 0; //Encoder calcualtion //DMX u8 RGBWdmx[4]={0, 0, 0, 250}; //RGBW values u8 RGBWenc[4]={0, 0, 0, 250}; //RGBW values u8 count = 0; //to count thru the rgbw-channels while sending DMX... //note2sound u32 nm = 10; u32 rpm = 25680; u32 time = 2161; //setup timer time u32 timecount = 0; u32 hzcount = 0; u32 decaytime = 128; float tuning = 431; //represent the tuning of "Kammerton A3" float finetuning = 0.95; //represent the floating point of tuning (eg.: 431,095hz) u32 finetuningLCD = 95; //float of tuning - to calculate to show on display float midi[127] = {}; //represent Midinote 0-127 - and its value is a Frequency in [hz] u32 actualnote = 69; // where 69 is A3 named A (which is tuned with "tuning" Variable above) s32 notecount = 0; // only a counter variable to calculate the note frequencys. //MidiSetup u8 midich = Chn9; u8 midiport= 32; //Midi-Melody Input, [32=UART0=Midi1, 33=UART1=Midi2 on LPC17core] //Task Prioritys #define MUTEX_LCD_TAKE { while( xSemaphoreTakeRecursive(xLCDSemaphore, (portTickType)0) != pdTRUE ); } //a Mutex reserve a Resoure (LCD or SD-Card) for a task, until it is given away... #define MUTEX_LCD_GIVE { xSemaphoreGiveRecursive(xLCDSemaphore); } #define PRIORITY_StoreLoad ( tskIDLE_PRIORITY + 2 ) //3:Mios standart static void StoreLoad(u8 tick, u16 order); void APP_Init(void){ MIOS32_BOARD_LED_Init(0xffffffff); //initialize all LEDs xLCDSemaphore = xSemaphoreCreateRecursiveMutex(); //create Mutex for LCD access //initialize encoders i = counter for(i=0; i<NUM_ENCODERS; ++i) MIOS32_ENC_ConfigSet(i, encoders[i]); //initialize encoders //DMX_Init(0); } void APP_Background(void){ //DMX: // endless loop /* while(1) { for (count=0;count<4;count++) { if (RGBWdmx[count]!=RGBWenc[count]) //if something has changed - send the value via DMX! { RGBWdmx[count]=RGBWenc[count]; DMX_SetChannel(count,(u8)RGBWdmx[count]);} } } */ } void APP_Tick(void) { //1ms Event Triggering MenueUpdateCount = MenueUpdateCount + 1; if(MenueUpdateCount > 650){MenueUpdateCount = 0; StoreLoad(0, 0);}} //update the Menue void APP_MIDI_Tick(void){} void APP_MIDI_NotifyPackage(mios32_midi_port_t port, mios32_midi_package_t midi_package){ if(port==midiport && midi_package.chn == midich && midi_package.type == NoteOn) {actualnote=midi_package.note;}} void APP_SRIO_ServicePrepare(void){} void APP_SRIO_ServiceFinish(void){} void APP_DIN_NotifyToggle(u32 pin, u32 pin_value){} void APP_ENC_NotifyChange(u32 encoder, s32 incrementer){ if(encoder == 1){ value = tuning + incrementer; //tuning of note A-3 if(value < 430) {value = 450;} if(value > 450) {value = 430;} tuning = value; //Calculate Frequencys 4 notes... for (notecount = 0; notecount < 127; ++notecount) {midi[notecount] = tuning * pow(2, (float)(notecount - 69)/12);} //{midi[notecount] = tuning * (2 ^ ((notecount-69) / 12));} } if(encoder == 2){ value = finetuning + ((float)incrementer/1000); // finetune if(value < 0.001) {value = 0;} if(value > 1) {value = 1;} finetuning = value; tuning=tuning + finetuning; if(tuning < 430) {tuning = 430;} if(tuning > 450) {tuning = 450;} finetuningLCD = finetuning*1000; } if(encoder == 3){ value = RGBWenc[0] + incrementer; //RED if(value < 0) {value = 255;} if(value > 255) {value = 0;} RGBWenc[0] = value; } if(encoder == 4){ value = RGBWenc[1] + incrementer; //GREEN if(value < 0) {value = 255;} if(value > 255) {value = 0;} RGBWenc[1] = value; } if(encoder == 5){ value = RGBWenc[2] + incrementer; //BLUE if(value < 0) {value = 255;} if(value > 255) {value = 0;} RGBWenc[2] = value; } if(encoder == 6){ value = RGBWenc[3] + incrementer; //White if(value < 0) {value = 255;} if(value > 255) {value = 0;} RGBWenc[3] = value; } } void APP_AIN_NotifyChange(u32 pin, u32 pin_value){} static void StoreLoad(u8 tick, u16 order){ //Display MENUE if(tick == 0){//Menue tick MUTEX_LCD_TAKE; //request LCD access MIOS32_LCD_Clear(); //clear screen //1st Line = Encoder Variables....change something! MIOS32_LCD_CursorSet(0, 0); MIOS32_LCD_PrintFormattedString("%u", actualnote); MIOS32_LCD_CursorSet(4, 0); MIOS32_LCD_PrintFormattedString("%d", (int)tuning); MIOS32_LCD_CursorSet(7, 0); if (finetuningLCD>=100) {MIOS32_LCD_PrintFormattedString("%s" "%d", ".", finetuningLCD);} if (finetuningLCD< 100 && finetuningLCD>=10) {MIOS32_LCD_PrintFormattedString("%s" "%d", ".0", finetuningLCD);} if (finetuningLCD< 10) {MIOS32_LCD_PrintFormattedString("%s" "%d", ".00", finetuningLCD);} MIOS32_LCD_CursorSet(16, 0); MIOS32_LCD_PrintFormattedString("%d", RGBWenc[0]); MIOS32_LCD_CursorSet(21, 0); MIOS32_LCD_PrintFormattedString("%d", RGBWenc[1]); MIOS32_LCD_CursorSet(27, 0); MIOS32_LCD_PrintFormattedString("%d", RGBWenc[2]); MIOS32_LCD_CursorSet(32, 0); MIOS32_LCD_PrintFormattedString("%d", RGBWenc[3]); MIOS32_LCD_CursorSet(37, 0); MIOS32_LCD_PrintFormattedString("%d", (int)midi[actualnote]); //2nd Line = Menue Describtio MIOS32_LCD_CursorSet(0, 1); MIOS32_LCD_PrintFormattedString("%s", "nte "); MIOS32_LCD_CursorSet(4, 1); MIOS32_LCD_PrintFormattedString("%s", "tune"); MIOS32_LCD_CursorSet(16, 1); MIOS32_LCD_PrintFormattedString("%s", "red "); MIOS32_LCD_CursorSet(21, 1); MIOS32_LCD_PrintFormattedString("%s", "gren "); MIOS32_LCD_CursorSet(27, 1); MIOS32_LCD_PrintFormattedString("%s", "blue "); MIOS32_LCD_CursorSet(32, 1); MIOS32_LCD_PrintFormattedString("%s", "whit "); MIOS32_LCD_CursorSet(37, 1); MIOS32_LCD_PrintFormattedString("%s", "frq"); MUTEX_LCD_GIVE;}} // release LCD access for other tasks &