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,