From f700ff2da86199bc6eeb4e1f7ef99f44fa609303 Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Thu, 26 Nov 2015 21:14:44 -0500 Subject: [PATCH 1/6] Add chord block --- js/runtime.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ playground.html | 10 +++++++++ 2 files changed, 67 insertions(+) diff --git a/js/runtime.js b/js/runtime.js index 5737e373..a5317837 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -1023,6 +1023,63 @@ var newNote = note + length; song += newNote; }, + playChord: function(){ + var args = [].slice.call(arguments) + var oscenv = args[0]; + var octave = args[1]; + var freqs = [] + for (var i = 2; i < args.length; i++) { + var freq; + switch(args[i]){ + case "A": + freq = 55.000; + break; + case "A#/Bb": + freq = 58.270; + break; + case "B": + freq = 61.735; + break; + case "C": + freq = 65.406; + break; + case "C#/Db": + freq = 69.296; + break; + case "D": + freq = 73.416; + break; + case "D#/Eb": + freq = 77.782; + break; + case "E": + freq = 82.407; + break; + case "F": + freq = 87.307; + break; + case "F#/Gb": + freq = 92.499; + break; + case "G": + freq = 97.999; + break; + case "G#/Ab": + freq = 103.826; + break; + } + parseInt(octave); + freq = freq * Math.pow(2, octave-1); + freqs.push(freq); + } + T("interval", {interval:"L4", timeout:"L4"}, function() { + for (var i = 0; i < freqs.length; i++) { + oscenv.noteOnWithFreq(freqs[i], 64); + } + }).on("ended", function() { + this.stop(); + }).set({buddies:oscenv}).start(); + }, playAudio: function(audio){ audio.play(); }, diff --git a/playground.html b/playground.html index 3923af98..d7a516ee 100644 --- a/playground.html +++ b/playground.html @@ -240,6 +240,16 @@

Waterbear Playground

octave beats + + play chord + instrument + octave + + note + + + + play audio From 384002754f9595e6198a0534429244a51a259084 Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Sat, 28 Nov 2015 19:05:02 -0500 Subject: [PATCH 2/6] Rename some things for clarity --- js/runtime.js | 16 +++++++--------- playground.html | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/js/runtime.js b/js/runtime.js index a5317837..81f99b85 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -944,7 +944,7 @@ var audio = T("audio", {load:file}); return audio; }, - playNote: function(note, octave, beats){ + addNote: function(note, octave, beats){ switch(note){ case "A": note = "a"; @@ -1083,7 +1083,7 @@ playAudio: function(audio){ audio.play(); }, - playInstrument: function(sound){ + playNotes: function(sound){ console.log(song); T("mml", {mml:song}, sound).on("ended", function() { sound.pause(); @@ -1091,24 +1091,22 @@ }).start(); song = "o4 l4 V12 "; }, - mml: function(sound, mml){ + playMML: function(sound, mml){ var gen = T("OscGen", {wave:sound, env:{type:"perc"}, mul:0.25}).play(); T("mml", {mml:mml}, gen).on("ended", function() { gen.pause(); this.stop(); }).start(); }, - tempo: function(tempo){ + tempoChange: function(tempo){ song += ("t" + tempo + " "); }, - pause: function(sound){ + pauseAudio: function(sound){ if (assets.sounds[sound.name]){ assets.sounds[sound.name].pause(); } }, - keys: function(wave, vol){ - var synth = T("OscGen", {wave:wave, mul:vol}).play(); - + keys: function(synth, vol){ var keydict = T("ndict.key"); var midicps = T("midicps"); T("keyboard").on("keydown", function(e) { @@ -1126,7 +1124,7 @@ alert("Play notes on the keyboard"); }, - effect: function(effect){ + soundEffect: function(effect){ switch(effect) { case "laser": var table = [1760, [110, "200ms"]]; diff --git a/playground.html b/playground.html index d7a516ee..0a524a17 100644 --- a/playground.html +++ b/playground.html @@ -228,21 +228,22 @@

Waterbear Playground

Play and manipulate existing sound files or synthesize new sounds.

- instrument + synth + wave attack release audio - + note octave beats play chord - instrument + synth octave note @@ -253,25 +254,24 @@

Waterbear Playground

play audio - - play instrument + + play notes - - instrument + + synth mml - + set tempo - + pause keys - wave - vol + synth - + sound effect From 954eb708d849771be5b5abb227a5eec0fd78ce7f Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Sat, 28 Nov 2015 19:14:59 -0500 Subject: [PATCH 3/6] Chord blocks supports notes in different octaves --- js/runtime.js | 5 +++-- playground.html | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/js/runtime.js b/js/runtime.js index 81f99b85..57cf67a6 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -1026,9 +1026,9 @@ playChord: function(){ var args = [].slice.call(arguments) var oscenv = args[0]; - var octave = args[1]; + // var octave = args[1]; var freqs = [] - for (var i = 2; i < args.length; i++) { + for (var i = 1; i < args.length; i++) { var freq; switch(args[i]){ case "A": @@ -1068,6 +1068,7 @@ freq = 103.826; break; } + var octave = args[++i]; parseInt(octave); freq = freq * Math.pow(2, octave-1); freqs.push(freq); diff --git a/playground.html b/playground.html index 0a524a17..db809225 100644 --- a/playground.html +++ b/playground.html @@ -244,9 +244,9 @@

Waterbear Playground

play chord synth - octave note + octave From 4983fe9bd6c2749233323231a9114701ab1f84bf Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Sat, 28 Nov 2015 21:13:52 -0500 Subject: [PATCH 4/6] Song example --- example/twinkling_song.wb | 139 ++++++++++++++++++++++++++++++++++++++ images/png/star.png | Bin 0 -> 46179 bytes js/app.js | 3 +- js/runtime.js | 1 - 4 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 example/twinkling_song.wb create mode 100644 images/png/star.png diff --git a/example/twinkling_song.wb b/example/twinkling_song.wb new file mode 100644 index 00000000..2d68df74 --- /dev/null +++ b/example/twinkling_song.wb @@ -0,0 +1,139 @@ +
+ set + +
+ +
+
+ to
image from url
+ +
+
+ +
scale
star
+ +
by
+ + +
+ font + +
+ + +
+ each frame + + +
frame
+ +
+
+ +
elapsed
+ +
+
+
+ + +
clear to
red
random int fromto
+ + +
green
random int fromto
+ + +
blue
random int fromto
+ + +
+ + + +
+ +
draw
star
+ +
at
random point
+ +
+ + +
+ set + +
+ +
+
+ to
synthwaveattackrelease
+ + + + +
+
+ +
set tempo
+ +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
noteoctavebeats
+ + + +
play notes
synth1
+ +
+ +
\ No newline at end of file diff --git a/images/png/star.png b/images/png/star.png new file mode 100644 index 0000000000000000000000000000000000000000..0e63e2819a7aaa73723d31dc734438360cedeb1a GIT binary patch literal 46179 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 A(EtDd literal 0 HcmV?d00001 diff --git a/js/app.js b/js/app.js index 0a932f31..80c25cdd 100644 --- a/js/app.js +++ b/js/app.js @@ -202,7 +202,8 @@ function handleExampleButton(evt){ handleExample('Dance', 'dance'), handleExample('Simple Bounce', 'bounce'), handleExample('Simple Move', 'simple_move'), - handleExample('Simple Pong', 'simple_pong') + handleExample('Simple Pong', 'simple_pong'), + handleExample("Twinkling Song", 'twinkling_song') ] } ); diff --git a/js/runtime.js b/js/runtime.js index 57cf67a6..d0155f2a 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -1026,7 +1026,6 @@ playChord: function(){ var args = [].slice.call(arguments) var oscenv = args[0]; - // var octave = args[1]; var freqs = [] for (var i = 1; i < args.length; i++) { var freq; From 974de9bb11285da4440d9d517a19dcc26ae52e11 Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Sun, 6 Dec 2015 17:38:47 -0500 Subject: [PATCH 5/6] Tests for sound blocks --- js/runtime.js | 13 +++++---- playground.html | 2 +- test/runtime.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 7 deletions(-) diff --git a/js/runtime.js b/js/runtime.js index 7ad52d89..81c1f2e3 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -1141,7 +1141,9 @@ }).set({buddies:oscenv}).start(); }, playAudio: function(audio){ - audio.play(); + if (audio){ + audio.play(); + } }, playNotes: function(sound){ console.log(song); @@ -1161,12 +1163,12 @@ tempoChange: function(tempo){ song += ("t" + tempo + " "); }, - pauseAudio: function(sound){ - if (assets.sounds[sound.name]){ - assets.sounds[sound.name].pause(); + pauseAudio: function(audio){ + if (audio){ + audio.pause(); } }, - keys: function(synth, vol){ + keys: function(synth){ var keydict = T("ndict.key"); var midicps = T("midicps"); T("keyboard").on("keydown", function(e) { @@ -1181,7 +1183,6 @@ synth.noteOff(midi, 100); } }).start(); - alert("Play notes on the keyboard"); }, soundEffect: function(effect){ diff --git a/playground.html b/playground.html index 5d72516e..cbccb87c 100644 --- a/playground.html +++ b/playground.html @@ -241,7 +241,7 @@

Waterbear Playground

octave beats
- + play chord synth diff --git a/test/runtime.js b/test/runtime.js index e66c88e7..79a3cba0 100644 --- a/test/runtime.js +++ b/test/runtime.js @@ -315,6 +315,84 @@ QUnit.test('check for collision, no colliding circle and polygon', function(asse }); /* TODO: sound */ +QUnit.module('sound'); +QUnit.test('get', function(assert){ + var sound = runtime.sound; + var synth = sound.get('tri', '10', '300'); + assert.ok(synth); +}); +QUnit.test('addNote', function(assert){ + var sound = runtime.sound; + var notes = ['C','C#/Db','D','D#/Eb','E','F','F#/Gb','G','G#/Ab','A','A#/Bb','B','Rest']; + notes.forEach(function (note, index) { + sound.addNote(note, '4', '1/4'); + }); + var octaves = ['1','2','3','4','5','6','7','8']; + octaves.forEach(function (octave, index) { + sound.addNote('C', octave, '1/16'); + }) + var beats = ['1/32','1/16','1/8','1/4','1/2','1']; + beats.forEach(function (length, index) { + sound.addNote('C', '3', length); + }) + assert.ok(sound); +}); +QUnit.test('playChord', function(assert){ + var sound = runtime.sound; + var synth = sound.get('tri', '10', '300'); + sound.playChord(synth, 'A', '4', 'A#/Bb', '4', 'B', '4', 'C', '4', 'C#/Db', '4', 'D', '4', 'D#/Eb', '4', 'E', '4', 'F', '4', 'F#/Gb', '4', 'G', '4', 'G#/Ab', '4'); + assert.ok(sound); +}); +QUnit.test('playNotes', function(assert){ + var sound = runtime.sound; + var synth = sound.get('tri', '10', '300'); + sound.playNotes(synth); + assert.ok(sound); +}); +QUnit.test('playMML', function(assert){ + var sound = runtime.sound; + var synth = sound.get('tri', '10', '300'); + var mml = "abcdefg"; + sound.playMML(synth, mml); + assert.ok(sound); +}); +QUnit.test('tempoChange', function(assert){ + var sound = runtime.sound; + sound.tempoChange('200'); + assert.ok(sound); +}); +QUnit.test('keys', function(assert){ + var sound = runtime.sound; + var synth = sound.get('tri', '10', '300'); + sound.keys(synth); + assert.ok(sound); +}); +QUnit.test('soundEffect', function(assert){ + var sound = runtime.sound; + sound.soundEffect('laser'); + sound.soundEffect('alarm'); + assert.ok(sound); +}); +QUnit.test('getAudio', function(assert){ + var sound = runtime.sound; + var audio = sound.getAudio('/sounds/pianoA.wav'); + assert.ok(audio); +}); +QUnit.test('playAudio', function(assert){ + var sound = runtime.sound; + var audio = sound.getAudio('/sounds/pianoA.wav'); + sound.playAudio(audio); + sound.playAudio(); + assert.ok(sound); +}); +QUnit.test('pauseAudio', function(assert){ + var sound = runtime.sound; + var audio = sound.getAudio('/sounds/pianoA.wav'); + sound.playAudio(audio); + sound.pauseAudio(audio); + sound.pauseAudio(); + assert.ok(sound); +}); /* TODO: arrays */ QUnit.module('arrays'); QUnit.test('create', function(assert){ From 33687a72e2665ba94dd5646fd159b813cffe15ec Mon Sep 17 00:00:00 2001 From: Alex MacLean Date: Sun, 6 Dec 2015 20:03:51 -0500 Subject: [PATCH 6/6] Removed the log from the playNotes block and alert from the keys block --- js/runtime.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js/runtime.js b/js/runtime.js index 81c1f2e3..aae9578d 100644 --- a/js/runtime.js +++ b/js/runtime.js @@ -1146,7 +1146,6 @@ } }, playNotes: function(sound){ - console.log(song); T("mml", {mml:song}, sound).on("ended", function() { sound.pause(); this.stop(); @@ -1183,7 +1182,6 @@ synth.noteOff(midi, 100); } }).start(); - alert("Play notes on the keyboard"); }, soundEffect: function(effect){ switch(effect) {