From 27a6ac0c0bc44a241f501bd13bf030e1b55bcf2a Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sat, 10 Dec 2022 22:39:51 +0100 Subject: [PATCH] refactor xen and tone packages --- packages/tone/tone.mjs | 13 ++++--------- packages/xen/index.mjs | 2 ++ packages/xen/tune.mjs | 14 ++++++-------- packages/xen/xen.mjs | 25 +++++++++++-------------- repl/src/App.jsx | 2 -- 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/packages/tone/tone.mjs b/packages/tone/tone.mjs index b5ea4b9e..d57c1f2a 100644 --- a/packages/tone/tone.mjs +++ b/packages/tone/tone.mjs @@ -4,18 +4,15 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { Pattern } from '@strudel.cycles/core'; +import { register } from '@strudel.cycles/core'; import * as _Tone from 'tone'; // import Tone from here, to make sure to get the same AudioContext export const Tone = _Tone; const { - AutoFilter, - Destination, Filter, Gain, - isNote, Synth, PolySynth, MembraneSynth, @@ -49,8 +46,8 @@ export const getDefaultSynth = () => { // https://www.charlie-roberts.com/gibberish/playground/ // with this function, you can play the pattern with any tone synth -Pattern.prototype.tone = function (instrument) { - return this.onTrigger((time, hap) => { +export const tone = register('tone', function (instrument, pat) { + return pat.onTrigger((time, hap) => { let note; let velocity = hap.context?.velocity ?? 0.75; if (instrument instanceof PluckSynth) { @@ -74,9 +71,7 @@ Pattern.prototype.tone = function (instrument) { instrument.triggerAttackRelease(note, hap.duration.valueOf(), time, velocity); } }); -}; - -Pattern.prototype.define('tone', (type, pat) => pat.tone(type), { composable: true, patternified: false }); +}); // synth helpers export const amsynth = (options) => new AMSynth(options); diff --git a/packages/xen/index.mjs b/packages/xen/index.mjs index ec061160..ca813f33 100644 --- a/packages/xen/index.mjs +++ b/packages/xen/index.mjs @@ -1,2 +1,4 @@ import './xen.mjs'; import './tune.mjs'; + +export * from './xen.mjs'; diff --git a/packages/xen/tune.mjs b/packages/xen/tune.mjs index 5685e1a7..d3dd9056 100644 --- a/packages/xen/tune.mjs +++ b/packages/xen/tune.mjs @@ -5,18 +5,16 @@ This program is free software: you can redistribute it and/or modify it under th */ import Tune from './tunejs.js'; -import { Pattern } from '@strudel.cycles/core'; +import { register } from '@strudel.cycles/core'; -Pattern.prototype._tune = function (scale, tonic = 220) { +export const tune = register('tune', (scale, pat) => { const tune = new Tune(); if (!tune.isValidScale(scale)) { throw new Error('not a valid tune.js scale name: "' + scale + '". See http://abbernie.github.io/tune/scales.html'); } tune.loadScale(scale); - tune.tonicize(tonic); - return this._asNumber()._withHap((hap) => { - return hap.withValue(() => tune.note(hap.value)).setContext({ ...hap.context, type: 'frequency' }); + tune.tonicize(1); + return pat.withHap((hap) => { + return hap.withValue(() => tune.note(hap.value)); }); -}; - -Pattern.prototype.define('tune', (scale, pat) => pat.tune(scale), { composable: true, patternified: true }); +}); diff --git a/packages/xen/xen.mjs b/packages/xen/xen.mjs index 404ab53b..362066a1 100644 --- a/packages/xen/xen.mjs +++ b/packages/xen/xen.mjs @@ -4,7 +4,7 @@ Copyright (C) 2022 Strudel contributors - see . */ -import { Pattern, _mod } from '@strudel.cycles/core'; +import { register, _mod, parseNumeral } from '@strudel.cycles/core'; export function edo(name) { if (!/^[1-9]+[0-9]*edo$/.test(name)) { @@ -48,20 +48,17 @@ function xenOffset(xenScale, offset, index = 0) { } // scaleNameOrRatios: string || number[], steps?: number -Pattern.prototype._xen = function (scaleNameOrRatios, steps) { - return this._asNumber()._withHap((hap) => { +export const xen = register('xen', function (scaleNameOrRatios, pat) { + return pat.withHap((hap) => { const scale = getXenScale(scaleNameOrRatios); - steps = steps || scale.length; - const frequency = xenOffset(scale, hap.value); - return hap.withValue(() => frequency).setContext({ ...hap.context, type: 'frequency' }); + const frequency = xenOffset(scale, parseNumeral(hap.value)); + return hap.withValue(() => frequency); }); -}; +}); -Pattern.prototype.tuning = function (steps) { - return this._asNumber()._withHap((hap) => { - const frequency = xenOffset(steps, hap.value); - return hap.withValue(() => frequency).setContext({ ...hap.context, type: 'frequency' }); +export const tuning = register('tuning', function (ratios, pat) { + return pat.withHap((hap) => { + const frequency = xenOffset(ratios, parseNumeral(hap.value)); + return hap.withValue(() => frequency); }); -}; -Pattern.prototype.define('xen', (scale, pat) => pat.xen(scale), { composable: true, patternified: true }); -// Pattern.prototype.define('tuning', (scale, pat) => pat.xen(scale), { composable: true, patternified: false }); +}); diff --git a/repl/src/App.jsx b/repl/src/App.jsx index 42382016..3b3c174d 100644 --- a/repl/src/App.jsx +++ b/repl/src/App.jsx @@ -33,7 +33,6 @@ const supabase = createClient( const modules = [ import('@strudel.cycles/core'), - // import('@strudel.cycles/tone'), import('@strudel.cycles/tonal'), import('@strudel.cycles/mini'), import('@strudel.cycles/midi'), @@ -46,7 +45,6 @@ const modules = [ ]; evalScope( - // Tone, controls, // sadly, this cannot be exported from core direclty { WebDirt }, ...modules,