Monorepo for Aesthetic.Computer aesthetic.computer
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 105 lines 3.1 kB view raw
1// AC Audio Bridge for Max for Live 2// Receives sample data from jweb and writes to buffer~ objects 3// 4// Input: [numSamples, ...leftSamples, ...rightSamples] 5// Output: writes to buffer~ ac-left and ac-right 6 7autowatch = 1; 8inlets = 1; 9outlets = 1; 10 11// Ring buffer settings 12var BUFFER_SIZE_MS = 500; // 500ms ring buffer 13var sampleRate = 48000; // Will be updated from Max 14var bufferSizeSamples = Math.floor(BUFFER_SIZE_MS * sampleRate / 1000); 15 16// Write position tracking 17var writePos = 0; 18var leftBuffer = null; 19var rightBuffer = null; 20 21// Initialize buffers 22function loadbang() { 23 post("AC Audio Bridge: Initializing...\n"); 24 25 // Get references to buffers 26 leftBuffer = new Buffer("ac-left"); 27 rightBuffer = new Buffer("ac-right"); 28 29 // Set buffer sizes (500ms at 48kHz = 24000 samples) 30 bufferSizeSamples = Math.floor(BUFFER_SIZE_MS * sampleRate / 1000); 31 32 // Resize buffers 33 leftBuffer.send("sizeinsamps", bufferSizeSamples); 34 rightBuffer.send("sizeinsamps", bufferSizeSamples); 35 36 // Clear buffers 37 leftBuffer.send("clear"); 38 rightBuffer.send("clear"); 39 40 // Enable looping on groove~ 41 outlet(0, "loop", 1); 42 43 post("AC Audio Bridge: Ready! Buffer size: " + bufferSizeSamples + " samples\n"); 44} 45 46// Handle incoming sample data 47function list() { 48 var args = arrayfromargs(arguments); 49 50 if (args.length < 1) return; 51 52 var numSamples = args[0]; 53 54 // Validate we have enough data 55 if (args.length < 1 + numSamples * 2) { 56 post("AC Audio Bridge: Invalid sample data\n"); 57 return; 58 } 59 60 // Make sure buffers are initialized 61 if (!leftBuffer || !rightBuffer) { 62 leftBuffer = new Buffer("ac-left"); 63 rightBuffer = new Buffer("ac-right"); 64 } 65 66 // Write samples to buffers using poke 67 for (var i = 0; i < numSamples; i++) { 68 var leftSample = args[1 + i]; 69 var rightSample = args[1 + numSamples + i]; 70 71 // Write to buffer at current position 72 leftBuffer.poke(1, writePos, leftSample); 73 rightBuffer.poke(1, writePos, rightSample); 74 75 // Advance write position (wrap around) 76 writePos = (writePos + 1) % bufferSizeSamples; 77 } 78 79 // Output status periodically 80 // outlet(0, "wrote", numSamples, "pos", writePos); 81} 82 83// Handle messages 84function anything() { 85 var msg = messagename; 86 var args = arrayfromargs(arguments); 87 88 if (msg === "samplerate") { 89 sampleRate = args[0]; 90 bufferSizeSamples = Math.floor(BUFFER_SIZE_MS * sampleRate / 1000); 91 post("AC Audio Bridge: Sample rate set to " + sampleRate + "\n"); 92 } else if (msg === "clear") { 93 writePos = 0; 94 if (leftBuffer) leftBuffer.send("clear"); 95 if (rightBuffer) rightBuffer.send("clear"); 96 post("AC Audio Bridge: Buffers cleared\n"); 97 } else if (msg === "status") { 98 post("AC Audio Bridge: writePos=" + writePos + "/" + bufferSizeSamples + "\n"); 99 } 100} 101 102// Initialize on script load 103function bang() { 104 loadbang(); 105}