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.
main.cpp@0:167d81d4f79f, 2015-03-08 (annotated)
- Committer:
- loop
- Date:
- Sun Mar 08 21:51:59 2015 +0000
- Revision:
- 0:167d81d4f79f
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
loop | 0:167d81d4f79f | 1 | #include "mbed.h" |
loop | 0:167d81d4f79f | 2 | #include "sound.h" |
loop | 0:167d81d4f79f | 3 | #include "LCD_ST7735.h" |
loop | 0:167d81d4f79f | 4 | #include "font_IBM.h" |
loop | 0:167d81d4f79f | 5 | //#include "Sequencer.h" |
loop | 0:167d81d4f79f | 6 | |
loop | 0:167d81d4f79f | 7 | //int main() { |
loop | 0:167d81d4f79f | 8 | // Sequencer seq; |
loop | 0:167d81d4f79f | 9 | // while (true) { |
loop | 0:167d81d4f79f | 10 | // wait(10.0f); |
loop | 0:167d81d4f79f | 11 | // seq.play(); |
loop | 0:167d81d4f79f | 12 | // } |
loop | 0:167d81d4f79f | 13 | |
loop | 0:167d81d4f79f | 14 | Ticker flipper; |
loop | 0:167d81d4f79f | 15 | LCD_ST7735 disp(P0_19, P0_20, P0_7, P0_21, P0_22, P1_15, P0_2, LCD_ST7735::RGB); |
loop | 0:167d81d4f79f | 16 | // led1(P0_9), led2(P0_8), pwm(P0_18) |
loop | 0:167d81d4f79f | 17 | PwmOut pwm(P0_18); |
loop | 0:167d81d4f79f | 18 | DigitalOut led1(P0_9); |
loop | 0:167d81d4f79f | 19 | DigitalOut led2(P0_8); |
loop | 0:167d81d4f79f | 20 | InterruptIn left(P0_14); |
loop | 0:167d81d4f79f | 21 | InterruptIn right(P0_11); |
loop | 0:167d81d4f79f | 22 | InterruptIn up(P0_13); |
loop | 0:167d81d4f79f | 23 | InterruptIn down(P0_12); |
loop | 0:167d81d4f79f | 24 | |
loop | 0:167d81d4f79f | 25 | double srate = 1.0f/2000.0f; |
loop | 0:167d81d4f79f | 26 | double pwmrate = 1.0f/80000.0f; |
loop | 0:167d81d4f79f | 27 | unsigned short int idx = 0; |
loop | 0:167d81d4f79f | 28 | |
loop | 0:167d81d4f79f | 29 | void printDouble(int y, double value) { |
loop | 0:167d81d4f79f | 30 | char buffer[10]; |
loop | 0:167d81d4f79f | 31 | int len = sprintf(buffer, "%.1f", value); |
loop | 0:167d81d4f79f | 32 | disp.drawString(font_ibm, 0, y, buffer); |
loop | 0:167d81d4f79f | 33 | } |
loop | 0:167d81d4f79f | 34 | void pnext() { |
loop | 0:167d81d4f79f | 35 | pwm = (pcm_samples[idx++] / 255.0f); |
loop | 0:167d81d4f79f | 36 | if (idx == pcm_length) { |
loop | 0:167d81d4f79f | 37 | idx = 0; |
loop | 0:167d81d4f79f | 38 | led2 = !led2; |
loop | 0:167d81d4f79f | 39 | } |
loop | 0:167d81d4f79f | 40 | } |
loop | 0:167d81d4f79f | 41 | |
loop | 0:167d81d4f79f | 42 | void setpwm() { |
loop | 0:167d81d4f79f | 43 | led1 = !led1; |
loop | 0:167d81d4f79f | 44 | printDouble(10, 1.0f/pwmrate); |
loop | 0:167d81d4f79f | 45 | pwm.period(pwmrate); |
loop | 0:167d81d4f79f | 46 | } |
loop | 0:167d81d4f79f | 47 | void setsrate() { |
loop | 0:167d81d4f79f | 48 | flipper.detach(); |
loop | 0:167d81d4f79f | 49 | led2 = !led2; |
loop | 0:167d81d4f79f | 50 | printDouble(0, 1.0f/srate); |
loop | 0:167d81d4f79f | 51 | flipper.attach(&pnext, srate); // setup flipper to call flip after 2 seconds |
loop | 0:167d81d4f79f | 52 | } |
loop | 0:167d81d4f79f | 53 | void incf() { |
loop | 0:167d81d4f79f | 54 | srate *= 1.1f; |
loop | 0:167d81d4f79f | 55 | setsrate(); |
loop | 0:167d81d4f79f | 56 | } |
loop | 0:167d81d4f79f | 57 | void decf() { |
loop | 0:167d81d4f79f | 58 | srate /= 1.1f; |
loop | 0:167d81d4f79f | 59 | setsrate(); |
loop | 0:167d81d4f79f | 60 | } |
loop | 0:167d81d4f79f | 61 | void incpwm() { |
loop | 0:167d81d4f79f | 62 | pwmrate *= 1.1f; |
loop | 0:167d81d4f79f | 63 | setpwm(); |
loop | 0:167d81d4f79f | 64 | } |
loop | 0:167d81d4f79f | 65 | void decpwm() { |
loop | 0:167d81d4f79f | 66 | pwmrate /= 1.1f; |
loop | 0:167d81d4f79f | 67 | setpwm(); |
loop | 0:167d81d4f79f | 68 | } |
loop | 0:167d81d4f79f | 69 | int main() { |
loop | 0:167d81d4f79f | 70 | led2 = 1; |
loop | 0:167d81d4f79f | 71 | pwm.period(pwmrate); |
loop | 0:167d81d4f79f | 72 | left.mode(PullUp); |
loop | 0:167d81d4f79f | 73 | right.mode(PullUp); |
loop | 0:167d81d4f79f | 74 | up.mode(PullUp); |
loop | 0:167d81d4f79f | 75 | down.mode(PullUp); |
loop | 0:167d81d4f79f | 76 | |
loop | 0:167d81d4f79f | 77 | right.rise(&incpwm); |
loop | 0:167d81d4f79f | 78 | left.rise(&decpwm); |
loop | 0:167d81d4f79f | 79 | up.rise(&incf); |
loop | 0:167d81d4f79f | 80 | down.rise(&decf); |
loop | 0:167d81d4f79f | 81 | |
loop | 0:167d81d4f79f | 82 | disp.setOrientation(LCD_ST7735::Rotate270, false); |
loop | 0:167d81d4f79f | 83 | disp.clearScreen(); |
loop | 0:167d81d4f79f | 84 | printDouble(0 , 1.0f/srate); |
loop | 0:167d81d4f79f | 85 | printDouble(10, 1.0f/pwmrate); |
loop | 0:167d81d4f79f | 86 | |
loop | 0:167d81d4f79f | 87 | flipper.attach(&pnext, srate); // setup flipper to call flip after 2 seconds |
loop | 0:167d81d4f79f | 88 | led1 = 1; |
loop | 0:167d81d4f79f | 89 | |
loop | 0:167d81d4f79f | 90 | while(1) { |
loop | 0:167d81d4f79f | 91 | // Watchdog. Have I crashed? |
loop | 0:167d81d4f79f | 92 | wait(10.0f); |
loop | 0:167d81d4f79f | 93 | led1 = !led1; |
loop | 0:167d81d4f79f | 94 | } |
loop | 0:167d81d4f79f | 95 | } |