Where I try playing a sample via PwmOutput
Reading some old ZX Spectrum forums, I wanted to check wether playing a sample was possible. So far, no, but there's more things to try.
Diff: main.cpp
- Revision:
- 0:167d81d4f79f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Mar 08 21:51:59 2015 +0000 @@ -0,0 +1,95 @@ +#include "mbed.h" +#include "sound.h" +#include "LCD_ST7735.h" +#include "font_IBM.h" +//#include "Sequencer.h" + +//int main() { +// Sequencer seq; +// while (true) { +// wait(10.0f); + // seq.play(); +// } + +Ticker flipper; +LCD_ST7735 disp(P0_19, P0_20, P0_7, P0_21, P0_22, P1_15, P0_2, LCD_ST7735::RGB); +// led1(P0_9), led2(P0_8), pwm(P0_18) +PwmOut pwm(P0_18); +DigitalOut led1(P0_9); +DigitalOut led2(P0_8); +InterruptIn left(P0_14); +InterruptIn right(P0_11); +InterruptIn up(P0_13); +InterruptIn down(P0_12); + +double srate = 1.0f/2000.0f; +double pwmrate = 1.0f/80000.0f; +unsigned short int idx = 0; + +void printDouble(int y, double value) { + char buffer[10]; + int len = sprintf(buffer, "%.1f", value); + disp.drawString(font_ibm, 0, y, buffer); +} +void pnext() { + pwm = (pcm_samples[idx++] / 255.0f); + if (idx == pcm_length) { + idx = 0; + led2 = !led2; + } +} + +void setpwm() { + led1 = !led1; + printDouble(10, 1.0f/pwmrate); + pwm.period(pwmrate); +} +void setsrate() { + flipper.detach(); + led2 = !led2; + printDouble(0, 1.0f/srate); + flipper.attach(&pnext, srate); // setup flipper to call flip after 2 seconds +} +void incf() { + srate *= 1.1f; + setsrate(); +} +void decf() { + srate /= 1.1f; + setsrate(); +} +void incpwm() { + pwmrate *= 1.1f; + setpwm(); +} +void decpwm() { + pwmrate /= 1.1f; + setpwm(); +} +int main() { + led2 = 1; + pwm.period(pwmrate); + left.mode(PullUp); + right.mode(PullUp); + up.mode(PullUp); + down.mode(PullUp); + + right.rise(&incpwm); + left.rise(&decpwm); + up.rise(&incf); + down.rise(&decf); + + disp.setOrientation(LCD_ST7735::Rotate270, false); + disp.clearScreen(); + printDouble(0 , 1.0f/srate); + printDouble(10, 1.0f/pwmrate); + + flipper.attach(&pnext, srate); // setup flipper to call flip after 2 seconds + led1 = 1; + + while(1) { + // Watchdog. Have I crashed? + wait(10.0f); + led1 = !led1; + } +}