From: Gray Leonard Date: Fri, 15 Apr 2016 13:54:52 +0000 (-0400) Subject: initial commit X-Git-Tag: v0.0.1~4 X-Git-Url: https://git.aubio.org/?a=commitdiff_plain;h=583fa88daebe7bb893d97fed3e829226b8b10df0;p=node-aubio.git initial commit --- diff --git a/.gitignore b/.gitignore index e920c16..7a8b17d 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ node_modules # Optional REPL history .node_repl_history + +*.mp3 diff --git a/index.js b/index.js new file mode 100644 index 0000000..e4520db --- /dev/null +++ b/index.js @@ -0,0 +1,41 @@ +var ffi = require('ffi'); +var ref = require('ref'); + +var intPtr = ref.refType('int'); +var stringPtr = ref.refType(ref.types.CString); + +var aubio = ffi.Library('libaubio', { + // beattracking / misc + "new_aubio_beattracking": [ "pointer", [ "int", "int", "int"]], + "aubio_beattracking_do": [ "void", [ "pointer", "pointer", "pointer"]], + "aubio_beattracking_get_bpm": [ "float", ["pointer"]], + "aubio_filter_do": [ "void", [ "pointer", "pointer" ]], + "new_aubio_filter_a_weighting": [ "pointer", [ "int" ]], + + // source + "new_aubio_source": [ "pointer", [ "string", "int", "int" ]], + "aubio_source_do": [ "void", [ "pointer", "pointer", intPtr ]], + "aubio_source_do_multi": [ "void", [ "pointer", "pointer", intPtr ]], + "aubio_source_get_samplerate": [ "int", [ "pointer" ]], + "aubio_source_get_channels": [ "int", [ "pointer" ]], + "aubio_source_seek": [ "int", [ "pointer", "int" ]], + "aubio_source_close": [ "int", [ "pointer" ]], + "del_aubio_source": [ "void", [ "pointer" ]], + + + // fvec + "new_fvec": [ "pointer", [ "int" ]], + "del_fvec": [ "void", [ "pointer" ]], + "fvec_get_sample": [ "float", [ "pointer", "int" ]], + "fvec_set_sample": [ "void", [ "pointer", "float", "int" ]], + "fvec_get_data": [ "float", [ "pointer" ]], + "fvec_print": [ "void", [ "pointer" ]], + "fvec_set_all": [ "void", [ "pointer", "float" ]], + "fvec_zeros": [ "void", [ "pointer" ]], + "fvec_rev": [ "void", [ "pointer" ]], + "fvec_weight": [ "void", [ "pointer", "pointer" ]], + "fvec_copy": [ "void", [ "pointer", "pointer" ]], + "fvec_ones": [ "void", [ "pointer" ]], +}); + +module.exports = aubio; diff --git a/package.json b/package.json new file mode 100644 index 0000000..b9d3009 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "node-aubio", + "version": "0.0.1", + "description": "Node.js bindings for audio software aubio", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/grayleonard/node-aubio.git" + }, + "keywords": [ + "audio", + "bindings", + "aubio", + "ffi", + "c" + ], + "author": "Gray Leonard", + "license": "GNU GPL v3", + "bugs": { + "url": "https://github.com/grayleonard/node-aubio/issues" + }, + "homepage": "https://github.com/grayleonard/node-aubio", + "dependencies": { + "ffi": "^2.0.0", + "ref": "^1.3.2" + } +} diff --git a/test.js b/test.js new file mode 100644 index 0000000..9168ceb --- /dev/null +++ b/test.js @@ -0,0 +1,58 @@ +var aubio = require('./index.js'); +var ref = require('ref'); + +var get_file_bpm = function(path, params) { + + var source = aubio.new_aubio_source(path, params.samplerate, params.hop_s);//params.samplerate, params.hop_s); + var samplerate = aubio.aubio_source_get_samplerate(source); + console.log('samplerate: ' + samplerate); + var beats = []; + var total_frames = 0; + var test_fvec = aubio.new_fvec(params.hop_s); + var out_fvec = aubio.new_fvec(params.hop_s); + var tmp_read = ref.alloc('int'); + var tempo = aubio.new_aubio_beattracking(params.hop_s, params.hop_s, params.samplerate); + var total_bpm = 0; + var count = 0; + + while(true) { + aubio.aubio_source_do(source, test_fvec, tmp_read); + aubio.aubio_beattracking_do(tempo, test_fvec, out_fvec); + var test_sample = aubio.fvec_get_sample(test_fvec, 1); + console.log('test sample: ' + test_sample); + var read = tmp_read.deref(); + total_frames += read; + count = count + 1; + total_bpm += aubio.aubio_beattracking_get_bpm(tempo); + if(read != params.hop_s) { break; } + } + console.log('total' + total_frames); + console.log('bpm: ' + total_bpm / count); + aubio.del_aubio_source(source); +} + +get_file_bpm('holden.mp3', { + samplerate: 44100, + win_s : 1024, + hop_s : 512, +}); + +/*var in_fvec = aubio.new_fvec(16); +var out_fvec = aubio.new_fvec(4); +aubio.fvec_ones(out_fvec); +aubio.fvec_print(in_fvec); +aubio.fvec_print(out_fvec); + +var tempo = aubio.new_aubio_beattracking(16, 256, 44100); + +var i = 0; + +while(i < 10) { + aubio.aubio_beattracking_do(tempo, in_fvec, out_fvec); + console.log(aubio.aubio_beattracking_get_bpm(tempo)); + i++ +} + +//var test_filt = aubio.new_aubio_filter_a_weighting(44100); +//aubio.aubio_filter_do(test_fvec, test_filt); +//*/