From 58e8e311a3d4733f8d8da2f00b8e1aee00e6ced7 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 6 Mar 2022 14:39:33 +0100 Subject: [PATCH] use velocity in tone + midi + defaultSynth --- repl/src/midi.ts | 22 +++++++++++----------- repl/src/tone.ts | 9 ++++++--- repl/src/useRepl.ts | 4 ++-- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/repl/src/midi.ts b/repl/src/midi.ts index 523636c3..e00352e8 100644 --- a/repl/src/midi.ts +++ b/repl/src/midi.ts @@ -32,12 +32,12 @@ Pattern.prototype.midi = function (output: string, channel = 1) { }')` ); } - return this.fmap((value: any) => ({ - ...value, - onTrigger: (time: number, event: any) => { - value = value.value || value; - if (!isNote(value)) { - throw new Error('not a note: ' + value); + return this._withEvent((event: any) => { + const onTrigger = (time: number, event: any) => { + let note = event.value; + const velocity = event.context?.velocity ?? 0.9; + if (!isNote(note)) { + throw new Error('not a note: ' + note); } if (!WebMidi.enabled) { throw new Error(`🎹 WebMidi is not enabled. Supported Browsers: https://caniuse.com/?search=webmidi`); @@ -58,14 +58,14 @@ Pattern.prototype.midi = function (output: string, channel = 1) { time = time * 1000 + timingOffset; // const inMs = '+' + (time - Tone.context.currentTime) * 1000; // await enableWebMidi() - device.playNote(value, channel, { + device.playNote(note, channel, { time, duration: event.duration * 1000 - 5, - // velocity: velocity ?? 0.5, - velocity: 0.9, + velocity, }); - }, - })); + }; + return event.setContext({ ...event.context, onTrigger }); + }); }; export function useWebMidi(props?: any) { diff --git a/repl/src/tone.ts b/repl/src/tone.ts index a3c4e2e3..2de5f917 100644 --- a/repl/src/tone.ts +++ b/repl/src/tone.ts @@ -32,9 +32,11 @@ Pattern.prototype.tone = function (instrument) { return this._withEvent((event) => { const onTrigger = (time, event) => { let note = event.value; + let velocity = event.context?.velocity ?? 0.75; switch (instrument.constructor.name) { case 'PluckSynth': // note = getPlayableNoteValue(event); + // velocity? instrument.triggerAttack(note, time); break; case 'NoiseSynth': @@ -43,23 +45,24 @@ Pattern.prototype.tone = function (instrument) { case 'Piano': // note = getPlayableNoteValue(event); instrument.keyDown({ note, time, velocity: 0.5 }); - instrument.keyUp({ note, time: time + event.duration }); + instrument.keyUp({ note, time: time + event.duration, velocity }); break; case 'Sampler': // note = getPlayableNoteValue(event); - instrument.triggerAttackRelease(note, event.duration, time); + instrument.triggerAttackRelease(note, event.duration, time, velocity); break; case 'Players': if (!instrument.has(event.value)) { throw new Error(`name "${event.value}" not defined for players`); } const player = instrument.player(event.value); + // velocity ? player.start(time); player.stop(time + event.duration); break; default: // note = getPlayableNoteValue(event); - instrument.triggerAttackRelease(note, event.duration, time); + instrument.triggerAttackRelease(note, event.duration, time, velocity); } }; return event.setContext({ ...event.context, instrument, onTrigger }); diff --git a/repl/src/useRepl.ts b/repl/src/useRepl.ts index af477c9f..b41ba3ea 100644 --- a/repl/src/useRepl.ts +++ b/repl/src/useRepl.ts @@ -61,14 +61,14 @@ function useRepl({ tune, defaultSynth, autolink = true, onEvent, onDraw }: any) (time, event) => { try { onEvent?.(event); - const { onTrigger } = event.context; + const { onTrigger, velocity } = event.context; if (!onTrigger) { const note = event.value; if (!isNote(note)) { throw new Error('not a note: ' + note); } if (defaultSynth) { - defaultSynth.triggerAttackRelease(note, event.duration, time); + defaultSynth.triggerAttackRelease(note, event.duration, time, velocity); } else { throw new Error('no defaultSynth passed to useRepl.'); }