| @@ -171,7 +171,8 @@ void RackWidget::mergeJson(json_t* rootJ) { | |||||
| // modules | // modules | ||||
| json_t* modulesJ = json_object_get(rootJ, "modules"); | json_t* modulesJ = json_object_get(rootJ, "modules"); | ||||
| assert(modulesJ); | |||||
| if (!modulesJ) | |||||
| return; | |||||
| size_t moduleIndex; | size_t moduleIndex; | ||||
| json_t* moduleJ; | json_t* moduleJ; | ||||
| json_array_foreach(modulesJ, moduleIndex, moduleJ) { | json_array_foreach(modulesJ, moduleIndex, moduleJ) { | ||||
| @@ -182,7 +183,8 @@ void RackWidget::mergeJson(json_t* rootJ) { | |||||
| int id = json_integer_value(idJ); | int id = json_integer_value(idJ); | ||||
| // TODO Legacy v0.6? | // TODO Legacy v0.6? | ||||
| ModuleWidget* moduleWidget = getModule(id); | ModuleWidget* moduleWidget = getModule(id); | ||||
| assert(moduleWidget); | |||||
| if (!moduleWidget) | |||||
| continue; | |||||
| // pos | // pos | ||||
| math::Vec pos = moduleWidget->box.pos.minus(moduleOffset); | math::Vec pos = moduleWidget->box.pos.minus(moduleOffset); | ||||
| @@ -193,7 +195,8 @@ void RackWidget::mergeJson(json_t* rootJ) { | |||||
| // cables | // cables | ||||
| json_t* cablesJ = json_object_get(rootJ, "cables"); | json_t* cablesJ = json_object_get(rootJ, "cables"); | ||||
| assert(cablesJ); | |||||
| if (!cablesJ) | |||||
| return; | |||||
| size_t cableIndex; | size_t cableIndex; | ||||
| json_t* cableJ; | json_t* cableJ; | ||||
| json_array_foreach(cablesJ, cableIndex, cableJ) { | json_array_foreach(cablesJ, cableIndex, cableJ) { | ||||
| @@ -203,7 +206,8 @@ void RackWidget::mergeJson(json_t* rootJ) { | |||||
| continue; | continue; | ||||
| int id = json_integer_value(idJ); | int id = json_integer_value(idJ); | ||||
| CableWidget* cw = getCable(id); | CableWidget* cw = getCable(id); | ||||
| assert(cw); | |||||
| if (!cw) | |||||
| continue; | |||||
| json_t* cwJ = cw->toJson(); | json_t* cwJ = cw->toJson(); | ||||
| // Merge cable JSON object | // Merge cable JSON object | ||||
| @@ -215,8 +219,7 @@ void RackWidget::mergeJson(json_t* rootJ) { | |||||
| void RackWidget::fromJson(json_t* rootJ) { | void RackWidget::fromJson(json_t* rootJ) { | ||||
| // modules | // modules | ||||
| json_t* modulesJ = json_object_get(rootJ, "modules"); | json_t* modulesJ = json_object_get(rootJ, "modules"); | ||||
| if (!modulesJ) | |||||
| return; | |||||
| assert(modulesJ); | |||||
| size_t moduleIndex; | size_t moduleIndex; | ||||
| json_t* moduleJ; | json_t* moduleJ; | ||||
| json_array_foreach(modulesJ, moduleIndex, moduleJ) { | json_array_foreach(modulesJ, moduleIndex, moduleJ) { | ||||
| @@ -1,11 +1,14 @@ | |||||
| { | { | ||||
| "version": "1.dev.82b817e", | |||||
| "version": "2.dev.bfce9cc", | |||||
| "modules": [ | "modules": [ | ||||
| { | { | ||||
| "id": 1, | |||||
| "plugin": "Core", | "plugin": "Core", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "AudioInterface", | "model": "AudioInterface", | ||||
| "params": [], | "params": [], | ||||
| "leftModuleId": 2, | |||||
| "rightModuleId": 8, | |||||
| "data": { | "data": { | ||||
| "audio": { | "audio": { | ||||
| "driver": 1, | "driver": 1, | ||||
| @@ -15,129 +18,128 @@ | |||||
| "blockSize": 256 | "blockSize": 256 | ||||
| } | } | ||||
| }, | }, | ||||
| "leftModuleId": 2, | |||||
| "rightModuleId": 8, | |||||
| "id": 1, | |||||
| "pos": [ | "pos": [ | ||||
| 57, | 57, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "plugin": "Fundamental", | "plugin": "Fundamental", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "VCMixer", | "model": "VCMixer", | ||||
| "params": [ | "params": [ | ||||
| { | { | ||||
| "id": 0, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 0 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 1, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 1 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 2 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 3 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 4, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 4 | |||||
| } | } | ||||
| ], | ], | ||||
| "leftModuleId": 7, | "leftModuleId": 7, | ||||
| "rightModuleId": 1, | "rightModuleId": 1, | ||||
| "id": 2, | |||||
| "pos": [ | "pos": [ | ||||
| 47, | 47, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "plugin": "Fundamental", | "plugin": "Fundamental", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "VCO", | "model": "VCO", | ||||
| "params": [ | "params": [ | ||||
| { | { | ||||
| "id": 0, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 0 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 1, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 1 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 2 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 3 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 4, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 4 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 5, | |||||
| "value": 0.5 | |||||
| "value": 0.5, | |||||
| "id": 5 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 6, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 6 | |||||
| } | } | ||||
| ], | ], | ||||
| "leftModuleId": 5, | "leftModuleId": 5, | ||||
| "rightModuleId": 4, | "rightModuleId": 4, | ||||
| "id": 3, | |||||
| "pos": [ | "pos": [ | ||||
| 8, | 8, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 4, | |||||
| "plugin": "Fundamental", | "plugin": "Fundamental", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "VCF", | "model": "VCF", | ||||
| "params": [ | "params": [ | ||||
| { | { | ||||
| "id": 0, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 0 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 1, | |||||
| "value": 0.5 | |||||
| "value": 0.5, | |||||
| "id": 1 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "value": 0.234000027 | |||||
| "value": 0.234000027, | |||||
| "id": 2 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "value": 1.0 | |||||
| "value": 1.0, | |||||
| "id": 3 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 4, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 4 | |||||
| } | } | ||||
| ], | ], | ||||
| "leftModuleId": 3, | "leftModuleId": 3, | ||||
| "rightModuleId": 6, | "rightModuleId": 6, | ||||
| "id": 4, | |||||
| "pos": [ | "pos": [ | ||||
| 18, | 18, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 5, | |||||
| "plugin": "Core", | "plugin": "Core", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "MIDIToCVInterface", | "model": "MIDIToCVInterface", | ||||
| "params": [], | "params": [], | ||||
| "rightModuleId": 3, | |||||
| "data": { | "data": { | ||||
| "channels": 1, | "channels": 1, | ||||
| "polyMode": 0, | "polyMode": 0, | ||||
| @@ -150,117 +152,118 @@ | |||||
| "channel": -1 | "channel": -1 | ||||
| } | } | ||||
| }, | }, | ||||
| "rightModuleId": 3, | |||||
| "id": 5, | |||||
| "pos": [ | "pos": [ | ||||
| 0, | 0, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 6, | |||||
| "plugin": "Fundamental", | "plugin": "Fundamental", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "ADSR", | "model": "ADSR", | ||||
| "params": [ | "params": [ | ||||
| { | { | ||||
| "id": 0, | |||||
| "value": 0.258000046 | |||||
| "value": 0.258000046, | |||||
| "id": 0 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 1, | |||||
| "value": 0.743000448 | |||||
| "value": 0.743000448, | |||||
| "id": 1 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "value": 0.5 | |||||
| "value": 0.5, | |||||
| "id": 2 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "value": 0.576500058 | |||||
| "value": 0.576500058, | |||||
| "id": 3 | |||||
| } | } | ||||
| ], | ], | ||||
| "leftModuleId": 4, | "leftModuleId": 4, | ||||
| "rightModuleId": 7, | "rightModuleId": 7, | ||||
| "id": 6, | |||||
| "pos": [ | "pos": [ | ||||
| 26, | 26, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 7, | |||||
| "plugin": "Fundamental", | "plugin": "Fundamental", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "Scope", | "model": "Scope", | ||||
| "params": [ | "params": [ | ||||
| { | { | ||||
| "id": 0, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 0 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 1, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 1 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 2 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 3 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 4, | |||||
| "value": 14.0 | |||||
| "value": 14.0, | |||||
| "id": 4 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 5, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 5 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 6, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 6 | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 7, | |||||
| "value": 0.0 | |||||
| "value": 0.0, | |||||
| "id": 7 | |||||
| } | } | ||||
| ], | ], | ||||
| "leftModuleId": 6, | |||||
| "rightModuleId": 2, | |||||
| "data": { | "data": { | ||||
| "lissajous": 0, | "lissajous": 0, | ||||
| "external": 0 | "external": 0 | ||||
| }, | }, | ||||
| "leftModuleId": 6, | |||||
| "rightModuleId": 2, | |||||
| "id": 7, | |||||
| "pos": [ | "pos": [ | ||||
| 34, | 34, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 8, | |||||
| "plugin": "Core", | "plugin": "Core", | ||||
| "version": "1.0.0", | |||||
| "version": "2.0.0", | |||||
| "model": "Notes", | "model": "Notes", | ||||
| "params": [], | "params": [], | ||||
| "leftModuleId": 1, | "leftModuleId": 1, | ||||
| "text": "Demo patch instructions:\n\n1. Choose an audio driver and device in the AUDIO-8 module.\n\n2. Use the QWERTY and ZXCVB rows of your keyboard to generate MIDI notes, which are converted to 1V/oct and GATE signals.\n\n3. Drag knobs up/down. Hold Ctrl (Cmd on Mac) while dragging to fine-tune. Right-click knobs to edit, or double-click to initialize.\n\n4. Drag ports to create and move cables. Stack multiple cables on outputs by holding Ctrl (Cmd on Mac) and dragging from an output.\n\n5. Right-click on an empty rack space to add new modules.", | |||||
| "id": 8, | |||||
| "data": { | |||||
| "text": "Demo patch instructions:\n\n1. Choose an audio driver and device in the AUDIO-8 module.\n\n2. Use the QWERTY and ZXCVB rows of your keyboard to generate MIDI notes, which are converted to 1V/oct and GATE signals.\n\n3. Drag knobs up/down. Hold Ctrl (Cmd on Mac) while dragging to fine-tune. Right-click knobs to edit, or double-click to initialize.\n\n4. Drag ports to create and move cables. Stack multiple cables on outputs by holding Ctrl (Cmd on Mac) and dragging from an output.\n\n5. Right-click on an empty rack space to add new modules." | |||||
| }, | |||||
| "pos": [ | "pos": [ | ||||
| 67, | 67, | ||||
| 0 | 0 | ||||
| ] | ] | ||||
| } | } | ||||
| ], | ], | ||||
| "id": 29, | |||||
| "cables": [ | "cables": [ | ||||
| { | { | ||||
| "id": 0, | |||||
| "outputModuleId": 5, | "outputModuleId": 5, | ||||
| "outputId": 0, | "outputId": 0, | ||||
| "inputModuleId": 3, | "inputModuleId": 3, | ||||
| "inputId": 0, | "inputId": 0, | ||||
| "color": "#c91847" | |||||
| "color": "#c9b70e" | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 1, | |||||
| "outputModuleId": 3, | "outputModuleId": 3, | ||||
| "outputId": 2, | "outputId": 2, | ||||
| "inputModuleId": 4, | "inputModuleId": 4, | ||||
| @@ -268,41 +271,47 @@ | |||||
| "color": "#0c8e15" | "color": "#0c8e15" | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 2, | |||||
| "outputModuleId": 2, | "outputModuleId": 2, | ||||
| "outputId": 0, | "outputId": 0, | ||||
| "inputModuleId": 1, | "inputModuleId": 1, | ||||
| "inputId": 0, | "inputId": 0, | ||||
| "color": "#0986ad" | |||||
| "color": "#c91847" | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 3, | |||||
| "outputModuleId": 2, | "outputModuleId": 2, | ||||
| "outputId": 0, | "outputId": 0, | ||||
| "inputModuleId": 1, | "inputModuleId": 1, | ||||
| "inputId": 1, | "inputId": 1, | ||||
| "color": "#c9b70e" | |||||
| "color": "#0986ad" | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 4, | |||||
| "outputModuleId": 6, | "outputModuleId": 6, | ||||
| "outputId": 0, | "outputId": 0, | ||||
| "inputModuleId": 4, | "inputModuleId": 4, | ||||
| "inputId": 0, | "inputId": 0, | ||||
| "color": "#c91847" | |||||
| "color": "#c9b70e" | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 5, | |||||
| "outputModuleId": 5, | "outputModuleId": 5, | ||||
| "outputId": 1, | "outputId": 1, | ||||
| "inputModuleId": 6, | "inputModuleId": 6, | ||||
| "inputId": 4, | "inputId": 4, | ||||
| "color": "#c9b70e" | |||||
| "color": "#0c8e15" | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 6, | |||||
| "outputModuleId": 6, | "outputModuleId": 6, | ||||
| "outputId": 0, | "outputId": 0, | ||||
| "inputModuleId": 2, | "inputModuleId": 2, | ||||
| "inputId": 5, | "inputId": 5, | ||||
| "color": "#0c8e15" | |||||
| "color": "#c91847" | |||||
| }, | }, | ||||
| { | { | ||||
| "id": 7, | |||||
| "outputModuleId": 4, | "outputModuleId": 4, | ||||
| "outputId": 0, | "outputId": 0, | ||||
| "inputModuleId": 2, | "inputModuleId": 2, | ||||
| @@ -310,6 +319,7 @@ | |||||
| "color": "#0986ad" | "color": "#0986ad" | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 8, | |||||
| "outputModuleId": 2, | "outputModuleId": 2, | ||||
| "outputId": 1, | "outputId": 1, | ||||
| "inputModuleId": 7, | "inputModuleId": 7, | ||||
| @@ -317,11 +327,12 @@ | |||||
| "color": "#c9b70e" | "color": "#c9b70e" | ||||
| }, | }, | ||||
| { | { | ||||
| "id": 9, | |||||
| "outputModuleId": 5, | "outputModuleId": 5, | ||||
| "outputId": 6, | "outputId": 6, | ||||
| "inputModuleId": 6, | "inputModuleId": 6, | ||||
| "inputId": 5, | "inputId": 5, | ||||
| "color": "#c91847" | |||||
| "color": "#0c8e15" | |||||
| } | } | ||||
| ] | ] | ||||
| } | } | ||||