initial commit
authorGray Leonard <gl7039a@american.edu>
Fri, 15 Apr 2016 13:54:52 +0000 (09:54 -0400)
committerGray Leonard <gl7039a@american.edu>
Fri, 15 Apr 2016 13:54:52 +0000 (09:54 -0400)
.gitignore
index.js [new file with mode: 0644]
package.json [new file with mode: 0644]
test.js [new file with mode: 0644]

index e920c16..7a8b17d 100644 (file)
@@ -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 (file)
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 (file)
index 0000000..b9d3009
--- /dev/null
@@ -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 (file)
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);
+//*/