healing-soundscapes/hss.piecemaker.js
2024-08-15 14:56:39 +02:00

172 lines
5.5 KiB
JavaScript

inlets = 2
outlets = 4;
var jpieces = {};
var presets = [];
var hsspiece = {};
var outdict = new Dict("HSSPieces");;
var points = [[0.5, 0.5], [1., 0.], [1., 1.], [0., 1.], [0., 0.]];
var net = new Dict;
var title;
var DJsterParams = {
"attenuation" : [0, 100, "linear"], //
"chordal_weight" : [1, 5, "linear"],//
"dynamics" : [0, 127, "linear"],//
"event_length" : [60, 600, "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" : [20, 200, "log"],//
"timesig_denominator" : [1, 5, "enum"],//
"timesig_numerator" : [1, 12, "linear"],//
"tonic_pitch" : [12, 108, "enum"],//
};
//
function dictionary(d)
{
net.name = d;
hsspiece[title]["networkData"] = JSON.parse(net.stringify());
outdict.parse(JSON.stringify(hsspiece));
//outlet(0, "dictionary", outdict.name);
}
function readPiece(path)
{
outdict.import_json(path);
jpieces = JSON.parse(outdict.stringify());
var keys = outdict.getkeys();
for (var i = 0; i < keys.length; i++) outlet(3, keys[i]);
outlet(1, outdict.get("DefaultSetting::1::networkData"));
outlet(1, "predict", 0.5, 0.5);
outlet(0, 0.5, 0.5);
}
function getSection(section)
{
if (outdict.contains(section)) {
outlet(1, outdict.get(section + "::1::networkData"));
outlet(1, "predict", 0.5, 0.5);
outlet(0, 0.5, 0.5);
}
}
function writePiece()
{
outdict.export_json(this.patcher.filepath + "HSSPiece.json");
}
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], DJsterParams[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 list()
{
var vector = arrayfromargs(arguments);
var src = [];
var 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;
//post("vector", j, "\n");
switch (j) {
case 3 : //log
case 17 :
var val = scale(vector[k], 0, 1, DJsterParams[keys[j]][0], DJsterParams[keys[j]][1]);
outlet(2, "Djster.µbus[" + i + "]::" + keys[j], val);
break;
case 13 : //enum
//val = "Major";
post(vector[k], Math.floor(vector[k]/0.2 + 1), "\n");
outlet(2, "Djster.µbus[" + i + "]::" + keys[j], jpieces[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::scale"]);
break;
case 16 :
//val = "2 2 2";
outlet(2, "Djster.µbus[" + i + "]::" + keys[j], jpieces[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::meter"]);
break;
case 18 :
//val = "4"
outlet(2, "Djster.µbus[" + i + "]::" + keys[j], jpieces[currentPiece][parseInt(vector[k]/0.2 + 1)]["Djster.µbus[" + i + "]::timesig_denominator"]);
break;
case 21 :
val = "4"
outlet(2, "hub::instrument::instrument-" + (i + 1), jpieces[currentPiece][parseInt(vector[k]/0.2 + 1)]["hub::instrument::instrument-" + (i + 1)]);
break;
case 22 :
src[0] = scale(vector[k], 0, 1, 0, 127);
break;
case 23 :
src[1] = scale(vector[k], 0, 1, 0, 127);
outlet(2, "hub::src::src" + (i + 1), src);
break;
case 1 : case 9 : case 10 : case 14 : case 15 : case 19 : case 20 :
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;
default : //linear
var val = scale(vector[k], 0, 1, DJsterParams[keys[j]][0], DJsterParams[keys[j]][1]);
outlet(2, "Djster.µbus[" + i + "]::" + keys[j], val);
}
}
}
}
function scale(x, inputmin, inputmax, outputmin, outputmax)
{
return (x - inputmin) / (inputmax - inputmin) * (outputmax - outputmin) + outputmin;
}