Early Attempts

My first attempt at this project was called bang256 ~ 2016, meant to mess with Renoise’s OSC. Its still usable.

The music loop for OSC sequencing. You need to install osc and nanotimer. Alternatively you can use portmidi

var fs = require("fs");
var osc = require("osc");
var NanoTimer = require('nanotimer');
var timer = new NanoTimer();

function bang256(host, port, tempo, lines_per_beat, measure, tracks, title) {

    var udpPort = new osc.UDPPort({
        remoteAddress: host,
        remotePort: port
    });

    udpPort.open();

    var beat = 60.0 / tempo;
    var lines_per_measure = lines_per_beat * measure;
    var tick = beat / lines_per_beat;
    var bangs = 0;
    var count = 0;

    timer.setInterval(function() {
        var bang = (bangs % lines_per_measure);
        if (bang == 0) {
            count++;
        }
        for (var t = 1; t <= tracks; t++) {
            var path = title + "/" + t;
            if (fs.existsSync(path)) {
                var code = fs.readFileSync(path, {encoding: 'utf-8'});
                var f = eval(code);
                f(udpPort, bang, count, bangs);
            }
        }

        bangs++;

    }, '', tick + "s");

}

var argv = require('minimist')(process.argv.slice(2));
var bang256 = require("bang256").bang256;

var host = argv["host"] || "127.0.0.1";
var port = argv["port"] || 8000;
var tempo = argv["tempo"];
var lines_per_beat = argv["lpb"] || 4;
var measure = argv["measure"] || 4;
var tracks = argv["tracks"] || 4;
var title = argv["title"];

bang256(host, port, tempo, lines_per_beat, measure, tracks, title);

To run,

node ./bang256 -host "127.0.0.1" --tempo=120 --lpb=4 --measure=4 --tracks=4 --title=foo

Edit files in foo/1 and foo/2 and foo/3 and foo/4 to create live music with an OSC compatible synthesizer.

Inside the file foo/1

(function (osc, bang, count, bangs, thread) {

    if ([4, 12].indexOf(bang) != -1) {
        var msg = {
            address: "/renoise/trigger/note_on",
            args: [ 1, 1, 38, 127],
        };
        osc.send(msg);
    }

})

https://www.perl.com/pub/2004/08/31/livecode.html/ also uses the ticks approach but uses a message bus for events.
https://github.com/psenough/teach_yourself_demoscene_in_14_days