diff --git a/src/assets/instruments/README.md b/src/assets/instruments/README.md new file mode 100644 index 0000000..1b9ec68 --- /dev/null +++ b/src/assets/instruments/README.md @@ -0,0 +1,92 @@ +# Lightningbeam Factory Instruments + +This directory contains bundled factory instruments for Lightningbeam DAW. + +## Directory Structure + +Instruments are organized by category: + +``` +instruments/ + keyboards/ # Sampled keyboard instruments + piano/ + samples/ # MP3 audio samples + A1.mp3 + C1.mp3 + ... + piano.json # MultiSampler configuration + epiano/ + ... + synthesizers/ # Synthesizer presets (node graph-based) + bass.json + lead.json + pad.json + ... + drums/ # Drum kits and percussion + acoustic_kit/ + ... +``` + +## Instrument Definition Format + +Each instrument is a JSON file that defines a MultiSampler node configuration: + +```json +{ + "name": "Instrument Name", + "description": "Brief description", + "version": "1.0", + "node_type": "MultiSampler", + "parameters": { + "gain": 1.0, + "attack": 0.001, + "release": 0.5, + "transpose": 0 + }, + "layers": [ + { + "sample_path": "./samples/C4.mp3", + "root_note": 60, // MIDI note number (C4 = 60) + "key_range": [58, 62], // MIDI notes [min, max] + "velocity_range": [0, 127] // Velocity [min, max] + } + ] +} +``` + +## MIDI Note Numbers + +- C1 = 24, A1 = 33 +- C2 = 36, A2 = 45 +- C3 = 48, A3 = 57 +- C4 = 60 (middle C), A4 = 69 +- C5 = 72, A5 = 81 +- C6 = 84, A6 = 93 +- C7 = 96, A7 = 105 + +## Sample Format Guidelines + +**Factory Samples (bundled):** +- Format: MP3 (for size efficiency) +- Sample rate: 44.1 kHz recommended +- Bit depth: 16-bit minimum +- Total size: Keep under 50MB per instrument + +**User Samples (external):** +- Format: WAV, FLAC, MP3, OGG +- Any sample rate/bit depth supported +- No size restrictions + +## Adding New Instruments + +1. Create a new directory: `instruments/my-instrument/` +2. Add samples to: `instruments/my-instrument/samples/` +3. Create configuration: `instruments/my-instrument/my-instrument.json` +4. Reference samples with relative paths: `./samples/filename.mp3` + +## Loading Instruments + +Instruments are loaded via the frontend and can be: +- Dragged into the node graph editor +- Selected from the instrument browser +- Loaded programmatically via the MultiSampler API diff --git a/src/assets/instruments/keyboards/piano/piano.json b/src/assets/instruments/keyboards/piano/piano.json new file mode 100644 index 0000000..e99fef1 --- /dev/null +++ b/src/assets/instruments/keyboards/piano/piano.json @@ -0,0 +1,62 @@ +{ + "metadata": { + "name": "Grand Piano", + "description": "Acoustic grand piano with multi-octave sampling", + "author": "Lightningbeam", + "version": 1, + "tags": ["piano", "keyboard", "acoustic"] + }, + "midi_targets": [0], + "output_node": 2, + "nodes": [ + { + "id": 0, + "node_type": "MidiInput", + "name": "MIDI In", + "parameters": {}, + "position": [100.0, 100.0] + }, + { + "id": 1, + "node_type": "MultiSampler", + "name": "Piano Sampler", + "parameters": { + "0": 1.0, + "1": 0.001, + "2": 0.5, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { "file_path": "samples/C1.mp3", "key_min": 0, "key_max": 28, "root_key": 24, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A1.mp3", "key_min": 29, "key_max": 34, "root_key": 33, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/C2.mp3", "key_min": 35, "key_max": 40, "root_key": 36, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A2.mp3", "key_min": 41, "key_max": 46, "root_key": 45, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/C3.mp3", "key_min": 47, "key_max": 52, "root_key": 48, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A3.mp3", "key_min": 53, "key_max": 58, "root_key": 57, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/C4.mp3", "key_min": 59, "key_max": 64, "root_key": 60, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A4.mp3", "key_min": 65, "key_max": 70, "root_key": 69, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/C5.mp3", "key_min": 71, "key_max": 76, "root_key": 72, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A5.mp3", "key_min": 77, "key_max": 82, "root_key": 81, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/C6.mp3", "key_min": 83, "key_max": 88, "root_key": 84, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A6.mp3", "key_min": 89, "key_max": 94, "root_key": 93, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/C7.mp3", "key_min": 95, "key_max": 100, "root_key": 96, "velocity_min": 0, "velocity_max": 127 }, + { "file_path": "samples/A7.mp3", "key_min": 101, "key_max": 127, "root_key": 105, "velocity_min": 0, "velocity_max": 127 } + ] + }, + "position": [350.0, 100.0] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [600.0, 100.0] + } + ], + "connections": [ + { "from_node": 0, "from_port": 0, "to_node": 1, "to_port": 0 }, + { "from_node": 1, "from_port": 0, "to_node": 2, "to_port": 0 } + ] +} diff --git a/src/assets/instruments/keyboards/piano/samples/A1.mp3 b/src/assets/instruments/keyboards/piano/samples/A1.mp3 new file mode 100644 index 0000000..0b2ff3a Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A1.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/A2.mp3 b/src/assets/instruments/keyboards/piano/samples/A2.mp3 new file mode 100644 index 0000000..c469969 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A2.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/A3.mp3 b/src/assets/instruments/keyboards/piano/samples/A3.mp3 new file mode 100644 index 0000000..57924c5 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A3.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/A4.mp3 b/src/assets/instruments/keyboards/piano/samples/A4.mp3 new file mode 100644 index 0000000..3b19af8 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A4.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/A5.mp3 b/src/assets/instruments/keyboards/piano/samples/A5.mp3 new file mode 100644 index 0000000..d17d553 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A5.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/A6.mp3 b/src/assets/instruments/keyboards/piano/samples/A6.mp3 new file mode 100644 index 0000000..8464e29 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A6.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/A7.mp3 b/src/assets/instruments/keyboards/piano/samples/A7.mp3 new file mode 100644 index 0000000..5e5aa4d Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/A7.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C1.mp3 b/src/assets/instruments/keyboards/piano/samples/C1.mp3 new file mode 100644 index 0000000..2b840fc Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C1.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C2.mp3 b/src/assets/instruments/keyboards/piano/samples/C2.mp3 new file mode 100644 index 0000000..3fca8d0 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C2.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C3.mp3 b/src/assets/instruments/keyboards/piano/samples/C3.mp3 new file mode 100644 index 0000000..14daa30 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C3.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C4.mp3 b/src/assets/instruments/keyboards/piano/samples/C4.mp3 new file mode 100644 index 0000000..d5f5819 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C4.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C5.mp3 b/src/assets/instruments/keyboards/piano/samples/C5.mp3 new file mode 100644 index 0000000..7064bc8 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C5.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C6.mp3 b/src/assets/instruments/keyboards/piano/samples/C6.mp3 new file mode 100644 index 0000000..c8e20f6 Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C6.mp3 differ diff --git a/src/assets/instruments/keyboards/piano/samples/C7.mp3 b/src/assets/instruments/keyboards/piano/samples/C7.mp3 new file mode 100644 index 0000000..4cf780b Binary files /dev/null and b/src/assets/instruments/keyboards/piano/samples/C7.mp3 differ diff --git a/src/assets/instruments/synthesizers/bass.json b/src/assets/instruments/synthesizers/bass.json new file mode 100644 index 0000000..aa1aaff --- /dev/null +++ b/src/assets/instruments/synthesizers/bass.json @@ -0,0 +1,86 @@ +{ + "metadata": { + "name": "Deep Bass", + "description": "Thick sub bass with sawtooth oscillator", + "author": "Lightningbeam", + "version": 1, + "tags": ["bass", "sub", "synth"] + }, + "midi_targets": [0], + "output_node": 6, + "nodes": [ + { + "id": 0, + "node_type": "MidiInput", + "name": "MIDI In", + "parameters": {}, + "position": [100.0, 100.0] + }, + { + "id": 1, + "node_type": "MidiToCV", + "name": "MIDI→CV", + "parameters": {}, + "position": [300.0, 100.0] + }, + { + "id": 2, + "node_type": "Oscillator", + "name": "Osc", + "parameters": { + "0": 110.0, + "1": 0.7, + "2": 1.0 + }, + "position": [500.0, 80.0] + }, + { + "id": 3, + "node_type": "ADSR", + "name": "Amp Env", + "parameters": { + "0": 0.005, + "1": 0.2, + "2": 0.8, + "3": 0.3 + }, + "position": [500.0, 200.0] + }, + { + "id": 4, + "node_type": "Gain", + "name": "VCA", + "parameters": { + "0": 1.0 + }, + "position": [700.0, 100.0] + }, + { + "id": 5, + "node_type": "Filter", + "name": "LP Filter", + "parameters": { + "0": 800.0, + "1": 1.5, + "2": 0.0 + }, + "position": [900.0, 100.0] + }, + { + "id": 6, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [1100.0, 100.0] + } + ], + "connections": [ + { "from_node": 0, "from_port": 0, "to_node": 1, "to_port": 0 }, + { "from_node": 1, "from_port": 0, "to_node": 2, "to_port": 0 }, + { "from_node": 1, "from_port": 1, "to_node": 3, "to_port": 0 }, + { "from_node": 2, "from_port": 0, "to_node": 4, "to_port": 0 }, + { "from_node": 3, "from_port": 0, "to_node": 4, "to_port": 1 }, + { "from_node": 4, "from_port": 0, "to_node": 5, "to_port": 0 }, + { "from_node": 5, "from_port": 0, "to_node": 6, "to_port": 0 } + ] +} diff --git a/src/assets/instruments/synthesizers/lead.json b/src/assets/instruments/synthesizers/lead.json new file mode 100644 index 0000000..edc2be1 --- /dev/null +++ b/src/assets/instruments/synthesizers/lead.json @@ -0,0 +1,99 @@ +{ + "metadata": { + "name": "Bright Lead", + "description": "Piercing lead synth with filter modulation", + "author": "Lightningbeam", + "version": 1, + "tags": ["lead", "synth", "solo"] + }, + "midi_targets": [0], + "output_node": 7, + "nodes": [ + { + "id": 0, + "node_type": "MidiInput", + "name": "MIDI In", + "parameters": {}, + "position": [100.0, 100.0] + }, + { + "id": 1, + "node_type": "MidiToCV", + "name": "MIDI→CV", + "parameters": {}, + "position": [300.0, 100.0] + }, + { + "id": 2, + "node_type": "Oscillator", + "name": "Osc", + "parameters": { + "0": 440.0, + "1": 0.6, + "2": 2.0 + }, + "position": [500.0, 60.0] + }, + { + "id": 3, + "node_type": "LFO", + "name": "Filter Mod", + "parameters": { + "0": 5.0, + "1": 0.5, + "2": 0.0, + "3": 0.0 + }, + "position": [500.0, 200.0] + }, + { + "id": 4, + "node_type": "Filter", + "name": "LP Filter", + "parameters": { + "0": 2000.0, + "1": 2.0, + "2": 0.0 + }, + "position": [700.0, 100.0] + }, + { + "id": 5, + "node_type": "ADSR", + "name": "Amp Env", + "parameters": { + "0": 0.01, + "1": 0.1, + "2": 0.6, + "3": 0.2 + }, + "position": [700.0, 240.0] + }, + { + "id": 6, + "node_type": "Gain", + "name": "VCA", + "parameters": { + "0": 1.0 + }, + "position": [900.0, 150.0] + }, + { + "id": 7, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [1100.0, 150.0] + } + ], + "connections": [ + { "from_node": 0, "from_port": 0, "to_node": 1, "to_port": 0 }, + { "from_node": 1, "from_port": 0, "to_node": 2, "to_port": 0 }, + { "from_node": 1, "from_port": 1, "to_node": 5, "to_port": 0 }, + { "from_node": 2, "from_port": 0, "to_node": 4, "to_port": 0 }, + { "from_node": 3, "from_port": 0, "to_node": 4, "to_port": 1 }, + { "from_node": 4, "from_port": 0, "to_node": 6, "to_port": 0 }, + { "from_node": 5, "from_port": 0, "to_node": 6, "to_port": 1 }, + { "from_node": 6, "from_port": 0, "to_node": 7, "to_port": 0 } + ] +} diff --git a/src/assets/instruments/synthesizers/pad.json b/src/assets/instruments/synthesizers/pad.json new file mode 100644 index 0000000..d7fcbe4 --- /dev/null +++ b/src/assets/instruments/synthesizers/pad.json @@ -0,0 +1,136 @@ +{ + "metadata": { + "name": "Lush Pad", + "description": "Ambient pad with reverb and chorus", + "author": "Lightningbeam", + "version": 1, + "tags": ["pad", "ambient", "synth"] + }, + "midi_targets": [0], + "output_node": 10, + "nodes": [ + { + "id": 0, + "node_type": "MidiInput", + "name": "MIDI In", + "parameters": {}, + "position": [100.0, 150.0] + }, + { + "id": 1, + "node_type": "MidiToCV", + "name": "MIDI→CV", + "parameters": {}, + "position": [300.0, 150.0] + }, + { + "id": 2, + "node_type": "Oscillator", + "name": "Osc 1", + "parameters": { + "0": 440.0, + "1": 0.4, + "2": 0.0 + }, + "position": [500.0, 100.0] + }, + { + "id": 3, + "node_type": "Oscillator", + "name": "Osc 2", + "parameters": { + "0": 442.0, + "1": 0.4, + "2": 0.0 + }, + "position": [500.0, 200.0] + }, + { + "id": 4, + "node_type": "Mixer", + "name": "Osc Mix", + "parameters": { + "0": 1.0, + "1": 1.0, + "2": 0.0, + "3": 0.0 + }, + "position": [700.0, 150.0] + }, + { + "id": 5, + "node_type": "Filter", + "name": "LP Filter", + "parameters": { + "0": 1500.0, + "1": 0.707, + "2": 0.0 + }, + "position": [900.0, 150.0] + }, + { + "id": 6, + "node_type": "ADSR", + "name": "Amp Env", + "parameters": { + "0": 0.5, + "1": 0.3, + "2": 0.7, + "3": 1.0 + }, + "position": [900.0, 280.0] + }, + { + "id": 7, + "node_type": "Gain", + "name": "VCA", + "parameters": { + "0": 1.0 + }, + "position": [1100.0, 200.0] + }, + { + "id": 8, + "node_type": "Chorus", + "name": "Chorus", + "parameters": { + "0": 0.5, + "1": 0.6, + "2": 0.4 + }, + "position": [1300.0, 200.0] + }, + { + "id": 9, + "node_type": "Reverb", + "name": "Reverb", + "parameters": { + "0": 0.7, + "1": 0.5, + "2": 0.5 + }, + "position": [1500.0, 200.0] + }, + { + "id": 10, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [1700.0, 200.0] + } + ], + "connections": [ + { "from_node": 0, "from_port": 0, "to_node": 1, "to_port": 0 }, + { "from_node": 1, "from_port": 0, "to_node": 2, "to_port": 0 }, + { "from_node": 1, "from_port": 0, "to_node": 3, "to_port": 0 }, + { "from_node": 1, "from_port": 1, "to_node": 6, "to_port": 0 }, + { "from_node": 2, "from_port": 0, "to_node": 4, "to_port": 0 }, + { "from_node": 3, "from_port": 0, "to_node": 4, "to_port": 1 }, + { "from_node": 4, "from_port": 0, "to_node": 5, "to_port": 0 }, + { "from_node": 5, "from_port": 0, "to_node": 7, "to_port": 0 }, + { "from_node": 6, "from_port": 0, "to_node": 7, "to_port": 1 }, + { "from_node": 7, "from_port": 0, "to_node": 8, "to_port": 0 }, + { "from_node": 8, "from_port": 0, "to_node": 9, "to_port": 0 }, + { "from_node": 9, "from_port": 0, "to_node": 10, "to_port": 0 } + ] +}