From fe8c4e2bcd65d7e2c15598717f0983b5da25c99b Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Fri, 29 Sep 2023 23:27:43 -0400 Subject: [PATCH] cyclist bridge --- packages/core/cyclist.mjs | 43 ++--------------- packages/core/repl.mjs | 9 +++- packages/desktopbridge/cyclistbridge.mjs | 61 ++++++++++++++++++++++++ packages/desktopbridge/index.mjs | 1 + website/src/repl/Repl.jsx | 1 + 5 files changed, 73 insertions(+), 42 deletions(-) create mode 100644 packages/desktopbridge/cyclistbridge.mjs diff --git a/packages/core/cyclist.mjs b/packages/core/cyclist.mjs index 7304558a8..303525a25 100644 --- a/packages/core/cyclist.mjs +++ b/packages/core/cyclist.mjs @@ -6,8 +6,6 @@ This program is free software: you can redistribute it and/or modify it under th import createClock from './zyklus.mjs'; import { logger } from './logger.mjs'; -import { Invoke } from '../../website/src/tauri.mjs'; -import { listen } from '@tauri-apps/api/event'; export class Cyclist { constructor({ interval, onTrigger, onToggle, onError, getTime, latency = 0.1 }) { @@ -18,30 +16,6 @@ export class Cyclist { this.lastEnd = 0; // query end of last tick this.getTime = getTime; // get absolute time this.onToggle = onToggle; - this.start_timer; - this.abeLinkListener = listen('abelink-event', async (e) => { - const payload = e?.payload; - if (payload == null) { - return; - } - const { play, bpm, timestamp } = payload; - // (if bpm !== prev_bpm) { - //update the clock - // } - if (this.started !== play && play != null) { - if (play) { - this.start_timer = window.setTimeout(() => { - logger('[cyclist] start'); - this.clock.start(); - this.setStarted(true); - }, timestamp - Date.now()); - } else { - this.stop(); - } - } - - const { message, message_type } = e.payload; - }); this.latency = latency; // fixed trigger time offset const round = (x) => Math.round(x * 1000) / 1000; this.clock = createClock( @@ -84,18 +58,13 @@ export class Cyclist { this.started = v; this.onToggle?.(v); } - startClock() {} start() { if (!this.pattern) { throw new Error('Scheduler: no pattern set! call .setPattern first.'); } - - const linkmsg = { - bpm: 110, - play: true, - timestamp: Date.now(), - }; - Invoke('sendabelinkmsg', { linkmsg }); + logger('[cyclist] start'); + this.clock.start(); + this.setStarted(true); } pause() { logger('[cyclist] pause'); @@ -107,12 +76,6 @@ export class Cyclist { this.clock.stop(); this.lastEnd = 0; this.setStarted(false); - const linkmsg = { - bpm: 110, - play: false, - timestamp: Date.now(), - }; - Invoke('sendabelinkmsg', { linkmsg }); } setPattern(pat, autostart = false) { this.pattern = pat; diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index b6866b874..2dc62a728 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -4,6 +4,8 @@ import { logger } from './logger.mjs'; import { setTime } from './time.mjs'; import { evalScope } from './evaluate.mjs'; import { register } from './pattern.mjs'; +import { isTauri } from '../../website/src/tauri.mjs'; +import { CyclistBridge } from '../desktopbridge/cyclistbridge.mjs'; export function repl({ interval, @@ -17,13 +19,16 @@ export function repl({ onToggle, editPattern, }) { - const scheduler = new Cyclist({ + const abelinkEnabled = isTauri(); + const cyclistParams = { interval, onTrigger: getTrigger({ defaultOutput, getTime }), onError: onSchedulerError, getTime, onToggle, - }); + }; + const scheduler = abelinkEnabled ? new CyclistBridge(cyclistParams) : new Cyclist(cyclistParams); + const setPattern = (pattern, autostart = true) => { pattern = editPattern?.(pattern) || pattern; scheduler.setPattern(pattern, autostart); diff --git a/packages/desktopbridge/cyclistbridge.mjs b/packages/desktopbridge/cyclistbridge.mjs new file mode 100644 index 000000000..9bcf32cd6 --- /dev/null +++ b/packages/desktopbridge/cyclistbridge.mjs @@ -0,0 +1,61 @@ +import { Cyclist } from '@strudel.cycles/core'; +import { logger } from '../core/logger.mjs'; +import { Invoke } from '../../website/src/tauri.mjs'; +import { listen } from '@tauri-apps/api/event'; + +export class CyclistBridge extends Cyclist { + constructor(params) { + super(params); + + this.start_timer; + this.abeLinkListener = listen('abelink-event', async (e) => { + const payload = e?.payload; + if (payload == null) { + return; + } + const { play, bpm, timestamp } = payload; + // (if bpm !== prev_bpm) { + //update the clock + // } + if (this.started !== play && play != null) { + if (play) { + this.start_timer = window.setTimeout(() => { + logger('[cyclist] start'); + this.clock.start(); + this.setStarted(true); + }, timestamp - Date.now()); + } else { + this.stop(); + } + } + + const { message, message_type } = e.payload; + }); + } + + start() { + if (!this.pattern) { + throw new Error('Scheduler: no pattern set! call .setPattern first.'); + } + + const linkmsg = { + bpm: 110, + play: true, + timestamp: Date.now(), + }; + Invoke('sendabelinkmsg', { linkmsg }); + } + + stop() { + logger('[cyclist] stop'); + this.clock.stop(); + this.lastEnd = 0; + this.setStarted(false); + const linkmsg = { + bpm: 110, + play: false, + timestamp: Date.now(), + }; + Invoke('sendabelinkmsg', { linkmsg }); + } +} diff --git a/packages/desktopbridge/index.mjs b/packages/desktopbridge/index.mjs index 591bbe34f..6190558b0 100644 --- a/packages/desktopbridge/index.mjs +++ b/packages/desktopbridge/index.mjs @@ -7,3 +7,4 @@ This program is free software: you can redistribute it and/or modify it under th export * from './midibridge.mjs'; export * from './utils.mjs'; export * from './oscbridge.mjs'; +export * from './cyclistbridge.mjs'; diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 173bb4556..eb792664b 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -49,6 +49,7 @@ if (isTauri()) { import('@strudel/desktopbridge/loggerbridge.mjs'), import('@strudel/desktopbridge/midibridge.mjs'), import('@strudel/desktopbridge/oscbridge.mjs'), + import('@strudel/desktopbridge/cyclistbridge.mjs'), ]); } else { modules.concat([import('@strudel.cycles/midi'), import('@strudel.cycles/osc')]);