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:
freq = 440 * 2^((n-69)/12) where ‘n’ is the MIDI note number (2)
//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
&
replace:
LIBS =with
LIBS = -lm
in the makefile…