Skip to content

Commit ce500a9

Browse files
committed
Server bpm compute
1 parent 7e2a92d commit ce500a9

File tree

3 files changed

+9
-49
lines changed

3 files changed

+9
-49
lines changed

mic-sender.js

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,14 @@
1-
import { Essentia, arrayToVector } from 'essentia.js'
21
import mic from 'mic'
32
import WebSocket from 'ws'
43

5-
async function main() {
6-
const url = process.argv[2] || 'ws://localhost:8081'
7-
const ws = new WebSocket(url)
8-
await new Promise(resolve => ws.once('open', resolve))
4+
const url = process.argv[2] || 'ws://localhost:8081'
5+
const ws = new WebSocket(url)
96

10-
const essentia = await Essentia()
11-
const sampleRate = 44100
12-
const bufferSizeSec = 5
13-
const bufferSize = sampleRate * bufferSizeSec
14-
let buffer = new Float32Array(0)
15-
16-
const rhythmAlgo = (signal) =>
17-
essentia.RhythmExtractor2013({ signal, sampleRate })
18-
19-
const micInst = mic({ rate: sampleRate.toString(), channels: '1' })
7+
ws.on('open', () => {
8+
const micInst = mic({ rate: '44100', channels: '1' })
209
const micStream = micInst.getAudioStream()
21-
2210
micInst.start()
23-
24-
micStream.on('data', (chunk) => {
25-
ws.send(chunk)
26-
const pcm = new Float32Array(chunk.buffer, chunk.byteOffset, chunk.length / 4)
27-
const tmp = new Float32Array(buffer.length + pcm.length)
28-
tmp.set(buffer)
29-
tmp.set(pcm, buffer.length)
30-
buffer = tmp
31-
if (buffer.length >= bufferSize) {
32-
const sigVec = arrayToVector(buffer)
33-
const res = rhythmAlgo(sigVec)
34-
const bpm = res.bpm
35-
ws.send(JSON.stringify({ bpm }))
36-
console.log(`BPM: ${bpm.toFixed(2)}, ticks: ${res.ticks.length}`)
37-
buffer = buffer.subarray(bufferSize)
38-
}
39-
})
40-
11+
micStream.on('data', chunk => ws.send(chunk))
4112
micStream.on('error', console.error)
42-
}
43-
44-
main().catch(console.error)
13+
})
4514

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252
"d3-interpolate": "^3.0.1",
5353
"dotenv": "^16.4.5",
5454
"express": "^4.18.2",
55-
"fft-js": "^0.0.12",
56-
"music-tempo": "^1.0.3",
55+
"fft-js": "^0.0.12",
56+
"music-tempo": "^1.0.3",
5757
"mic": "^2.1.1",
5858
"essentia.js": "^0.1.3",
5959
"react": "^19.1.0",

src/backend/wsAudio.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,7 @@ export function startAudioServer(port = 8081) {
2020
const wss = new WebSocketServer({ port })
2121
wss.on('connection', ws => {
2222
ws.on('message', data => {
23-
if (Buffer.isBuffer(data)) {
24-
processAudio(data)
25-
} else {
26-
try {
27-
const msg = JSON.parse(data.toString())
28-
if (typeof msg.bpm === 'number') audioState.bpm = msg.bpm
29-
} catch {
30-
// ignore non-json messages
31-
}
32-
}
23+
if (Buffer.isBuffer(data)) processAudio(data)
3324
})
3425
})
3526
}

0 commit comments

Comments
 (0)