301 lines
10 KiB
JavaScript
301 lines
10 KiB
JavaScript
inlets = 2
|
|
outlets = 4;
|
|
|
|
var presets = [];
|
|
var filename = "";
|
|
var currentPiece = "";
|
|
var hsspiece = {};
|
|
var metaComposition = "";
|
|
var outdict = new Dict("HSSPieces");;
|
|
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);
|
|
}
|
|
|
|
|
|
//
|
|
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 setPresetFile(f)
|
|
{
|
|
filename = f;
|
|
currentPiece = filename.slice(filename.lastIndexOf("/") + 1, filename.lastIndexOf("."));
|
|
if (!hsshsspiece.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();
|
|
piece.parse(JSON.stringify({ "player" : 0, "piece" : item }));
|
|
this.patcher.getnamed("webcontrol").message("param", "dictionary", piece.name);
|
|
//outlet(3, pieces);
|
|
}
|
|
|
|
function writePiece()
|
|
{
|
|
if (metaComposition != "") outdict.export_json(path + metaComposition);
|
|
}
|
|
|
|
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_data");
|
|
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 scale(x, inputmin, inputmax, outputmin, outputmax)
|
|
{
|
|
return (x - inputmin) / (inputmax - inputmin) * (outputmax - outputmin) + outputmin;
|
|
} |