From a4ba24d6efd02b334e70ecd3099e03adae3009f4 Mon Sep 17 00:00:00 2001 From: "Matthias L. Jugel" Date: Wed, 26 Oct 2016 20:52:40 +0200 Subject: [PATCH] add sound support using the on-board speaker --- libs/calliope-test/calliope.ts | 348 +++++++++++++++++++++++++++++---- libs/core/dal.d.ts | 3 + libs/core/enums.d.ts | 6 +- libs/core/music.ts | 16 +- libs/core/pins.cpp | 8 + 5 files changed, 339 insertions(+), 42 deletions(-) diff --git a/libs/calliope-test/calliope.ts b/libs/calliope-test/calliope.ts index 57b43168..7f1bbe09 100644 --- a/libs/calliope-test/calliope.ts +++ b/libs/calliope-test/calliope.ts @@ -1,51 +1,327 @@ -basic.setLedColor(Colors.Blue) -basic.pause(500) -basic.setLedColor(Colors.Red) -basic.pause(500) -basic.setLedColor(Colors.Green) -basic.pause(500) -basic.setLedColor(Colors.Violet) -basic.pause(500) +// Für Elise... + +// play e4 +music.playTone(330, 300); +basic.pause(350); +// play d4# +music.playTone(311, 300); +basic.pause(350); +// play e4 +music.playTone(330, 300); +basic.pause(350); +// play d4# +music.playTone(311, 300); +basic.pause(350); +// play e4 +music.playTone(330, 300); +basic.pause(350); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play a3 +music.playTone(220, 900); +basic.pause(1000); +// play d3 +music.playTone(147, 300); +basic.pause(350); +//play f3 +music.playTone(175, 300); +basic.pause(400); +//play a3 +music.playTone(220, 300); +basic.pause(400); +// play b3 +music.playTone(247, 900); +basic.pause(1000); +// play f3 +music.playTone(175, 300); +basic.pause(400); +// play a3# +music.playTone(233, 300); +basic.pause(400); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play c4 +music.playTone(262, 900); +basic.pause(1000); +basic.pause(300); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4# +music.playTone(311, 300); +basic.pause(400); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4# +music.playTone(311, 300); +basic.pause(400); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play c4 +music.playTone(263, 300); +basic.pause(400); +// play a3 +music.playTone(220, 900); +basic.pause(1000); +// play d3 +music.playTone(147, 300); +basic.pause(400); +// play f3 +music.playTone(175, 300); +basic.pause(400); +// play a3 +music.playTone(220, 300); +basic.pause(400); +// play b3 +music.playTone(247, 900); +basic.pause(1000); +// play f3 +music.playTone(175, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play a3 +music.playTone(220, 900); +basic.pause(1000); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play e4 +music.playTone(330, 900); +basic.pause(1000); +// play g3 +music.playTone(196, 300); +basic.pause(400); +// play f4 +music.playTone(349, 300); +basic.pause(400); +//play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4 +music.playTone(294, 900); +basic.pause(1000); +// play e3 +music.playTone(165, 300); +basic.pause(400); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play c4 +music.playTone(262, 900); +basic.pause(1000); +// play d3 +music.playTone(147, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play b3 +music.playTone(247, 900); +basic.pause(1000); +basic.pause(400); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4# +music.playTone(311, 300); +basic.pause(350); +// play e4 +music.playTone(330, 300); +basic.pause(350); +// play d4# +music.playTone(311, 300); +basic.pause(350); +// play e4 +music.playTone(330, 300); +basic.pause(350); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play a3 +music.playTone(220, 900); +basic.pause(1000); +// play d3 +music.playTone(147, 300); +basic.pause(350); +//play f3 +music.playTone(175, 300); +basic.pause(400); +//play a3 +music.playTone(220, 300); +basic.pause(400); +// play b3 +music.playTone(247, 900); +basic.pause(1000); +// play f3 +music.playTone(175, 300); +basic.pause(400); +// play a3 +music.playTone(233, 300); +basic.pause(400); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play c4 +music.playTone(262, 900); +basic.pause(1000); +basic.pause(300); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4# +music.playTone(311, 300); +basic.pause(400); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play d4# +music.playTone(311, 300); +basic.pause(400); +// play e4 +music.playTone(330, 300); +basic.pause(400); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play d4 +music.playTone(294, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play a3 +music.playTone(220, 900); +basic.pause(1000); +// play d3 +music.playTone(147, 300); +basic.pause(400); +// play f3 +music.playTone(175, 300); +basic.pause(400); +// play a3 +music.playTone(220, 300); +basic.pause(400); +// play b3 +music.playTone(247, 900); +basic.pause(1000); +// play f3 +music.playTone(175, 300); +basic.pause(400); +// play c4 +music.playTone(262, 300); +basic.pause(400); +// play b3 +music.playTone(247, 300); +basic.pause(400); +// play a3 +music.playTone(220, 900); +basic.pause(1000); + +// and again slightly different +var notes = [ + Note.E5, Note.Eb5, Note.E5, Note.Eb5, Note.E5, Note.B5, Note.D5, Note.C5, Note.A5, + Note.C5, Note.E5, Note.A5, Note.B5, Note.E5, Note.A5, Note.B5, Note.C5, + Note.E5, Note.Eb5, Note.E5, Note.Eb5, Note.E5, Note.B5, Note.D5, Note.C5, Note.A5, + Note.C5, Note.E5, Note.A5, Note.B5, Note.E5, Note.C5, Note.B5, Note.A5, + Note.B5, Note.C5, Note.D5, Note.E5, Note.G, Note.F, Note.E5, Note.D5, Note.E5, Note.E5, Note.D5, Note.C5, Note.E5, Note.D5, Note.C5, Note.E5, + Note.E5, Note.Eb5, Note.E5, Note.Eb5, Note.E5, Note.E5, Note.D5, Note.C5, Note.A5, + Note.C5, Note.E5, Note.A5, Note.B5, Note.E5, Note.A5, Note.B5, Note.C5, + Note.E5, Note.Eb5, Note.E5, Note.Eb5, Note.E5, Note.B5, Note.D5, Note.C5, Note.A5, + Note.C5, Note.E5, Note.A5, Note.B5, Note.E5, Note.C5, Note.B5, Note.A5 +]; + +for (let note of notes) { + music.playTone(note, 100); +} + +basic.setLedColor(Colors.Blue); +basic.pause(500); +basic.setLedColor(Colors.Red); +basic.pause(500); +basic.setLedColor(Colors.Green); +basic.pause(500); +basic.setLedColor(Colors.Violet); +basic.pause(500); basic.setLedColor(0); + input.onGesture(Gesture.Shake, () => { - basic.showString("S") -}) + basic.showString("S"); +}); input.onGesture(Gesture.LogoUp, () => { - basic.showString("U") -}) + basic.showString("U"); +}); input.onGesture(Gesture.LogoDown, () => { - basic.showString("D") -}) + basic.showString("D"); +}); input.onGesture(Gesture.ScreenUp, () => { - basic.showString("+") -}) + basic.showString("+"); +}); input.onGesture(Gesture.TiltRight, () => { - basic.showString("R") -}) + basic.showString("R"); +}); input.onGesture(Gesture.FreeFall, () => { - basic.showString("F") -}) + basic.showString("F"); +}); input.onGesture(Gesture.ScreenDown, () => { - basic.showString("-") -}) + basic.showString("-"); +}); input.onGesture(Gesture.TiltLeft, () => { - basic.showString("L") -}) + basic.showString("L"); +}); input.onGesture(Gesture.ThreeG, () => { - basic.showString("3") -}) + basic.showString("3"); +}); input.onGesture(Gesture.SixG, () => { - basic.showString("6") -}) + basic.showString("6"); +}); input.onPinPressed(TouchPin.P0, () => { - basic.showNumber(0) -}) + basic.showNumber(0); +}); input.onPinPressed(TouchPin.P1, () => { - basic.showNumber(1) -}) + basic.showNumber(1); +}); input.onPinPressed(TouchPin.P2, () => { - basic.showNumber(2) -}) + basic.showNumber(2); +}); input.onPinPressed(TouchPin.P3, () => { - basic.showNumber(3) -}) + basic.showNumber(3); +}); diff --git a/libs/core/dal.d.ts b/libs/core/dal.d.ts index 06c8867c..4658e0d9 100644 --- a/libs/core/dal.d.ts +++ b/libs/core/dal.d.ts @@ -153,6 +153,9 @@ declare const enum DAL { CALLIOPE_ID_IO_P14 = 38, CALLIOPE_ID_IO_P15 = 39, CALLIOPE_ID_IO_P22 = 40, + CALLIOPE_ID_IO_P28 = 41, + CALLIOPE_ID_IO_P29 = 42, + CALLIOPE_ID_IO_P30 = 43, MICROBIT_ID_MESSAGE_BUS_LISTENER = 1021, MICROBIT_ID_NOTIFY_ONE = 1022, MICROBIT_ID_NOTIFY = 1023, diff --git a/libs/core/enums.d.ts b/libs/core/enums.d.ts index 0e0e68de..5177fc64 100644 --- a/libs/core/enums.d.ts +++ b/libs/core/enums.d.ts @@ -264,7 +264,9 @@ declare namespace motors { //P16 = MICROBIT_ID_IO_P16, P19 = 24, // MICROBIT_ID_IO_P19 P20 = 25, // MICROBIT_ID_IO_P20 - P22 = 40, // CALLIOPE_ID_IO_P22 + P28 = 41, // CALLIOPE_ID_IO_P28 + P29 = 42, // CALLIOPE_ID_IO_P29 + P30 = 43, // CALLIOPE_ID_IO_P30 } @@ -275,6 +277,8 @@ declare namespace motors { P3 = 10, // MICROBIT_ID_IO_P3 P4 = 11, // MICROBIT_ID_IO_P4 P10 = 17, // MICROBIT_ID_IO_P10 + P29 = 42, // CALLIOPE_ID_IO_P29 + P30 = 43, // CALLIOPE_ID_IO_P30 } diff --git a/libs/core/music.ts b/libs/core/music.ts index 1c6aaada..1d282a37 100644 --- a/libs/core/music.ts +++ b/libs/core/music.ts @@ -130,7 +130,7 @@ namespace music { let beatsPerMinute: number = 120; /** - * Plays a tone through pin ``P0`` for the given duration. + * Plays a tone through ``speaker`` for the given duration. * @param frequency pitch of the tone to play in Hertz (Hz) * @param ms tone duration in milliseconds (ms) */ @@ -138,20 +138,26 @@ namespace music { //% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" icon="\uf025" blockGap=8 //% parts="speaker" export function playTone(frequency: number, ms: number): void { - pins.analogSetPitchPin(AnalogPin.P0); + // TODO check timing + pins.digitalWritePin(DigitalPin.P28, 1); // switch on the motor driver + pins.analogSetPitchPin(AnalogPin.P29); pins.analogPitch(frequency, ms); + pins.digitalWritePin(DigitalPin.P28, 0); // switch off the motor driver } /** - * Plays a tone through pin ``P0``. + * Plays a tone through ``speaker``. * @param frequency pitch of the tone to play in Hertz (Hz) */ //% help=music/ring-tone weight=80 //% blockId=device_ring block="ring tone (Hz)|%note=device_note" icon="\uf025" blockGap=8 //% parts="speaker" export function ringTone(frequency: number): void { - pins.analogSetPitchPin(AnalogPin.P0); + // TODO check timing + pins.digitalWritePin(DigitalPin.P28, 1); // switch on the motor driver + pins.analogSetPitchPin(AnalogPin.P29); pins.analogPitch(frequency, 0); + pins.digitalWritePin(DigitalPin.P28, 0); // switch off the motor driver } /** @@ -192,7 +198,7 @@ namespace music { let beat = 60000 / beatsPerMinute; if (fraction == BeatFraction.Whole) return beat; else if (fraction == BeatFraction.Half) return beat / 2; - else if (fraction == BeatFraction.Quarter) return beat / 4 + else if (fraction == BeatFraction.Quarter) return beat / 4; else if (fraction == BeatFraction.Eighth) return beat / 8; else return beat / 16; } diff --git a/libs/core/pins.cpp b/libs/core/pins.cpp index 47e30ba4..4b8b2461 100644 --- a/libs/core/pins.cpp +++ b/libs/core/pins.cpp @@ -20,6 +20,9 @@ enum class DigitalPin { //P16 = MICROBIT_ID_IO_P16, P19 = MICROBIT_ID_IO_P19, P20 = MICROBIT_ID_IO_P20, + P28 = CALLIOPE_ID_IO_P28, + P29 = CALLIOPE_ID_IO_P29, + P30 = CALLIOPE_ID_IO_P30 }; enum class AnalogPin { @@ -29,6 +32,8 @@ enum class AnalogPin { P3 = MICROBIT_ID_IO_P3, P4 = MICROBIT_ID_IO_P4, P10 = MICROBIT_ID_IO_P10, + P29 = CALLIOPE_ID_IO_P29, + P30 = CALLIOPE_ID_IO_P30 }; enum class PulseValue { @@ -74,6 +79,9 @@ MicroBitPin *getPin(int id) { case CALLIOPE_ID_IO_P14: return &uBit.io.CAL_P14; case CALLIOPE_ID_IO_P15: return &uBit.io.CAL_P15; case CALLIOPE_ID_IO_P22: return &uBit.io.CAL_P22; + case CALLIOPE_ID_IO_P28: return &uBit.io.CAL_P28; + case CALLIOPE_ID_IO_P29: return &uBit.io.CAL_P29; + case CALLIOPE_ID_IO_P30: return &uBit.io.CAL_P30; default: return NULL; } }