From 96d5dc206498515f059c9b9a068501f8714621b4 Mon Sep 17 00:00:00 2001 From: "Matthias L. Jugel" Date: Thu, 27 Oct 2016 17:44:38 +0200 Subject: [PATCH] fixed interface function names, add sound functionality --- libs/calliope-test/calliope.ts | 170 +++++++++++++++++++++++---------- libs/core/motors.cpp | 8 +- libs/core/music.cpp | 23 ++++- libs/core/music.ts | 20 ++-- libs/core/shims.d.ts | 12 +++ 5 files changed, 170 insertions(+), 63 deletions(-) diff --git a/libs/calliope-test/calliope.ts b/libs/calliope-test/calliope.ts index 79ecf3fd..ca8d9046 100644 --- a/libs/calliope-test/calliope.ts +++ b/libs/calliope-test/calliope.ts @@ -1,52 +1,3 @@ -function note(n: Note, l: BeatFraction) { - return [music.noteFrequency(n), music.beat(l)]; -} - -var notes = [ - note(Note.E, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), - note(Note.G, BeatFraction.Quarter), note(Note.G, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), - note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), - note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), - note(Note.E, BeatFraction.Quarter + BeatFraction.Eighth), - note(Note.D, BeatFraction.Eighth), note(Note.D, BeatFraction.Half), - note(Note.E, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), - note(Note.G, BeatFraction.Quarter), note(Note.G, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), - note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), - note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), - note(Note.D, BeatFraction.Quarter + BeatFraction.Eighth), - note(Note.C, BeatFraction.Eighth), note(Note.C, BeatFraction.Half), - note(Note.D, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), - note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), - note(Note.E, BeatFraction.Eighth), note(Note.F, BeatFraction.Eighth), - note(Note.E, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), - note(Note.E, BeatFraction.Eighth), note(Note.F, BeatFraction.Eighth), - note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), - note(Note.D, BeatFraction.Quarter), note(Note.G3, BeatFraction.Quarter), note(Note.E, BeatFraction.Half), - note(Note.E, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), note(Note.G, BeatFraction.Quarter), - note(Note.G, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), - note(Note.E, BeatFraction.Eighth), note(Note.F, BeatFraction.Eighth), - note(Note.C, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), - note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter + BeatFraction.Eighth), - note(Note.C, BeatFraction.Eighth), note(Note.C, BeatFraction.Half) -]; - -let whole = music.beat(BeatFraction.Whole); -for (var t = 0; t < notes.length; t++) { - serial.writeNumber(notes[t][0]); - serial.writeNumber(notes[t][1]); - serial.writeLine("\r\n"); - music.playTone(notes[t][0], notes[t][1]); - basic.pause(whole - notes[t][1]); -} - -/*music.playTone(Note.A, 2000); -music.playTone(Note.C, 2000); -music.playTone(Note.F, 2000); - -music.playTone(Note.A, 100); -music.playTone(1000, 100); -music.playTone(3000, 100); - basic.setLedColor(Colors.Blue); basic.pause(500); basic.setLedColor(Colors.Red); @@ -99,4 +50,123 @@ input.onPinPressed(TouchPin.P2, () => { input.onPinPressed(TouchPin.P3, () => { basic.showNumber(3); }); -*/ \ No newline at end of file + + +music.setTempo(150); +let whole = music.beat(BeatFraction.Whole); +function note(n: Note, l: BeatFraction): number[] { + return [music.noteFrequency(n), music.beat(l)]; +} + +function getNoteName(frequency: number): string { + switch (frequency) { + case 262: + return "C"; + case 277: + return "CSharp"; + case 294: + return "D"; + case 311: + return "Eb"; + case 330: + return "E"; + case 349: + return "F"; + case 370: + return "FSharp"; + case 392: + return "G"; + case 415: + return "GSharp"; + case 440: + return "A"; + case 466: + return "Bb"; + case 494: + return "B"; + case 131: + return "C3"; + case 139: + return "CSharp3"; + case 147: + return "D3"; + case 156: + return "Eb3"; + case 165: + return "E3"; + case 175: + return "F3"; + case 185: + return "FSharp3"; + case 196: + return "G3"; + case 208: + return "GSharp3"; + case 220: + return "A3"; + case 233: + return "Bb3"; + case 247: + return "B3"; + case 523: + return "C5"; + case 555: + return "CSharp5"; + case 587: + return "D5"; + case 622: + return "Eb5"; + case 659: + return "E5"; + case 698: + return "F5"; + case 740: + return "FSharp5"; + case 784: + return "G5"; + case 831: + return "GSharp5"; + case 880: + return "A5"; + case 932: + return "Bb5"; + case 989: + return "B5"; + default: + return "?"; + } +} + +var notes = [ + note(Note.E, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), + note(Note.G, BeatFraction.Quarter), note(Note.G, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), + note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), + note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), + note(Note.E, BeatFraction.Quarter + BeatFraction.Eighth), + note(Note.D, BeatFraction.Eighth), note(Note.D, BeatFraction.Half), + note(Note.E, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), + note(Note.G, BeatFraction.Quarter), note(Note.G, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), + note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), + note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), + note(Note.D, BeatFraction.Quarter + BeatFraction.Eighth), + note(Note.C, BeatFraction.Eighth), note(Note.C, BeatFraction.Half), + note(Note.D, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), + note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), + note(Note.E, BeatFraction.Eighth), note(Note.F, BeatFraction.Eighth), + note(Note.E, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), + note(Note.E, BeatFraction.Eighth), note(Note.F, BeatFraction.Eighth), + note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), + note(Note.D, BeatFraction.Quarter), note(Note.G3, BeatFraction.Quarter), note(Note.E, BeatFraction.Half), + note(Note.E, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), note(Note.G, BeatFraction.Quarter), + note(Note.G, BeatFraction.Quarter), note(Note.F, BeatFraction.Quarter), note(Note.E, BeatFraction.Quarter), + note(Note.E, BeatFraction.Eighth), note(Note.F, BeatFraction.Eighth), + note(Note.C, BeatFraction.Quarter), note(Note.C, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter), + note(Note.E, BeatFraction.Quarter), note(Note.D, BeatFraction.Quarter + BeatFraction.Eighth), + note(Note.C, BeatFraction.Eighth), note(Note.C, BeatFraction.Half) +]; + +for (var t = 0; t < notes.length; t++) { + music.playTone(notes[t][0], notes[t][1]); + basic.showString(getNoteName(notes[t][0])); + music.rest(whole - notes[t][1]); +} \ No newline at end of file diff --git a/libs/core/motors.cpp b/libs/core/motors.cpp index 2a2366f3..74034eec 100644 --- a/libs/core/motors.cpp +++ b/libs/core/motors.cpp @@ -12,6 +12,12 @@ namespace motors { //% blockId=motor_on block="motor on at %percent|%" //% parts=dcmotor void motorOn(int power) { - uBit.soundmotor.Motor_On(power); + uBit.soundmotor.motorOn(power); } + + void motorOff() { + uBit.soundmotor.motorAOff(); + uBit.soundmotor.motorBOff(); + } + } \ No newline at end of file diff --git a/libs/core/music.cpp b/libs/core/music.cpp index 00927c11..3311cc19 100644 --- a/libs/core/music.cpp +++ b/libs/core/music.cpp @@ -1,9 +1,28 @@ #include "ksbit.h" namespace music { + /** + * 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) + */ + //% help=music/play-tone weight=90 + //% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" icon="\uf025" blockGap=8 + //% parts="speaker" void playTone(int freqency, int ms) { - uBit.soundmotor.Sound_On(freqency); + uBit.soundmotor.soundOn(freqency); if(ms > 0) uBit.sleep(ms); - uBit.soundmotor.Sound_Off(); + uBit.soundmotor.soundOff(); } + + /** + * 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" + void ringTone(int frequency) { + playTone(frequency, 0); + } } diff --git a/libs/core/music.ts b/libs/core/music.ts index 70d43ef7..fdddd724 100644 --- a/libs/core/music.ts +++ b/libs/core/music.ts @@ -134,9 +134,9 @@ namespace music { * @param frequency pitch of the tone to play in Hertz (Hz) * @param ms tone duration in milliseconds (ms) */ - //% help=music/play-tone weight=90 - //% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" icon="\uf025" blockGap=8 - //% parts="speaker" + // //% help=music/play-tone weight=90 + // //% 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 { // // TODO check timing // pins.digitalWritePin(DigitalPin.P28, 1); // switch on the motor driver @@ -152,13 +152,13 @@ namespace music { //% 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 { - // 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 - } + // export function ringTone(frequency: number): void { + // // 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 + // } /** * Rests (plays nothing) for a specified time through pin ``P0``. diff --git a/libs/core/shims.d.ts b/libs/core/shims.d.ts index eac6dda2..6f5f91fd 100644 --- a/libs/core/shims.d.ts +++ b/libs/core/shims.d.ts @@ -524,6 +524,18 @@ declare namespace motors { //% parts=dcmotor shim=motors::motorOn function motorOn(power: number): void; } +declare namespace music { + + /** + * 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) + */ + //% help=music/play-tone weight=90 + //% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" icon="\uf025" blockGap=8 + //% parts="speaker" shim=music::playTone + function playTone(freqency: number, ms: number): void; +} declare namespace pins { /**