### Install and Deploy Project Source: https://github.com/korginc/logue-sdk/blob/main/platform/nts-3_kaoss/README.md After building, use `make install` to create the final *.nts3unit* file and deploy it. The installation directory can be customized using the `INSTALLDIR` environment variable. ```bash $ make install Making build/dummy-genericfx.nts3unit Deploying to ./dummy-genericfx.nts3unit Done ``` -------------------------------- ### Install Project with make install (Legacy) Source: https://github.com/korginc/logue-sdk/blob/main/platform/nts-1_mkii/README.md After building with 'make', run 'make install' to finalize the unit file and deploy it. The installation directory can be customized by setting the `INSTALLDIR` environment variable. ```bash $ make install Making build/waves.nts1mkiiunit Deploying to ./waves.nts1mkiiunit Done ``` -------------------------------- ### Install Waves Demo Oscillator Source: https://github.com/korginc/logue-sdk/blob/main/platform/nutekt-digital/README.md Run 'make install' to package the compiled Waves demo oscillator into a *.ntkdigunit* file, which is the final product for deployment. ```bash make install ``` -------------------------------- ### Install and activate emsdk Source: https://github.com/korginc/logue-sdk/blob/main/websim/README.md Navigate to the emsdk directory and install the latest version. Activate the latest version to make it the default for your environment. ```bash cd tools/emsdk ./emsdk install latest ./emsdk activate latest ``` -------------------------------- ### Build and Deploy Project Source: https://github.com/korginc/logue-sdk/blob/main/platform/microkorg2/README.md Use the 'build' command followed by the project path to compile, link, and deploy your firmware. The output shows compiler flags, linking steps, and installation progress. ```bash user@logue-sdk $ build microkorg2/dummy-synth >> Initializing microkorg2 development environment. Note: run 'env -r' to reset the environment >> Building /workspace/microkorg2/dummy-modfx Compiler Options arm-unknown-linux-gnueabihf-gcc -c -march=armv7-a -mtune=cortex-a7 -marm -Os -flto -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad -ftree-vectorize -ftree-vectorizer-verbose=4 -funsafe-math-optimizations -pipe -ffast-math -fsigned-char -fno-stack-protector -fstrict-aliasing -falign-functions=16 -fno-math-errno -fomit-frame-pointer -finline-limit=9999999999 --param max-inline-insns-single=9999999999 -std=c11 -W -Wall -Wextra -fPIC -Wa,-alms=build/lst/ -D__arm__ -D__cortex_a7__ -MMD -MP -MF .dep/build.d -I. -I/workspace/microkorg2/common -I/workspace/common xxxx.c -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-g++ -c -march=armv7-a -mtune=cortex-a7 -marm -Os -flto -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad -ftree-vectorize -ftree-vectorizer-verbose=4 -funsafe-math-optimizations -pipe -ffast-math -fsigned-char -fno-stack-protector -fstrict-aliasing -falign-functions=16 -fno-math-errno -fconcepts -fomit-frame-pointer -finline-limit=9999999999 --param max-inline-insns-single=9999999999 -fno-threadsafe-statics -std=gnu++14 -W -Wall -Wextra -Wno-ignored-qualifiers -fPIC -Wa,-alms=build/lst/ -D__arm__ -D__cortex_a7__ -MMD -MP -MF .dep/build.d -I. -I/workspace/microkorg2/common -I/workspace/common xxxx.cc -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-g++ -c -march=armv7-a -mtune=cortex-a7 -marm -fPIC -Wa,-amhls=build/lst/ -MMD -MP -MF .dep/build.d -I. -I/workspace/microkorg2/common -I/workspace/common xxxx.s -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-gcc -c -march=armv7-a -mtune=cortex-a7 -marm -fPIC -Wa,-amhls=build/lst/ -MMD -MP -MF .dep/build.d -I. -I/workspace/microkorg2/common -I/workspace/common xxxx.s -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-g++ xxxx.o -march=armv7-a -mtune=cortex-a7 -marm -Os -flto -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad -ftree-vectorize -ftree-vectorizer-verbose=4 -funsafe-math-optimizations -shared -Wl,-Map=build/dummy.map,--cref -lm -lc -o build/dummy.elf Compiling header.c Compiling _unit_base.c Compiling unit.cc Linking build/dummy.mk2unit Stripping build/dummy.mk2unit Creating build/dummy.hex Creating build/dummy.bin Creating build/dummy.dmp Creating build/dummy.list Done text data bss dec hex filename 4587 352 80 5019 139b build/dummy.mk2unit >> Installing /workspace/microkorg2/dummy-modfx Deploying to /workspace/microkorg2/dummy-modfx//dummy.mk2unit Done >> Resetting environment >> Cleaning up microkorg2 development environment. ``` -------------------------------- ### Install GCC for Linux Source: https://github.com/korginc/logue-sdk/blob/main/tools/gcc/README.md Run this script to download and unpack recommended GCC versions for Linux. ```bash ./get_gcc_linux.sh ``` -------------------------------- ### Build Command Help Source: https://github.com/korginc/logue-sdk/blob/main/docker/README.md Displays the help message for the `build` command, outlining its usage, options for selecting platforms, cleaning projects, and specifying installation directories. ```bash user@logue-sdk:~$ build -h Usage: /app/commands/build [OPTIONS] [UNIT_PROJECT_PATH] Wrapper script to build logue SDK unit projects. Options: -l, --list list valid unit projects -c, --clean only clean projects -a, --all select all valid unit projects --drumlogue select drumlogue unit projects --minilogue-xd select minilogue-xd unit projects --nutekt-digital select nts-1 unit projects --nts-1 alias for --nutekt-digital --nts-1_mkii select nts-1 mkii unit projects --nts-3 select nts-3 unit projects --prologue select prologue unit projects -f, --force force clean project before building --install-dir=DIR install built units to specified directory -h, --help display this help Arguments: [UNIT_PROJECT_PATH] specify path (relative to /workspace) to the unit project to build/clean Notes: * UNIT_PROJECT_PATH and platform selection options are mutually exclusive. * -a/-all is overriden by platform selection options if specified. ``` -------------------------------- ### Setup Web Audio and UI Source: https://github.com/korginc/logue-sdk/blob/main/websim/osc.html Initializes the Web Audio context and sets up UI elements. Connects the audio processor to the gain node and then to the audio context destination. Handles resuming or suspending the audio context. ```javascript window.setupWebAudioAndUI = function (context, wasmProcessor) { const AHREnvelopeTime = 0.1; function approximatelyEqual(a, b, epsilon = 1e-4) { return Math.abs(a - b) < epsilon; } function createSlider(wasmProcessor, param, index) { let container = document.createElement("div"); let label = document.createElement("label"); label.textContent = param.name.toLowerCase(); label.style.display = "inline-block"; label.style.width = "100px"; label.style.marginRight = "10px"; container.appendChild(label); let input = document.createElement("input"); input.type = "range"; input.min = param.min; input.max = param.max; input.step = 1; input.value = param.init; input.id = param.name; input.style.width = "200px"; input.style.marginRight = "10px"; container.appendChild(input); let value_string = document.createElement("span"); value_string.textContent = Module.getParameterValueString(index, input.value); container.appendChild(value_string); // Emscripten's API creates these from a C array, indexing them instead of a // name. Chrome and FF work with 0 but Safari requires the correct "0". let audio_parameter = wasmProcessor.parameters.get(`${index}`); input.oninput = () => { value_string.textContent = Module.getParameterValueString(index, input.value); audio_parameter.value = input.value; }; document.getElementById("Parameters").appendChild(container); } // audio graph // let oscillator = new OscillatorNode(context, { frequency: 440.0 }); let envelope = new GainNode(context, { gain: 0.0 }); let volume = new GainNode(context, { gain: 0.1 }) let analyser = new AnalyserNode(context, { fftSize: 4096 }); let data = new Float32Array(analyser.frequencyBinCount); // let noise = new AudioBufferSourceNode(context, { loop: true }); // noise.buffer = context.createBuffer(1, context.sampleRate, context.sampleRate); // for (i = 0; i < context.sampleRate; i++) { // noise.buffer.getChannelData(0)[i] = 2 * Math.random() - 1; // } wasmProcessor.connect(envelope).connect(volume).connect(context.destination); envelope.connect(analyser); // let samplesDiv = document.getElementById("Samples"); // let audioElements = samplesDiv.getElementsByTagName("audio"); // for (let audio of audioElements) { // let source = context.createMediaElementSource(audio); // source.connect(wasmProcessor); // } // resume/stop button let togglePlaybackButton = document.getElementById("TogglePlaybackButton"); togglePlaybackButton.onclick = () => { if (context.state !== "running") { context.resume(); } else { context.suspend(); } }; // main volume let volumeSlider = document.getElementById("VolumeSlider"); let volumeLabel = document.getElementById("VolumeLabel"); volume.gain.value = volumeSlider.value; // expontial ramp do not work here, need proper smoothing volumeLabel.innerText = volumeSlider.value; volumeSlider.oninput = function () { volume.gain.value = this.value; volumeLabel.innerText = this.value; }; // BPM // let bpmSlider = document.getElementById("BpmSlider"); // let bpmLabel = document.getElementById("BpmLabel"); // bpmLabel.innerText = bpmSlider.value; // bpmSlider.oninput = function () { // bpmLabel.innerText = this.value; // Module.fx_set_bpm(this.value); // }; // keyboard let currentOctave = 3; let keyboard = new QwertyHancock({ id: "keyboard", width: 512, height: 64, octaves: currentOctave, startNote: "A2", whiteNotesColour: "white", blackNotesColour: "black", hoverColour: "#f3e939" }); let osc_frequency = 440.0; let latchEnabled = false; let latchButton = document.getElementById("OscLatchButton"); latchButton.onclick = function () { latchEnabled = !latchEnabled; this.innerText = `Latch ${latchEnabled ? "On" : "Off"}`; if (!latchEnabled) { if (window.frequencyStack.length === 0) { envelope.gain.cancelAndHoldAtTime(context.currentTime); envelope.gain.linearRampToValueAtTime(0.0, context.currentTime + AHREnvelopeTime); } } }; keyboard.keyDown = function (note, frequency) { if (!window.frequencyStack) { window.frequencyStack = []; } window.frequencyStack.push(frequency); osc_frequency = frequency; Module.setOscPitch(osc_frequency); Module.noteOn(note, 100); // TODO: add a slider for velocity envelope.gain.cancelAndHoldAtTime(context.currentTime); envelope.gain.linearRampToValueAtTime(1.0, context.currentTime + AHREnvelopeTime); }; keyboard.keyUp = function (note, frequency) { // Remove the frequency from the stack (last matching entry) for (let i = window.frequencyStack.length - 1; i >= 0; --i) { if (approximatelyEqual(window.frequencyStack[i], frequency)) { window.frequencyStack.splice(i, 1); break; } } // latest note priority if (window.frequencyStack.length > 0) { osc_frequency = window.frequencyStack[window.frequencyStack.length - 1]; Module.setOscPitch(osc_frequency); } if (!latchEnabled) { if (window.frequencyStack.length === 0) { envelope.gain.cancelAndHoldAtTime(context.currentTime); envelope.gain.linearRampToValueAtTime(0.0, context.currentTime + AHREnvelopeTime); } } }; } ``` -------------------------------- ### Setup Web Audio and UI Source: https://github.com/korginc/logue-sdk/blob/main/websim/xypad.html Initializes the Web Audio context and sets up UI elements, including sliders for parameters and an XY pad. This function is intended to be called globally. ```javascript window.setupWebAudioAndUI = function (context, wasmProcessor) { const AHREnvelopeTime = 0.1; function approximatelyEqual(a, b, epsilon = 1e-4) { return Math.abs(a - b) < epsilon; } function createSlider(wasmProcessor, param, mapping, index) { let container = document.createElement("div"); let label = document.createElement("label"); label.textContent = param.name.toLowerCase(); label.style.display = "inline-block"; label.style.width = "100px"; label.style.marginRight = "10px"; container.appendChild(label); let param_slider = document.createElement("input"); param_slider.type = "range"; param_slider.min = param.min; param_slider.max = param.max; param_slider.step = 1; param_slider.value = param.init; param_slider.id = param.name; param_slider.style.width = "200px"; param_slider.style.marginRight = "10px"; container.appendChild(param_slider); let value_string = document.createElement("span"); value_string.textContent = Module.getParameterValueString(index, param_slider.value); container.appendChild(value_string); let audio_parameter = wasmProcessor.parameters.get(`${index}`); param_slider.oninput = () => { value_string.textContent = Module.getParameterValueString(index, param_slider.value); audio_parameter.value = param_slider.value; }; document.getElementById("Parameters").appendChild(container); if (mapping.assign === Module.ParamAssign.X) { let xyPad = document.getElementById("XYPad"); param_slider.value = mapping.init; function updateXParamFromXYPad(event) { if (event.buttons !== 1) return; let rect = xyPad.getBoundingClientRect(); let x_normalized = Math.min(Math.max(event.clientX - rect.left, 0), xyPad.width) / xyPad.width; let curved0to1 = Module.applyCurveToParameter0to1(x_normalized, mapping.curve, mapping.unipolar); param_slider.value = curved0to1 * (mapping.max - mapping.min) + mapping.min; param_slider.dispatchEvent(new Event('input')); } xyPad.addEventListener("mousemove", updateXParamFromXYPad); xyPad.addEventListener("mousedown", updateXParamFromXYPad); } else if (mapping.assign === Module.ParamAssign.Y) { let xyPad = document.getElementById("XYPad"); param_slider.value = mapping.init; function updateYParamFromXYPad(event) { if (event.buttons !== 1) return; let rect = xyPad.getBoundingClientRect(); let y_nomalized = 1.0 - Math.min(Math.max(event.clientY - rect.top, 0), xyPad.height) / xyPad.height; let curved0to1 = Module.applyCurveToParameter0to1(y_nomalized, mapping.curve, mapping.unipolar); param_slider.value = curved0to1 * (mapping.max - mapping.min) + mapping.min; param_slider.dispatchEvent(new Event('input')); } xyPad.addEventListener("mousemove", updateYParamFromXYPad); xyPad.addEventListener("mousedown", updateYParamFromXYPad); } else if (mapping.assign === Module.ParamAssign.Depth) { let depthSlider = document.getElementById("DepthSlider"); param_slider.value = mapping.init; depthSlider.addEventListener("input", (e) => { let curved_parameter = Module.applyCurveToParameter0to1(depthSlider.value, mapping.curve, mapping.unipolar); param_slider.value = curved_parameter * (mapping.max - mapping.min) + mapping.min; param_slider.dispatchEvent(new Event('input')); }); } } let oscillator = new OscillatorNode(context, { frequency: 440.0 }); let envelope = new GainNode(context, { gain: 0.0 }); let volume = new GainNode(context, { gain: 0.1 }); let analyser = new AnalyserNode(context, { fftSize: 4096 }); let data = new Float32Array(analyser.frequencyBinCount); let mixGain = new GainNode(context, { gain: 1.0 }); } ``` -------------------------------- ### Package Waves Demo Oscillator Source: https://github.com/korginc/logue-sdk/blob/main/platform/prologue/README.md Run 'make install' to create the final packaged file (*.prlgunit*) for the Waves oscillator, which is the deployable unit. ```bash make install ``` ```text Packaging to /logue-sdk/platform/prologue/waves/build/waves.prlgunit Deploying to /logue-sdk/platform/prologue/waves/waves.prlgunit Done ``` -------------------------------- ### Install GNU Make on MSYS2 Source: https://github.com/korginc/logue-sdk/blob/main/tools/make/README.md Use this command to install GNU Make on Windows via the MSYS2 package manager. Ensure MSYS2 is installed first. ```bash pacman -S make ``` -------------------------------- ### Install GCC for macOS Source: https://github.com/korginc/logue-sdk/blob/main/tools/gcc/README.md Run this script to download and unpack recommended GCC versions for macOS. ```bash ./get_gcc_macos.sh ``` -------------------------------- ### Web Audio API Setup and UI Initialization Source: https://github.com/korginc/logue-sdk/blob/main/websim/fx.html Initializes the Web Audio API context, sets up audio nodes (oscillator, envelope, volume, analyser), connects them, and creates UI elements for parameter control. This function is intended to be called globally. ```javascript window.setupWebAudioAndUI = function (context, wasmProcessor) { const AHREnvelopeTime = 0.1; function approximatelyEqual(a, b, epsilon = 1e-4) { return Math.abs(a - b) < epsilon; } function createSlider(wasmProcessor, param, index) { let container = document.createElement("div"); let label = document.createElement("label"); label.textContent = param.name.toLowerCase(); label.style.display = "inline-block"; label.style.width = "100px"; label.style.marginRight = "10px"; container.appendChild(label); let input = document.createElement("input"); input.type = "range"; input.min = param.min; input.max = param.max; input.step = 1; input.value = param.init; input.id = param.name; input.style.width = "200px"; input.style.marginRight = "10px"; container.appendChild(input); let value_string = document.createElement("span"); value_string.textContent = Module.getParameterValueString(index, input.value); container.appendChild(value_string); let audio_parameter = wasmProcessor.parameters.get(`${index}`); input.oninput = () => { value_string.textContent = Module.getParameterValueString(index, input.value); audio_parameter.value = input.value; }; document.getElementById("Parameters").appendChild(container); } let oscillator = new OscillatorNode(context, { frequency: 440.0 }); let envelope = new GainNode(context, { gain: 0.0 }); let volume = new GainNode(context, { gain: 0.1 }); let analyser = new AnalyserNode(context, { fftSize: 4096 }); let data = new Float32Array(analyser.frequencyBinCount); let noise = new AudioBufferSourceNode(context, { loop: true }); noise.buffer = context.createBuffer(1, context.sampleRate, context.sampleRate); for (i = 0; i < context.sampleRate; i++) { noise.buffer.getChannelData(0)[i] = 2 * Math.random() - 1; } oscillator.connect(envelope).connect(wasmProcessor); oscillator.start(); noise.start(); wasmProcessor.connect(volume).connect(context.destination); wasmProcessor.connect(analyser); let samplesDiv = document.getElementById("Samples"); let audioElements = samplesDiv.getElementsByTagName("audio"); for (let audio of audioElements) { let source = context.createMediaElementSource(audio); source.connect(wasmProcessor); } let togglePlaybackButton = document.getElementById("TogglePlaybackButton"); togglePlaybackButton.onclick = () => { if (context.state !== "running") { context.resume(); } else { context.suspend(); } }; let volumeSlider = document.getElementById("VolumeSlider"); let volumeLabel = document.getElementById("VolumeLabel"); volume.gain.value = volumeSlider.value; volumeLabel.innerText = volumeSlider.value; volumeSlider.oninput = function () { volume.gain.value = this.value; volumeLabel.innerText = this.value; }; let bpmSlider = document.getElementById("BpmSlider"); let bpmLabel = document.getElementById("BpmLabel"); bpmLabel.innerText = bpmSlider.value; bpmSlider.oninput = function () { bpmLabel.innerText = this.value; Module.fx_set_bpm(this.value); }; let currentOctave = 3; let keyboard = new QwertyHancock({ id: "keyboard", width: 512, height: 64, octaves: currentOctave, startNote: "A2", whiteNotesColour: "white", blackNotesColour: "black", hoverColour: "#f3e939" }); let oscType = document.getElementById("OscillatorType"); oscillator.type = oscType.value; oscType.onchange = function () { if (this.value === "noise") { noise.connect(envelope); oscillator.disconnect(envelope); } else { oscillator.type = this.value; oscillator.connect(envelope); noise.disconnect(envelope); } }; let latchEnabled = false; let latchButton = document.getElementById("OscLatchButton"); latchButton.onclick = function () { latchEnabled = !latchEnabled; this.innerText = `Latch ${latchEnabled ? "On" : "Off"}`; if (!latchEnabled) { if (window.frequencyStack.length ``` -------------------------------- ### Start Interactive Docker Shell Source: https://github.com/korginc/logue-sdk/blob/main/platform/microkorg2/README.md Execute the script to enter the interactive Docker build environment. This provides a shell with all necessary tools pre-configured. ```bash $ docker/run_interactive.sh user@logue-sdk $ ``` -------------------------------- ### Install and Deploy NTS-1 mkII Unit Source: https://github.com/korginc/logue-sdk/blob/main/platform/nts-1_mkii/README.md After building, this command creates the final unit file (e.g., 'waves.nts1mkiiunit') and deploys it to the appropriate directory for the NTS-1 mkII. ```bash Making /workspace/nts-1_mkii/waves//build/waves.nts1mkiiunit Deploying to /workspace/nts-1_mkii/waves//waves.nts1mkiiunit ``` -------------------------------- ### Initialize emsdk submodule Source: https://github.com/korginc/logue-sdk/blob/main/websim/README.md Update the emsdk submodule to download the Emscripten SDK. Follow the official Emscripten documentation for detailed installation instructions. ```bash git submodule update --init ``` -------------------------------- ### Oscillator Initialization (OSC_INIT) Source: https://github.com/korginc/logue-sdk/blob/main/platform/minilogue-xd/README.md Callback function called when an oscillator is instantiated. Use this for any necessary setup, referencing platform and API values defined in userprg.h. ```c void OSC_INIT(uint32_t platform, uint32_t api) ``` -------------------------------- ### Example Parameter Descriptors for Drumlogue Source: https://github.com/korginc/logue-sdk/blob/main/platform/drumlogue/README.md Illustrates how to define parameter descriptors for the Drumlogue, including parameters with different types (percent, pan, strings, bitmaps) and the use of blank descriptors to skip parameter slots and align subsequent parameters to new pages. ```c // Page 1 {0, (100 << 1), 0, (25 << 1), k_unit_param_type_percent, 1, 0, 0, {"PARAM1"}}, {-5, 5, 0, 0, k_unit_param_type_none, 0, 0, 0, {"PARAM2"}}, {-100, 100, 0, 0, k_unit_param_type_pan, 0, 0, 0, {"PARAM3"}}, // blank parameter, leaves that parameter slot blank in UI, and align next parameter to next page {0, 0, 0, 0, k_unit_param_type_none, 0, 0, 0, {""}}, ``` ```c // Page 2 {0, 9, 0, 0, k_unit_param_type_strings, 0, 0, 0, {"PARAM4"}}, {0, 9, 0, 0, k_unit_param_type_bitmaps, 0, 0, 0, {"PARAM5"}}, {0, 0, 0, 0, k_unit_param_type_none, 0, 0, 0, {""}}, {0, 0, 0, 0, k_unit_param_type_none, 0, 0, 0, {""}}, ``` -------------------------------- ### Clone logue-sdk Repository Source: https://github.com/korginc/logue-sdk/blob/main/platform/minilogue-xd/README.md Clone the logue-sdk repository and initialize its submodules to get started with development. ```bash git clone https://github.com/korginc/logue-sdk.git cd logue-sdk git submodule update --init ``` -------------------------------- ### Initialize and Use Drumlogue Environment Source: https://github.com/korginc/logue-sdk/blob/main/docker/README.md Demonstrates initializing the `drumlogue` development environment, navigating to a project directory, and compiling the project using `make`. It also shows how to reset the environment. ```bash user@logue-sdk:~$ env -l Available build environments: - nts-3_kaoss - minilogue-xd - nts-1_mkii - prologue - nts-1 - drumlogue user@logue-sdk:~$ env drumlogue >> Initializing drumlogue development environment. Note: run 'env -r' to reset the environment [drumlogue] ~ $ cd drumlogue/dummy-synth [drumlogue] ~ $ cd drumlogue/dummy-synth/ [drumlogue] ~/drumlogue/dummy-synth $ make Compiler Options arm-unknown-linux-gnueabihf-gcc -c -march=armv7-a -mtune=cortex-a7 -marm -Os -flto -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad -ftree-vectorize -ftree-vectorizer-verbose=4 -funsafe-math-optimizations -pipe -ffast-math -fsigned-char -fno-stack-protector -fstrict-aliasing -falign-functions=16 -fno-math-errno -fomit-frame-pointer -finline-limit=9999999999 --param max-inline-insns-single=9999999999 -std=c11 -W -Wall -Wextra -fPIC -Wa,-alms=build/lst/ -D__arm__ -D__cortex_a7__ -MMD -MP -MF .dep/build.d -I. -I/workspace/drumlogue/common xxxx.c -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-g++ -c -march=armv7-a -mtune=cortex-a7 -marm -Os -flto -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad -ftree-vectorize -ftree-vectorizer-verbose=4 -funsafe-math-optimizations -pipe -ffast-math -fsigned-char -fno-stack-protector -fstrict-aliasing -falign-functions=16 -fno-math-errno -fconcepts -fomit-frame-pointer -finline-limit=9999999999 --param max-inline-insns-single=9999999999 -fno-threadsafe-statics -std=gnu++14 -W -Wall -Wextra -Wno-ignored-qualifiers -fPIC -Wa,-alms=build/lst/ -D__arm__ -D__cortex_a7__ -MMD -MP -MF .dep/build.d -I. -I/workspace/drumlogue/common xxxx.cc -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-g++ -c -march=armv7-a -mtune=cortex-a7 -marm -fPIC -Wa,-amhls=build/lst/ -MMD -MP -MF .dep/build.d -I. -I/workspace/drumlogue/common xxxx.s -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-gcc -c -march=armv7-a -mtune=cortex-a7 -marm -fPIC -Wa,-amhls=build/lst/ -MMD -MP -MF .dep/build.d -I. -I/workspace/drumlogue/common xxxx.s -o build/obj/xxxx.o arm-unknown-linux-gnueabihf-g++ xxxx.o -march=armv7-a -mtune=cortex-a7 -marm -Os -flto -mfloat-abi=hard -mfpu=neon-vfpv4 -mvectorize-with-neon-quad -ftree-vectorize -ftree-vectorizer-verbose=4 -funsafe-math-optimizations -shared -Wl,-Map=build/dummy_synth.map,--cref -lm -lc -o build/dummy_synth.elf Compiling header.c Compiling _unit_base.c Compiling unit.cc Linking build/dummy_synth.drmlgunit Stripping build/dummy_synth.drmlgunit Creating build/dummy_synth.hex Creating build/dummy_synth.bin Creating build/dummy_synth.dmp text data bss dec hex filename 3267 316 8 3591 e07 build/dummy_synth.drmlgunit Creating build/dummy_synth.list Done [...] [drumlogue] ~ $ env -r >> Resetting environment >> Cleaning up drumlogue development environment. user@logue-sdk:~$ ``` -------------------------------- ### Install unzip package on MSYS2 Source: https://github.com/korginc/logue-sdk/blob/main/tools/gcc/README.md If using MSYS2 on Windows, install the 'unzip' package using pacman. ```bash pacman -S unzip ``` -------------------------------- ### Install Zip Utility on MSYS2 Source: https://github.com/korginc/logue-sdk/blob/main/tools/zip/README.md Use pacman to install the zip-3.0-1 package if it is not already present on your MSYS2 system. ```bash pacman -S zip ``` -------------------------------- ### Navigate to Project Directory Source: https://github.com/korginc/logue-sdk/blob/main/platform/prologue/README.md Change the current directory to the specific project you want to build, such as the 'waves' demo oscillator. ```bash cd logue-sdk/platform/prologue/waves/ ``` -------------------------------- ### Box Outline with Diagonal Bitmap Example Source: https://github.com/korginc/logue-sdk/blob/main/platform/drumlogue/README.md Example of a 32-byte array for a 16x16 bitmap showing a box outline with a diagonal line. This demonstrates more complex pixel patterns. ```c const uint8_t bmp[32] = { 0xFFU, 0xFFU, 0x03U, 0x80U, 0x05U, 0x80U, 0x09U, 0x80U, 0x11U, 0x80U, 0x21U, 0x80U, 0x41U, 0x80U, 0x81U, 0x80U, 0x01U, 0x81U, 0x01U, 0x82U, 0x01U, 0x84U, 0x01U, 0x88U, 0x01U, 0x90U, 0x01U, 0xA0U, 0x01U, 0xC0U, 0xFFU, 0xFFU }; ``` -------------------------------- ### Display Help for 'env' Command Source: https://github.com/korginc/logue-sdk/blob/main/docker/README.md Show the usage instructions and available options for the 'env' command. ```bash user@logue-sdk $ env -h Usage: env [OPTION] [ENV] Prepare environment for target platform builds. Options: -l, --list list available environments -r, --reset reset current environment -h, --help display this help ``` -------------------------------- ### Alternating Horizontal Lines Bitmap Example Source: https://github.com/korginc/logue-sdk/blob/main/platform/drumlogue/README.md Example of a 32-byte array for a 16x16 bitmap with alternating horizontal lines. Uses 0xFFU for white and 0x00U for black rows. ```c const uint8_t bmp[32] = { 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U, 0xFFU, 0xFFU, 0x00U, 0x00U }; ``` -------------------------------- ### Navigate to Waves Project Directory Source: https://github.com/korginc/logue-sdk/blob/main/platform/nutekt-digital/README.md Change the current directory to the Waves demo oscillator project for building. ```bash cd logue-sdk/platform/nutekt-digital/waves/ ``` -------------------------------- ### Alternating Vertical Lines Bitmap Example Source: https://github.com/korginc/logue-sdk/blob/main/platform/drumlogue/README.md Example of a 32-byte array for a 16x16 bitmap with alternating vertical lines. Each byte represents 8 pixels, with 0xAAU creating a pattern. ```c const uint8_t bmp[32] = { 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU, 0xAAU }; ``` -------------------------------- ### Build Project with make Source: https://github.com/korginc/logue-sdk/blob/main/platform/nts-3_kaoss/README.md Use the `make` command to build the project. This process involves compiling source files and linking them into an executable. ```bash $ make Compiler Options ../../../tools/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc -c -mcpu=cortex-m7 -mthumb -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -DTHUMB_PRESENT -g -Os -mlittle-endian -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -fcheck-new -fPIC -std=c11 -fno-exceptions -W -Wall -Wextra -Wa,-alms=build/lst/ -DSTM32H725xE -DCORTEX_USE_FPU=TRUE -DARM_MATH_CM7 -D__FPU_PRESENT -I. -I../common -I../../ext/CMSIS/CMSIS/Include Compiling header.c Compiling _unit_base.c Compiling unit.cc Linking build/dummy_genericfx.elf ../../../tools/gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc build/obj/header.o build/obj/_unit_base.o build/obj/unit.o -mcpu=cortex-m7 -mthumb -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -DTHUMB_PRESENT -g -Os -mlittle-endian -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -fcheck-new -nostartfiles -Wl,-z,max-page-size=128,-Map=build/dummy_genericfx.map,--cref,--no-warn-mismatch,--library-path=../ld,--script=../ld/unit.ld -shared --entry=0 -specs=nano.specs -specs=nosys.specs -lc -lm -o build/dummy_genericfx.elf Creating build/dummy_genericfx.hex Creating build/dummy_genericfx.bin Creating build/dummy_genericfx.dmp text data bss dec hex filename 2595 168 60 2823 b07 build/dummy_genericfx.elf Creating build/dummy_genericfx.list Done ``` -------------------------------- ### White Square Bitmap Example Source: https://github.com/korginc/logue-sdk/blob/main/platform/drumlogue/README.md Example of a 32-byte array representing a 16x16 white square bitmap. Each pair of bytes defines a row of 16 pixels, with 0xFFU indicating white. ```c const uint8_t bmp[32] = { 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }; ``` -------------------------------- ### Navigate to Project Directory Source: https://github.com/korginc/logue-sdk/blob/main/platform/nts-3_kaoss/README.md Before building, change your current directory to the project's root folder. ```bash $ cd logue-sdk/platform/nts-3_kaoss/dummy-genericfx/ ``` -------------------------------- ### Parameter Management Source: https://github.com/korginc/logue-sdk/blob/main/platform/drumlogue/README.md Functions for getting and setting unit parameters. ```APIDOC ## `unit_get_param_value` ### Description Called to obtain the current value of the parameter designated by the specified index. ### Method `__unit_callback int32_t unit_get_param_value(uint8_t index)` ### Endpoint N/A (Callback function) ### Parameters #### Path Parameters N/A #### Query Parameters N/A #### Request Body N/A ### Request Example N/A ### Response #### Success Response (200) - `int32_t`: The current value of the parameter. #### Response Example N/A ## `unit_get_param_str_value` ### Description Called to obtain the string representation of the specified value, for a `k_unit_param_type_strings` typed parameter. The returned value should point to a nul-terminated 7-bit ASCII C string of maximum X characters. ### Method `__unit_callback const char * unit_get_param_str_value(uint8_t index, int32_t value)` ### Endpoint N/A (Callback function) ### Parameters #### Path Parameters N/A #### Query Parameters N/A #### Request Body N/A ### Request Example N/A ### Response #### Success Response (200) - `const char *`: A pointer to the null-terminated string representation of the parameter value. #### Response Example N/A ## `unit_get_param_bmp_value` ### Description Called to obtain the bitmap representation of the specified value, for a `k_unit_param_type_bitmaps` typed parameter. The pointer will not be cached or reused after this function is called again. ### Method `__unit_callback const uint8_t * unit_get_param_bmp_value(uint8_t index, int32_t value)` ### Endpoint N/A (Callback function) ### Parameters #### Path Parameters N/A #### Query Parameters N/A #### Request Body N/A ### Request Example N/A ### Response #### Success Response (200) - `const uint8_t *`: A pointer to the bitmap data. #### Response Example N/A ## `unit_set_param_value` ### Description Called to set the current value of the parameter designated by the specified index. Values are stored as 16-bit integers but passed as 32-bit integers. Ensure values are within the declared min/max bounds. ### Method `__unit_callback void unit_set_param_value(uint8_t index, int32_t value)` ### Endpoint N/A (Callback function) ### Parameters #### Path Parameters N/A #### Query Parameters N/A #### Request Body N/A ### Request Example N/A ### Response N/A #### Response Example N/A ``` -------------------------------- ### Install GCC for MSYS2 Source: https://github.com/korginc/logue-sdk/blob/main/tools/gcc/README.md Run this script to download and unpack GCC automatically for MSYS2 on Windows. ```bash ./get_gcc_msys2.sh ``` -------------------------------- ### List Buildable Projects with 'build -l' Source: https://github.com/korginc/logue-sdk/blob/main/docker/README.md Use the '-l' flag with the 'build' command to list all available projects that can be built. ```bash user@logue-sdk:~$ build -l - drumlogue/dummy-delfx - drumlogue/dummy-masterfx - drumlogue/dummy-revfx - drumlogue/dummy-synth - minilogue-xd/dummy-delfx - minilogue-xd/dummy-modfx - minilogue-xd/dummy-osc - minilogue-xd/dummy-revfx - minilogue-xd/waves - nutekt-digital/dummy-delfx - nutekt-digital/dummy-modfx - nutekt-digital/dummy-osc - nutekt-digital/dummy-revfx - nutekt-digital/waves - prologue/dummy-delfx - prologue/dummy-modfx - prologue/dummy-osc - prologue/dummy-revfx - prologue/waves - nts-1_mkii/dummy-delfx - nts-1_mkii/dummy-modfx - nts-1_mkii/dummy-osc - nts-1_mkii/dummy-revfx - nts-1_mkii/waves - nts-3_kaoss/dummy-genericfx ``` -------------------------------- ### Install and Deploy NTS-3 Unit Source: https://github.com/korginc/logue-sdk/blob/main/platform/nts-3_kaoss/README.md Commands to create the NTS-3 unit package (.nts3unit) and deploy it to the specified directory after a successful build. ```bash Making /workspace/nts-3_kaoss/dummy-genericfx//build/dummy_genericfx.nts3unit Deploying to /workspace/nts-3_kaoss/dummy-genericfx//dummy_genericfx.nts3unit Done ``` -------------------------------- ### Initialize Audio Nodes and Connect Them Source: https://github.com/korginc/logue-sdk/blob/main/websim/xypad.html Sets up the audio context, creates various audio nodes (oscillator, envelope, mixer, processor, volume), and connects them in a processing chain. Includes initialization of a noise generator and connecting audio elements from the DOM. ```javascript let noise = new AudioBufferSourceNode(context, { loop: true }); noise.buffer = context.createBuffer(1, context.sampleRate, context.sampleRate); for (i = 0; i < context.sampleRate; i++) { noise.buffer.getChannelData(0)[i] = 2 * Math.random() - 1; } oscillator.connect(envelope).connect(mixGain); oscillator.start(); noise.start(); mixGain.connect(wasmProcessor).connect(volume); // mixGain.connect(dryGain).connect(volume); volume.connect(analyser); volume.connect(context.destination); let samplesDiv = document.getElementById("Samples"); let audioElements = samplesDiv.getElementsByTagName("audio"); for (let audio of audioElements) { let source = context.createMediaElementSource(audio); source.connect(mixGain); } ```