pxt-calliope/libs/core/music.ts

222 lines
6.7 KiB
TypeScript
Raw Normal View History

enum Note {
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=262
C = 262,
//% block=C#
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=277
CSharp = 277,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=294
D = 294,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=311
Eb = 311,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=330
E = 330,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=349
F = 349,
//% block=F#
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=370
FSharp = 370,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=392
G = 392,
//% block=G#
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=415
GSharp = 415,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=440
A = 440,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=466
Bb = 466,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=494
B = 494,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=131
C3 = 131,
//% block=C#3
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=139
CSharp3 = 139,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=147
D3 = 147,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=156
Eb3 = 156,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=165
E3 = 165,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=175
F3 = 175,
//% block=F#3
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=185
FSharp3 = 185,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=196
G3 = 196,
//% block=G#3
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=208
GSharp3 = 208,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=220
A3 = 220,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=233
Bb3 = 233,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=247
B3 = 247,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=262
C4 = 262,
//% block=C#4
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=277
CSharp4 = 277,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=294
D4 = 294,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=311
Eb4 = 311,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=330
E4 = 330,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=349
F4 = 349,
2016-04-12 04:44:39 +02:00
//% block=F#4
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=370
FSharp4 = 370,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=392
G4 = 392,
2016-04-12 04:44:39 +02:00
//% block=G#4
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=415
GSharp4 = 415,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=440
A4 = 440,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=466
Bb4 = 466,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=494
B4 = 494,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=523
C5 = 523,
//% block=C#5
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=555
CSharp5 = 555,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=587
D5 = 587,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=622
Eb5 = 622,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=659
E5 = 659,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=698
F5 = 698,
//% block=F#5
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=740
FSharp5 = 740,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=784
G5 = 784,
//% block=G#5
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=831
GSharp5 = 831,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=880
A5 = 880,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=932
Bb5 = 932,
2017-02-23 18:44:18 +01:00
//% blockIdentity=music.noteFrequency enumval=988
B5 = 988,
2016-03-10 23:01:04 +01:00
}
enum BeatFraction {
//% block=1
2016-03-10 23:01:04 +01:00
Whole = 1,
//% block="1/2"
2016-03-10 23:01:04 +01:00
Half = 2,
//% block="1/4"
2016-09-24 07:27:57 +02:00
Quarter = 4,
//% block="1/8"
2016-03-14 05:35:31 +01:00
Eighth = 8,
//% block="1/16"
2016-03-10 23:01:04 +01:00
Sixteenth = 16
}
2016-04-06 00:59:25 +02:00
/**
* Generation of music tones through pin ``P0``.
*/
2017-01-20 05:55:31 +01:00
//% color=#DF4600 weight=98 icon="\uf025"
2016-03-10 23:01:04 +01:00
namespace music {
2016-05-17 01:24:44 +02:00
let beatsPerMinute: number = 120;
2016-03-10 23:01:04 +01:00
/**
* Rests (plays nothing) for a specified time through pin ``P0``.
2016-05-20 14:40:54 +02:00
* @param ms rest duration in milliseconds (ms)
2016-03-10 23:01:04 +01:00
*/
2016-03-22 06:13:39 +01:00
//% help=music/rest weight=79
2016-03-10 23:01:04 +01:00
//% blockId=device_rest block="rest(ms)|%duration=device_beat"
2016-10-25 08:17:16 +02:00
//% parts="speaker"
2016-03-10 23:01:04 +01:00
export function rest(ms: number): void {
playTone(0, ms);
}
2016-11-16 07:28:05 +01:00
/**
* Plays a tone through ``speaker``.
* @param frequency pitch of the tone to play in Hertz (Hz)
*/
//% help=music/ring-tone weight=80
2017-01-20 05:55:31 +01:00
//% blockId=device_ring block="ring tone (Hz)|%note=device_note" blockGap=8
2016-11-16 07:28:05 +01:00
//% parts="speaker" async
2017-02-23 18:44:18 +01:00
//% useEnumVal=1
2016-11-16 07:28:05 +01:00
export function ringTone(frequency: number) {
playTone(frequency, 0);
}
2016-03-10 23:01:04 +01:00
/**
* Gets the frequency of a note.
2016-05-20 14:40:54 +02:00
* @param name the note name
2016-03-10 23:01:04 +01:00
*/
2016-04-02 07:00:42 +02:00
//% weight=50 help=music/note-frequency
2016-03-10 23:01:04 +01:00
//% blockId=device_note block="%note"
2017-02-23 18:44:18 +01:00
//% shim=TD_ID blockHidden=true
//% blockFieldEditor="note_editor"
//% useEnumVal = 1
export function noteFrequency(name: Note): number {
2016-03-10 23:01:04 +01:00
return name;
}
2016-05-20 14:40:54 +02:00
2016-03-14 16:32:02 +01:00
function init() {
2016-05-20 14:40:54 +02:00
if (beatsPerMinute <= 0) beatsPerMinute = 120;
2016-03-14 16:32:02 +01:00
}
2016-03-10 23:01:04 +01:00
/**
* Returns the duration of a beat in milli-seconds
*/
2016-03-22 06:13:39 +01:00
//% help=music/beat weight=49
2016-03-10 23:01:04 +01:00
//% blockId=device_beat block="%fraction|beat"
export function beat(fraction?: BeatFraction): number {
2016-03-14 16:32:02 +01:00
init();
if (fraction == null) fraction = BeatFraction.Whole;
2016-03-14 05:35:31 +01:00
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;
2016-03-14 05:35:31 +01:00
else if (fraction == BeatFraction.Eighth) return beat / 8;
else return beat / 16;
2016-03-10 23:01:04 +01:00
}
/**
* Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play.
*/
2016-03-22 06:13:39 +01:00
//% help=music/tempo weight=40
2016-03-10 23:01:04 +01:00
//% blockId=device_tempo block="tempo (bpm)" blockGap=8
export function tempo(): number {
2016-03-14 16:32:02 +01:00
init();
2016-03-10 23:01:04 +01:00
return beatsPerMinute;
}
/**
* Change the tempo by the specified amount
* @param bpm The change in beats per minute to the tempo, eg: 20
*/
2016-10-21 17:48:43 +02:00
//% help=music/change-tempo-by weight=39
2016-03-10 23:01:04 +01:00
//% blockId=device_change_tempo block="change tempo by (bpm)|%value" blockGap=8
export function changeTempoBy(bpm: number): void {
2016-08-30 20:17:15 +02:00
init();
2016-08-18 15:00:43 +02:00
setTempo(beatsPerMinute + bpm);
2016-03-10 23:01:04 +01:00
}
/**
* Sets the tempo to the specified amount
* @param bpm The new tempo in beats per minute, eg: 120
*/
2016-06-10 06:41:41 +02:00
//% help=music/set-tempo weight=38
2016-03-10 23:01:04 +01:00
//% blockId=device_set_tempo block="set tempo to (bpm)|%value"
export function setTempo(bpm: number): void {
2016-03-14 16:32:02 +01:00
init();
2016-03-10 23:01:04 +01:00
if (bpm > 0) {
beatsPerMinute = Math.max(1, bpm);
}
}
}