inlets = 2 outlets = 4; var presets = []; var filename = ""; var currentPiece = ""; var hsspiece = {}; var metaComposition = ""; var outdict = new Dict("HSSPieces"); var settings = new Dict("HSS_settings"); var points = [[0.5, 0.5], [0., 1.], [1., 1.], [1., 0.], [0., 0.]]; var net = new Dict; var DJsterParams = { "attenuation" : [0, 100, "linear"], // "chordal_weight" : [1, 5, "linear"],// "dynamics" : [0, 127, "linear"],// "event_length_display_style" : [0, 1, "linear"],// "event_length" : [60, 10000, "log"],// "eventfulness" : [0, 100, "linear"],// "harmoniclarity" : [0, 100, "linear"],// "melodic_cohesion" : [-100, 100, "linear"],// "melody_scope" : [0, 48, "linear"],// "metriclarity" : [-100, 100, "linear"],// "outset_pulses" : [1, 16, "linear"],// "overlap" : [0, 1, "linear"],// "pitch_center" : [12, 108, "linear"],// "pitch_range" : [0, 48, "linear"],// "scale" : [1, 5, "enum"],// "sorted" : [0, 1, "linear"],// "stream" : [0, 1, "linear"],// "subdivision" : [1, 5, "enum"],// "tempo" : [5, 200, "log"],// "timesig_denominator" : [1, 5, "enum"],// "timesig_numerator" : [1, 12, "enum"],// "tonic_pitch" : [12, 108, "enum"],// }; if(jsarguments.length>1) // argument 0 is the name of the js file { metaComposition = jsarguments[1]; } var path = this.patcher.filepath.slice(0, this.patcher.filepath.lastIndexOf("/") + 1); function loadbang() { bang(); post("currentPiece", path, "\n"); } function bang() { if (metaComposition != "") { readPiece(path + metaComposition); readSettings(path + "HSS_settings.json"); } } // function dictionary(d) { net.name = d; hsspiece[currentPiece]["networkData"] = JSON.parse(net.stringify()); outdict.parse(JSON.stringify(hsspiece)); //jpieces = JSON.parse(outdict.stringify()); setMenu(); } function readPiece(path) { outdict.import_json(path); hsspiece = JSON.parse(outdict.stringify()); setMenu(); } function readSettings(path) { settings.import_json(path); var _settings = JSON.parse(settings.stringify()); var param = new Dict; var paramName = ""; //post(JSON.stringify(_settings), "\n"); for (key in _settings) { /* param.clear(); param.set("player", 0); if (key == "playing_mode") paramName = "mode"; else if (key == "operating_hours") paramName = "oph"; else paramName = key; param.set(paramName, _settings[key]); */ switch (key) { case "playing_mode" : //this.patcher.getnamed("webcontrol").message("param", "dictionary", param.name); this.patcher.getnamed("oph").subpatcher().getnamed("mode").message((_settings[key] == "Playlist") ? 1 : 0); break; case "operating_hours" : //this.patcher.getnamed("webcontrol").message("param", "dictionary", param.name); break; case "play" : //this.patcher.getnamed("webcontrol").message("param", "dictionary", param.name); this.patcher.getnamed("hub").subpatcher().getnamed("global").subpatcher().getnamed("play").message(_settings[key]); break; case "duration" : this.patcher.getnamed("duration").message(_settings[key]); break; case "silence" : this.patcher.getnamed("pause").message(_settings[key]); break; case "gain" : //this.patcher.getnamed("webcontrol").message("param", "dictionary", param.name); this.patcher.getnamed("hub").subpatcher().getnamed("global").subpatcher().getnamed("gain").message(_settings[key]); break; } } } function setPresetFile(f) { filename = f; currentPiece = filename.slice(filename.lastIndexOf("/") + 1, filename.lastIndexOf(".")); if (!hsspiece.hasOwnProperty(currentPiece)) hsspiece[currentPiece] = {}; outdict.parse(JSON.stringify(hsspiece)); setMenu(); } function setMenu() { var pieces = ["setPiece"]; this.patcher.getnamed("currentPiece").message("clear"); for (var i = 0; i < Object.keys(hsspiece).length; i++) { this.patcher.getnamed("currentPiece").message("append", Object.keys(hsspiece)[i]); pieces.push(Object.keys(hsspiece)[i]); } var item = Object.keys(hsspiece).indexOf(currentPiece); this.patcher.getnamed("currentPiece").message("set", item); this.patcher.getnamed("currentPiece").message("clearchecks"); this.patcher.getnamed("currentPiece").message("checkitem", item, 1); this.patcher.getnamed("webcontrol").message(pieces); var piece = new Dict(); if (currentPiece != "") { piece.parse(JSON.stringify({ "player" : 0, "piece" : currentPiece })); this.patcher.getnamed("webcontrol").message("param", "dictionary", piece.name); } } function writePiece() { if (metaComposition != "") { outdict.export_json(path + metaComposition); post("Changes written to: " + path + metaComposition, "\n"); } else error("Changes not saved to disk\n"); } function setDict() { hsspiece = JSON.parse(outdict.stringify()); } function setSection(section) { if (outdict.contains(section)) { var networkData = outdict.get(section + "::networkData"); outlet(1, "set_weights", "dictionary", networkData.name); outlet(1, "predict", 0.5, 0.5); outlet(0, 0.5, 0.5); if (outdict.contains(section + "::breakpoints")) this.patcher.getnamed("mc.function").setvalueof(outdict.get(section + "::breakpoints")); post("data", outdict.get(section + "::audiolevels"), "\n"); if (outdict.contains(section + "::audiolevels")) for (var i = 0; i < 4; i++) outlet(2, "hub::global::level_" + (i + 1), outdict.get(section + "::audiolevels")[i]); } currentPiece = section; var piece = new Dict(); piece.parse(JSON.stringify({ "player" : 0, "piece" : section })); this.patcher.getnamed("webcontrol").message("param", "dictionary", piece.name); //outlet(3, "dictionary", piece.name); } /* function anything() { var filenames = arrayfromargs(messagename, arguments); for (var i = 0; i < filenames.length; i++) { presets[i] = new Dict; presets[i].import_json(filenames[i]); title = filenames[i].slice(filenames[i].lastIndexOf("/") + 1, filenames[i].lastIndexOf(".")); hsspiece[title] = {}; var slots = presets[i].get("pattrstorage::slots").getkeys();//number of slots here post("slots", slots, "\n"); outlet(1, "clear_data"); for (var j = 0; j < slots.length; j++){ hsspiece[title][j + 1] = {}; var trainingData = []; var data = JSON.parse(presets[i].get("pattrstorage::slots::" + (j + 1) + "::data").stringify()); for (var p = 0; p < 4; p++) { delete data["Djster.µbus[" + p + "]::scales"]; delete data["Djster.µbus[" + p + "]::meters"]; for (var param in DJsterParams) { var val = data["Djster.µbus[" + p + "]::" + param]; switch (DJsterParams[param][2]) { case "linear" : trainingData.push(scale(val, DJsterParams[param][0], [param][1], 0., 1.)); break; case "log" : trainingData.push(scale(val, DJsterParams[param][0], DJsterParams[param][1], 0., 1.)); break; case "enum" : trainingData.push(j/5); break; } } //var val = data["hub::instrument::instrument-" + (p + 1)]; trainingData.push(j/5); var val = data["hub::src::src" + (p + 1)]; trainingData.push(scale(val[0], 0, 127, 0., 1.)); trainingData.push(scale(val[1], 0, 127, 0., 1.)); } //post("data", JSON.stringify(data), "\n"); hsspiece[title][j + 1] = data; outlet(1, "data_point", points[j].concat(trainingData)); } outlet(1, "train", 10000); } } */ function train() { presets = new Dict; presets.import_json(filename); if (!hsspiece.hasOwnProperty(currentPiece)) hsspiece[currentPiece] = {}; var slots = presets.get("pattrstorage::slots").getkeys();//number of slots here outlet(1, "clear_all"); for (var j = 0; j < slots.length; j++){ hsspiece[currentPiece][j + 1] = {}; var trainingData = []; var data = JSON.parse(presets.get("pattrstorage::slots::" + (j + 1) + "::data").stringify()); for (var p = 0; p < 4; p++) { delete data["Djster.µbus[" + p + "]::scales"]; delete data["Djster.µbus[" + p + "]::meters"]; for (var param in DJsterParams) { var val = data["Djster.µbus[" + p + "]::" + param]; switch (DJsterParams[param][2]) { case "linear" : var value = scale(val, DJsterParams[param][0], DJsterParams[param][1], 0., 1.); if (value == 0) value += 0.001; else if (value == 1) value -= 0.001; trainingData.push(value); break; case "log" : trainingData.push(Math.log(val) / Math.log(DJsterParams[param][1]));// Math.log(f)/Math.log(base) break; case "enum" : trainingData.push(j/5 + 0.001);//make sure it's a float break; } } trainingData.push(j/5); var val = data["hub::src::src" + (p + 1)]; trainingData.push(scale(val[0], 0, 127, 0., 1.)); trainingData.push(scale(val[1], 0, 127, 0., 1.)); } hsspiece[currentPiece][j + 1] = data; outlet(1, "data_point", points[j].concat(trainingData)); } outlet(1, "train", 50000); } function list() { var vector = arrayfromargs(arguments); var src = []; //currentPiece = this.patcher.getnamed("currentPiece").getvalueof(); var keys = Object.keys(DJsterParams); for (var i = 0; i < 4; i++) { for (var j = 0; j < vector.length/4; j++) { var k = j + i * vector.length/4; switch (j) { case 1 : case 3 : case 10 : case 11 : case 15 : case 16 ://chordal_weight, event_length_display_style, outset_pulses, overlap, sorted, stream var val = Math.round(scale(vector[k], 0, 1, DJsterParams[keys[j]][0], DJsterParams[keys[j]][1])); outlet(2, "Djster.µbus[" + i + "]::" + keys[j], val); break; case 4 : //log: event_length case 18 : //tempo var val = Math.pow(DJsterParams[keys[j]][1], vector[k]); //Math.pow(base, i); outlet(2, "Djster.µbus[" + i + "]::" + keys[j], val); break; case 14 : //enum; scale //val = "Major"; //post(vector[k], Math.floor(vector[k]/0.2 + 1), "\n"); outlet(2, "Djster.µbus[" + i + "]::" + keys[j], hsspiece[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::scale"]); break; case 17 : //subdivision //val = "2 2 2"; outlet(2, "Djster.µbus[" + i + "]::" + keys[j], hsspiece[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::meter"]); break; case 19 : //timesig_denominator //val = "4" outlet(2, "Djster.µbus[" + i + "]::" + keys[j], hsspiece[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::timesig_denominator"]); break; case 20 : //timesig_numerator //val = "4" outlet(2, "Djster.µbus[" + i + "]::" + keys[j], hsspiece[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::timesig_numerator"]); break; case 21 : //tonic pitch outlet(2, "Djster.µbus[" + i + "]::" + keys[j], hsspiece[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::tonic_pitch"]); break; case 22 : //instrument val = "4"; outlet(2, "hub::instrument::instrument-" + (i + 1), hsspiece[currentPiece][parseInt(vector[k]/0.2 + 1)]["hub::instrument::instrument-" + (i + 1)]); break; case 23 : // scr_x src[0] = scale(vector[k], 0, 1, 0, 127); break; case 24 : // scr_y src[1] = scale(vector[k], 0, 1, 0, 127); outlet(2, "hub::src::src" + (i + 1), src); break; default : //linear; attentuation, dynamics, eventfulness, harmoniclarity, melodic_cohesion, melody_scope, metriclarity var val = scale(vector[k], 0, 1, DJsterParams[keys[j]][0], DJsterParams[keys[j]][1]); outlet(2, "Djster.µbus[" + i + "]::" + keys[j], val); } } } } function setBreakPoints() { hsspiece[currentPiece]["breakpoints"] = this.patcher.getnamed("mc.function").getvalueof(); outdict.parse(JSON.stringify(hsspiece)); //jpieces = JSON.parse(outdict.stringify()); } function setAudioLevels() { post("hsspiece", currentPiece, "\n"); hsspiece[currentPiece]["audiolevels"] = this.patcher.getnamed("hub").subpatcher().getnamed("global").subpatcher().getnamed("level_1").getvalueof().concat(this.patcher.getnamed("hub").subpatcher().getnamed("global").subpatcher().getnamed("level_2").getvalueof(), this.patcher.getnamed("hub").subpatcher().getnamed("global").subpatcher().getnamed("level_3").getvalueof(), this.patcher.getnamed("hub").subpatcher().getnamed("global").subpatcher().getnamed("level_4").getvalueof()); outdict.parse(JSON.stringify(hsspiece)); //jpieces = JSON.parse(outdict.stringify()); } function sanityCheck() { for (piece in hsspiece) { post(piece, "has\n"); post("networkData", hsspiece[piece].hasOwnProperty("networkData"), "\n"); post("breakpoints", hsspiece[piece].hasOwnProperty("breakpoints"), "\n"); post("audiolevels", hsspiece[piece].hasOwnProperty("audiolevels"), "\n"); } } function scale(x, inputmin, inputmax, outputmin, outputmax) { return (x - inputmin) / (inputmax - inputmin) * (outputmax - outputmin) + outputmin; }