Diatonic scale - slider base program plays one octave and a two notes, having 440A (A4) in the center.
Fork of slider_tone_v1 by
slider_diatonic_v1.cpp
- Committer:
- scohennm
- Date:
- 2015-02-18
- Revision:
- 3:f68e9cdfaf2d
- Parent:
- slider_tone_v1.cpp@ 2:7f347d6a6422
File content as of revision 3:f68e9cdfaf2d:
#include "mbed.h" #include "SLCD.h" #include "TSISensor.h" #define CHANNELON 0 #define CHANNELOFF 1 #define LCDLEN 10 #define DATATIME 100 //milli seccnds //LCD messages // Operating parameters #define SIDETONE 700.0 #define TONEMIN 200.0 #define TONEINT 800.00 // So tone max is 1000 #define TONEON 0.50 #define TONEOFF 0.0 #define SPEEDAST 0 #define TONEAST 1 #define NUMTONES 10 #define LEDPERIOD 0.001 //#define PRINTDEBUG Serial pc(USBTX, USBRX); float diatonicScale[NUMTONES] = {246.94, 261.63,293.66,329.63,349.23,392.00,440.00,493.88,523.25,587.33}; SLCD slcd; //define LCD display TSISensor tsiScaling; // Capacitive sensor/slider PwmOut led(LED_RED); DigitalOut outPin(PTC9); //J1-16 PwmOut soundOut(PTA13); Timer dataTimer; // Global scalars char lcdData[LCDLEN]; float tonePeriod; float toneFreq = SIDETONE; void LCDMessNoDwell(char *lMess){ slcd.Home(); slcd.clear(); slcd.printf(lMess); } void diatonicAdjust( float scaling) { int tempInt; int scaleIndex; static int oldScaleIndex = 0; /* There appears to be a set up time for setting the PWM time period only do a nes set up if the indext changes. */ scaleIndex = (int)(NUMTONES * scaling); if (scaleIndex != oldScaleIndex) { toneFreq = diatonicScale[scaleIndex]; tonePeriod = 1.0/toneFreq; soundOut.period(tonePeriod); // adjusting period soundOut.write(TONEON); // there is a setup time for both period and DF oldScaleIndex = scaleIndex; } else { return; } #ifdef PRINTDEBUG pc.printf(" %f,%d\n\r",scaling, scaleIndex ); #endif tempInt = (int)toneFreq; sprintf (lcdData,"%4d",tempInt); LCDMessNoDwell(lcdData); return; } void lightAdjust( float scaling) { // Control brightness of LED float tempDutyFactor; tempDutyFactor = 1.0 - scaling; //LED is a sinking connection // anode is held at 5V led.write(tempDutyFactor); //adjusting duty factor return; } int main(){ int tempInt; float tempValue; tonePeriod = 1.0/toneFreq; soundOut.period(tonePeriod); led.period(tonePeriod); led.write(CHANNELOFF); outPin.write(CHANNELOFF); tempInt = (int)toneFreq; sprintf (lcdData,"%4d",tempInt); LCDMessNoDwell(lcdData); // Start data timer dataTimer.start(); dataTimer.reset(); while (true) { if (dataTimer.read_ms() > DATATIME){ // check to see if enough time has passed // to read the touch pad tempValue = tsiScaling.readPercentage(); if(tempValue > 0) { // soundOut.write(TONEON); // set duty factor to 50% diatonicAdjust(tempValue); lightAdjust(tempValue); } else { soundOut.write(TONEOFF); // set dutyfactor to 0% LCDMessNoDwell("SOFF"); } dataTimer.reset(); } } // while forever }// end main