Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
0c604498d3 | |||
a8ec408f96 | |||
40fe1b4616 | |||
e52da19925 | |||
d558f70118 | |||
8fca50e907 | |||
8c4abe979b | |||
d4fa9dab1b | |||
955b67b6b8 | |||
739be09ac9 |
@ -1,3 +1,3 @@
|
||||
{
|
||||
"appref": "v0.5.31"
|
||||
"appref": "v0.5.37"
|
||||
}
|
||||
|
BIN
docs/static/mb/device/usb-generic.jpg
vendored
BIN
docs/static/mb/device/usb-generic.jpg
vendored
Binary file not shown.
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 68 KiB |
BIN
docs/static/mb/device/usb-mac.jpg
vendored
BIN
docs/static/mb/device/usb-mac.jpg
vendored
Binary file not shown.
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 159 KiB |
BIN
docs/static/mb/device/usb-thin.jpg
vendored
BIN
docs/static/mb/device/usb-thin.jpg
vendored
Binary file not shown.
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 67 KiB |
@ -1,54 +1,173 @@
|
||||
/*basic.showString("RGB")
|
||||
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.showString("RGB");
|
||||
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);
|
||||
basic.showString("Gesten")
|
||||
basic.showString("Gesten");
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
basic.showString("S")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.LogoUp, () => {
|
||||
basic.showString("U")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.LogoDown, () => {
|
||||
basic.showString("D")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.ScreenUp, () => {
|
||||
basic.showString("+")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.TiltRight, () => {
|
||||
basic.showString("R")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.FreeFall, () => {
|
||||
basic.showString("F")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.ScreenDown, () => {
|
||||
basic.showString("-")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.TiltLeft, () => {
|
||||
basic.showString("L")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.ThreeG, () => {
|
||||
basic.showString("3")
|
||||
})
|
||||
});
|
||||
input.onGesture(Gesture.SixG, () => {
|
||||
basic.showString("6")
|
||||
})
|
||||
*/
|
||||
});
|
||||
input.onPinPressed(TouchPin.P0, () => {
|
||||
basic.showNumber(0)
|
||||
})
|
||||
});
|
||||
input.onPinPressed(TouchPin.P1, () => {
|
||||
basic.showNumber(1)
|
||||
})
|
||||
});
|
||||
input.onPinPressed(TouchPin.P2, () => {
|
||||
basic.showNumber(2)
|
||||
})
|
||||
});
|
||||
input.onPinPressed(TouchPin.P3, () => {
|
||||
basic.showNumber(3)
|
||||
})
|
||||
});
|
||||
|
||||
basic.showString("Sound");
|
||||
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]);
|
||||
}
|
28
libs/core/music.cpp
Normal file
28
libs/core/music.cpp
Normal file
@ -0,0 +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" async
|
||||
void playTone(int freqency, int ms) {
|
||||
uBit.soundmotor.Sound_On(freqency);
|
||||
if(ms > 0) uBit.sleep(ms);
|
||||
uBit.soundmotor.Sound_Off();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
@ -129,30 +129,30 @@ enum BeatFraction {
|
||||
namespace music {
|
||||
let beatsPerMinute: number = 120;
|
||||
|
||||
/**
|
||||
* Plays a tone through pin ``P0`` 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"
|
||||
export function playTone(frequency: number, ms: number): void {
|
||||
pins.analogSetPitchPin(AnalogPin.P0);
|
||||
pins.analogPitch(frequency, ms);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plays a tone through pin ``P0``.
|
||||
* @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);
|
||||
pins.analogPitch(frequency, 0);
|
||||
}
|
||||
// /**
|
||||
// * Plays a tone through pin ``P0`` 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"
|
||||
// export function playTone(frequency: number, ms: number): void {
|
||||
// pins.analogSetPitchPin(AnalogPin.P0);
|
||||
// pins.analogPitch(frequency, ms);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Plays a tone through pin ``P0``.
|
||||
// * @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);
|
||||
// pins.analogPitch(frequency, 0);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Rests (plays nothing) for a specified time through pin ``P0``.
|
||||
|
@ -23,6 +23,7 @@
|
||||
"led.cpp",
|
||||
"led.ts",
|
||||
"motors.cpp",
|
||||
"music.cpp",
|
||||
"music.ts",
|
||||
"pins.cpp",
|
||||
"pins.ts",
|
||||
|
21
libs/core/shims.d.ts
vendored
21
libs/core/shims.d.ts
vendored
@ -524,6 +524,27 @@ 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" async shim=music::playTone
|
||||
function playTone(freqency: number, ms: number): void;
|
||||
|
||||
/**
|
||||
* 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" shim=music::ringTone
|
||||
function ringTone(frequency: number): void;
|
||||
}
|
||||
declare namespace pins {
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pxt-calliope",
|
||||
"version": "0.5.37",
|
||||
"version": "0.5.41",
|
||||
"description": "calliope target for PXT",
|
||||
"keywords": [
|
||||
"JavaScript",
|
||||
@ -30,7 +30,7 @@
|
||||
"typescript": "^1.8.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"pxt-core": "0.5.11",
|
||||
"pxt-core": "0.5.17",
|
||||
"less": "^2.6.0",
|
||||
"semantic-ui-less": "^2.2.4"
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ namespace pxsim {
|
||||
radioState: RadioState;
|
||||
neopixelState: NeoPixelState;
|
||||
rgbLedState: number;
|
||||
speakerState: SpeakerState;
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
@ -59,6 +60,7 @@ namespace pxsim {
|
||||
this.builtinParts["lightsensor"] = this.lightSensorState = new LightSensorState();
|
||||
this.builtinParts["compass"] = this.compassState = new CompassState();
|
||||
this.builtinParts["neopixel"] = this.neopixelState = new NeoPixelState();
|
||||
this.builtinParts["speaker"] = this.speakerState = new SpeakerState();
|
||||
|
||||
this.builtinVisuals["buttonpair"] = () => new visuals.ButtonPairView();
|
||||
this.builtinVisuals["ledmatrix"] = () => new visuals.LedMatrixView();
|
||||
|
29
sim/state/music.ts
Normal file
29
sim/state/music.ts
Normal file
@ -0,0 +1,29 @@
|
||||
namespace pxsim {
|
||||
export class SpeakerState {
|
||||
frequency: number;
|
||||
ms: number;
|
||||
}
|
||||
|
||||
}
|
||||
namespace pxsim.music {
|
||||
|
||||
export function playTone(frequency: number, ms: number) {
|
||||
const b = board();
|
||||
b.speakerState.frequency = frequency;
|
||||
b.speakerState.ms = ms;
|
||||
|
||||
runtime.queueDisplayUpdate();
|
||||
let cb = getResume();
|
||||
AudioContextManager.tone(frequency, 1);
|
||||
if (ms <= 0) cb();
|
||||
else {
|
||||
setTimeout(() => {
|
||||
AudioContextManager.stop();
|
||||
b.speakerState.frequency = 0;
|
||||
b.speakerState.ms = 0;
|
||||
runtime.queueDisplayUpdate();
|
||||
cb()
|
||||
}, ms);
|
||||
}
|
||||
}
|
||||
}
|
@ -1349,6 +1349,7 @@ namespace pxsim.visuals {
|
||||
this.updateButtonAB();
|
||||
this.updateGestures();
|
||||
this.updateRgbLed();
|
||||
this.updateSpeaker();
|
||||
|
||||
if (!runtime || runtime.dead) svg.addClass(this.element, "grayscale");
|
||||
else svg.removeClass(this.element, "grayscale");
|
||||
@ -1371,6 +1372,15 @@ namespace pxsim.visuals {
|
||||
}
|
||||
}
|
||||
|
||||
private updateSpeaker() {
|
||||
let state = this.board;
|
||||
if (state.speakerState.frequency) {
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private updateGestures() {
|
||||
let state = this.board;
|
||||
if (state.accelerometerState.useShake && !this.shakeButton) {
|
||||
|
Reference in New Issue
Block a user