fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Aesthetic.Computer
aesthetic.computer
fork
Configure Feed
Select the types of activity you want to include in your feed.
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}