From 62e3774ff7a68a14aff7375bc1e957c25af4cf30 Mon Sep 17 00:00:00 2001 From: Jade Rowland Date: Sun, 3 Sep 2023 16:28:52 -0400 Subject: [PATCH] its working --- packages/desktopbridge/oscbridge.mjs | 43 ++++++++++++++++++++++++++++ src-tauri/src/oscbridge.rs | 19 +++--------- website/src/repl/Repl.jsx | 4 +-- 3 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 packages/desktopbridge/oscbridge.mjs diff --git a/packages/desktopbridge/oscbridge.mjs b/packages/desktopbridge/oscbridge.mjs new file mode 100644 index 00000000..d6c13d45 --- /dev/null +++ b/packages/desktopbridge/oscbridge.mjs @@ -0,0 +1,43 @@ +import { logger, parseNumeral, Pattern } from '@strudel.cycles/core'; +import { Invoke } from './utils.mjs'; + +Pattern.prototype.osc = function () { + return this.onTrigger(async (time, hap, currentTime, cps = 1) => { + hap.ensureObjectValue(); + const cycle = hap.wholeOrPart().begin.valueOf(); + const delta = hap.duration.valueOf(); + const controls = Object.assign({}, { cps, cycle, delta }, hap.value); + // make sure n and note are numbers + controls.n && (controls.n = parseNumeral(controls.n)); + controls.note && (controls.note = parseNumeral(controls.note)); + + const messagesfromjs = []; + const params = []; + const offset = Math.round((time - currentTime) * 1000 - 48); + + Object.keys(controls).forEach((key) => { + const val = controls[key]; + const value = typeof val === 'number' ? val.toString() : val; + + if (value == null) { + return; + } + params.push({ + name: key, + value, + valueisnumber: typeof val === 'number', + }); + }); + + if (params.length) { + messagesfromjs.push({ target: '/dirt/play', offset, params }); + } + console.log(messagesfromjs); + + if (messagesfromjs.length) { + setTimeout(() => { + Invoke('sendosc', { messagesfromjs }); + }); + } + }); +}; diff --git a/src-tauri/src/oscbridge.rs b/src-tauri/src/oscbridge.rs index 0ea7e6c5..bf329ab9 100644 --- a/src-tauri/src/oscbridge.rs +++ b/src-tauri/src/oscbridge.rs @@ -1,9 +1,7 @@ use rosc::encoder; use rosc::{ OscMessage, OscPacket, OscType }; -use std::net::{ SocketAddrV4, UdpSocket }; -use std::str::FromStr; +use std::net::UdpSocket; use std::time::Duration; -use std::{ env, f32 }; use std::sync::Arc; use tokio::sync::{ mpsc, Mutex }; use tokio::time::Instant; @@ -18,9 +16,7 @@ pub struct OscMsg { pub struct AsyncInputTransmit { pub inner: Mutex>>, } -fn get_addr_from_arg(arg: &str) -> SocketAddrV4 { - SocketAddrV4::from_str(arg).unwrap() -} + pub fn init( async_input_receiver: mpsc::Receiver>, mut async_output_receiver: mpsc::Receiver>, @@ -44,22 +40,17 @@ pub fn init( } } }); - println!("cloning message queue"); let message_queue_clone = Arc::clone(&message_queue); tauri::async_runtime::spawn(async move { - println!("opening osc port"); /* ........................................................... Open OSC Ports ............................................................*/ - - let sock = UdpSocket::bind("localhost:57121").unwrap(); - let to_addr = String::from("localhost:57120"); - + let sock = UdpSocket::bind("127.0.0.1:57121").unwrap(); + let to_addr = String::from("127.0.0.1:57120"); /* ........................................................... Process queued messages ............................................................*/ - loop { let mut message_queue = message_queue_clone.lock().await; println!("num messages {}", message_queue.len()); @@ -109,12 +100,10 @@ pub async fn sendosc( ) -> Result<(), String> { let async_proc_input_tx = state.inner.lock().await; let mut messages_to_process: Vec = Vec::new(); - for m in messagesfromjs { let mut args = Vec::new(); for p in m.params { args.push(OscType::String(p.name)); - if p.valueisnumber { args.push(OscType::Float(p.value.parse().unwrap())); } else { diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx index 4434ed7a..6cb4eb7d 100644 --- a/website/src/repl/Repl.jsx +++ b/website/src/repl/Repl.jsx @@ -37,10 +37,10 @@ const modules = [ import('@strudel.cycles/core'), import('@strudel.cycles/tonal'), import('@strudel.cycles/mini'), - isTauri() ? import('@strudel/desktopbridge') : import('@strudel.cycles/midi'), + isTauri() ? import('@strudel/desktopbridge/midibridge.mjs') : import('@strudel.cycles/midi'), import('@strudel.cycles/xen'), import('@strudel.cycles/webaudio'), - import('@strudel.cycles/osc'), + isTauri() ? import('@strudel/desktopbridge/oscbridge.mjs') : import('@strudel.cycles/osc'), import('@strudel.cycles/serial'), import('@strudel.cycles/soundfonts'), import('@strudel.cycles/csound'),