diff --git a/daw-backend/src/audio/node_graph/nodes/multi_sampler.rs b/daw-backend/src/audio/node_graph/nodes/multi_sampler.rs index bda7a3d..344c3b1 100644 --- a/daw-backend/src/audio/node_graph/nodes/multi_sampler.rs +++ b/daw-backend/src/audio/node_graph/nodes/multi_sampler.rs @@ -231,7 +231,7 @@ impl Voice { envelope_phase: EnvelopePhase::Attack, envelope_value: 0.0, crossfade_buffer: Vec::new(), - crossfade_length: 1000, // ~20ms at 48kHz (longer for smoother loops) + crossfade_length: 4800, // ~100ms at 48kHz — hides loop seams in sustained instruments } } } diff --git a/lightningbeam-ui/lightningbeam-editor/Cargo.toml b/lightningbeam-ui/lightningbeam-editor/Cargo.toml index 029f926..d03b24d 100644 --- a/lightningbeam-ui/lightningbeam-editor/Cargo.toml +++ b/lightningbeam-ui/lightningbeam-editor/Cargo.toml @@ -79,6 +79,8 @@ assets = [ ["assets/icons/32x32.png", "usr/share/icons/hicolor/32x32/apps/lightningbeam-editor.png", "644"], ["assets/icons/128x128.png", "usr/share/icons/hicolor/128x128/apps/lightningbeam-editor.png", "644"], ["assets/icons/256x256.png", "usr/share/icons/hicolor/256x256/apps/lightningbeam-editor.png", "644"], + # Factory instrument presets and samples — copied to share dir, preserving directory tree + ["target/release/presets/**/*", "usr/share/lightningbeam-editor/presets/", "644"], ] [package.metadata.generate-rpm] @@ -121,3 +123,10 @@ mode = "644" source = "assets/icons/256x256.png" dest = "/usr/share/icons/hicolor/256x256/apps/lightningbeam-editor.png" mode = "644" + +# Factory instrument presets and samples (built by build.rs into target dir) +[[package.metadata.generate-rpm.assets]] +source = "target/release/presets/" +dest = "/usr/share/lightningbeam-editor/presets/" +mode = "644" +doc = false diff --git a/lightningbeam-ui/lightningbeam-editor/build.rs b/lightningbeam-ui/lightningbeam-editor/build.rs index bad38b7..c668065 100644 --- a/lightningbeam-ui/lightningbeam-editor/build.rs +++ b/lightningbeam-ui/lightningbeam-editor/build.rs @@ -5,6 +5,9 @@ use std::path::PathBuf; fn main() { let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap(); + // Copy factory instrument presets next to the binary (works on all platforms) + bundle_factory_presets(); + if target_os == "windows" { bundle_windows_dlls(); } @@ -128,6 +131,56 @@ fn bundle_windows_dlls() { println!("cargo:warning=Bundled FFmpeg DLLs to {}", target_dir.display()); } +/// Copy factory instrument presets into target dir so they're next to the binary. +/// This makes them available for: +/// - Portable/AppImage builds (preset browser checks /presets/) +/// - Windows builds (same) +/// - cargo-deb/rpm packaging (assets reference target/release/presets/) +fn bundle_factory_presets() { + let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); + let instruments_src = manifest_dir.join("../../src/assets/instruments"); + + let out_dir = env::var("OUT_DIR").unwrap(); + let target_dir = PathBuf::from(&out_dir) + .parent().unwrap() + .parent().unwrap() + .parent().unwrap() + .to_path_buf(); + let presets_dst = target_dir.join("presets"); + + if !instruments_src.exists() { + println!("cargo:warning=Factory instruments not found at {:?}, skipping", instruments_src); + return; + } + + // Re-run if instruments change + println!("cargo:rerun-if-changed={}", instruments_src.display()); + + if let Err(e) = copy_dir_recursive(&instruments_src, &presets_dst) { + println!("cargo:warning=Failed to copy factory presets: {}", e); + } +} + +/// Recursively copy a directory tree, preserving structure. +/// Only copies .json and .mp3 files (skips README.md, etc.) +fn copy_dir_recursive(src: &std::path::Path, dst: &std::path::Path) -> std::io::Result<()> { + fs::create_dir_all(dst)?; + for entry in fs::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + if src_path.is_dir() { + copy_dir_recursive(&src_path, &dst_path)?; + } else if let Some(ext) = src_path.extension() { + let ext = ext.to_string_lossy().to_lowercase(); + if ext == "json" || ext == "mp3" { + fs::copy(&src_path, &dst_path)?; + } + } + } + Ok(()) +} + fn copy_library(lib_name: &str, search_paths: &[&str], lib_dir: &PathBuf) { let mut copied = false; diff --git a/scripts/build_instruments.py b/scripts/build_instruments.py new file mode 100644 index 0000000..a1bd28e --- /dev/null +++ b/scripts/build_instruments.py @@ -0,0 +1,569 @@ +#!/usr/bin/env python3 +"""Build factory instrument presets from Virtual Playing Orchestra 3 samples. + +Usage: + python3 scripts/build_instruments.py + +Converts WAV samples to MP3 and generates MultiSampler JSON presets. +""" + +import json +import os +import re +import subprocess +import sys +from pathlib import Path + +VPO = Path.home() / "Downloads" / "Virtual-Playing-Orchestra3" / "libs" +INSTRUMENTS_DIR = Path(__file__).parent.parent / "src" / "assets" / "instruments" + +# Note name to semitone offset (within octave) +NOTE_MAP = { + 'c': 0, 'c#': 1, 'db': 1, 'd': 2, 'd#': 3, 'eb': 3, + 'e': 4, 'f': 5, 'f#': 6, 'gb': 6, 'g': 7, 'g#': 8, 'ab': 8, + 'a': 9, 'a#': 10, 'bb': 10, 'b': 11, +} + + +def note_to_midi(note_name: str, octave: int) -> int: + """Convert note name + octave to MIDI number. C4 = 60.""" + semitone = NOTE_MAP[note_name.lower()] + return (octave + 1) * 12 + semitone + + +def parse_sso_filename(filename: str) -> dict | None: + """Parse SSO-style: instrument-sus-note-PB-loop.wav (e.g. 1st-violins-sus-a#3.wav) + Also handles flats: oboe-a#3, basses-sus-d#2, etc. + """ + m = re.search(r'([a-g][#b]?)(\d+)', filename.lower()) + if not m: + return None + note, octave = m.group(1), int(m.group(2)) + midi = note_to_midi(note, octave) + return {'midi': midi, 'note': f"{note.upper()}{octave}"} + + +def parse_nbo_filename(filename: str) -> dict | None: + """Parse NBO-style: octave_note.wav (e.g. 3_Bb-PB-loop.wav)""" + m = re.match(r'(\d+)_([A-Ga-g][b#]?)', filename) + if not m: + return None + octave, note = int(m.group(1)), m.group(2) + midi = note_to_midi(note, octave) + return {'midi': midi, 'note': f"{note}{octave}"} + + +def parse_nbo_with_dynamics(filename: str) -> dict | None: + """Parse NBO2-style with dynamics: octave_note_p.wav or octave_note.wav""" + m = re.match(r'(\d+)_([A-Ga-g][b#]?)(?:_(p|f|mf|ff))?', filename) + if not m: + return None + octave, note = int(m.group(1)), m.group(2) + dynamic = m.group(3) + midi = note_to_midi(note, octave) + return {'midi': midi, 'note': f"{note}{octave}", 'dynamic': dynamic} + + +def parse_mw_viola_filename(filename: str) -> dict | None: + """Parse MW-style: Violas_note.wav (e.g. Violas_c4.wav, Violas_d#3.wav)""" + m = re.search(r'_([a-g][#b]?)(\d+)\.wav', filename.lower()) + if not m: + return None + note, octave = m.group(1), int(m.group(2)) + midi = note_to_midi(note, octave) + return {'midi': midi, 'note': f"{note.upper()}{octave}"} + + +def parse_mw_horn_filename(filename: str) -> dict | None: + """Parse MW horn: horns-sus-ff-note-PB-loop.wav or horns-sus-mp-note-PB-loop.wav""" + # Extract dynamics marker (ff, mp) from filename + dyn_match = re.search(r'-(ff|mp|mf|p|pp)-', filename.lower()) + dynamic = dyn_match.group(1) if dyn_match else None + # Extract note + m = re.search(r'([a-g][#b]?)(\d+)', filename.lower()) + if not m: + return None + note, octave = m.group(1), int(m.group(2)) + midi = note_to_midi(note, octave) + return {'midi': midi, 'note': f"{note.upper()}{octave}", 'dynamic': dynamic} + + +def parse_vsco_harp_filename(filename: str) -> dict | None: + """Parse VSCO harp: KSHarp_Note_dyn.wav (e.g. KSHarp_A4_mf.wav)""" + m = re.search(r'KSHarp_([A-G][b#]?)(\d+)', filename) + if not m: + return None + note, octave = m.group(1), int(m.group(2)) + midi = note_to_midi(note, octave) + return {'midi': midi, 'note': f"{note}{octave}"} + + +def convert_wav_to_mp3(wav_path: Path, mp3_path: Path, bitrate: str = '192k'): + """Convert WAV to MP3 using ffmpeg with peak normalization.""" + mp3_path.parent.mkdir(parents=True, exist_ok=True) + if mp3_path.exists(): + return # Skip if already converted + # Peak-normalize to -1dBFS so all samples have consistent max level. + # Using dynaudnorm with very gentle settings to avoid changing the + # character of the sound — just brings everything to the same peak level. + subprocess.run([ + 'ffmpeg', '-i', str(wav_path), + '-af', 'loudnorm=I=-16:TP=-1:LRA=11', + '-ar', '44100', '-ab', bitrate, + '-y', '-loglevel', 'error', + str(mp3_path) + ], check=True) + + +def compute_key_ranges(layers: list[dict]) -> list[dict]: + """Compute key_min/key_max for each layer by splitting at midpoints between adjacent root notes.""" + if not layers: + return layers + layers.sort(key=lambda l: l['root_key']) + for i, layer in enumerate(layers): + if i == 0: + layer['key_min'] = 0 + else: + midpoint = (layers[i-1]['root_key'] + layer['root_key']) // 2 + 1 + layer['key_min'] = midpoint + layers[i-1]['key_max'] = midpoint - 1 + if i == len(layers) - 1: + layer['key_max'] = 127 + return layers + + +def make_preset(name: str, description: str, tags: list[str], layers: list[dict], + attack: float = 0.01, release: float = 0.3) -> dict: + """Generate a complete instrument preset JSON.""" + return { + "metadata": { + "name": name, + "description": description, + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": tags + }, + "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": f"{name} Sampler", + "parameters": { + "0": 1.0, # gain + "1": attack, # attack + "2": release, # release + "3": 0.0 # transpose + }, + "sample_data": { + "type": "multi_sampler", + "layers": layers + }, + "position": [350.0, 0.0] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [700.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} + ] + } + + +def build_simple_instrument(name: str, description: str, tags: list[str], + source_dir: Path, output_subdir: str, + filename_filter=None, parser=parse_sso_filename, + attack: float = 0.01, release: float = 0.3, + loop: bool = False): + """Build a single-velocity instrument from a directory of WAV files.""" + out_dir = INSTRUMENTS_DIR / output_subdir + samples_dir = out_dir / "samples" + samples_dir.mkdir(parents=True, exist_ok=True) + + layers = [] + wav_files = sorted(source_dir.glob("*.wav")) + for wav in wav_files: + if filename_filter and not filename_filter(wav.name): + continue + parsed = parser(wav.name) + if not parsed: + print(f" WARNING: Could not parse {wav.name}, skipping") + continue + mp3_name = f"{parsed['note']}.mp3" + mp3_path = samples_dir / mp3_name + print(f" Converting {wav.name} -> {mp3_name} (MIDI {parsed['midi']})") + convert_wav_to_mp3(wav, mp3_path) + layer = { + "file_path": f"samples/{mp3_name}", + "root_key": parsed['midi'], + "velocity_min": 0, + "velocity_max": 127, + } + if loop: + layer["loop_mode"] = "continuous" + layers.append(layer) + + layers = compute_key_ranges(layers) + preset = make_preset(name, description, tags, layers, attack, release) + preset_path = out_dir / f"{output_subdir.split('/')[-1]}.json" + with open(preset_path, 'w') as f: + json.dump(preset, f, indent=2) + print(f" -> Wrote {preset_path} ({len(layers)} layers)") + return layers + + +def build_dynamics_instrument(name: str, description: str, tags: list[str], + source_dir: Path, output_subdir: str, + filename_filter=None, parser=parse_nbo_with_dynamics, + attack: float = 0.01, release: float = 0.3, + loop: bool = False): + """Build an instrument with velocity layers from dynamics markings.""" + out_dir = INSTRUMENTS_DIR / output_subdir + samples_dir = out_dir / "samples" + samples_dir.mkdir(parents=True, exist_ok=True) + + # Group samples by dynamics level + # Map dynamics markings to velocity ranges (soft to loud) + DYNAMICS_ORDER = ['pp', 'p', 'mp', 'mf', 'f', 'ff'] + dynamics_groups: dict[str | None, list[dict]] = {} + + wav_files = sorted(source_dir.glob("*.wav")) + for wav in wav_files: + if filename_filter and not filename_filter(wav.name): + continue + parsed = parser(wav.name) + if not parsed: + print(f" WARNING: Could not parse {wav.name}, skipping") + continue + dyn = parsed.get('dynamic') + suffix = f"_{dyn}" if dyn else "" + mp3_name = f"{parsed['note']}{suffix}.mp3" + mp3_path = samples_dir / mp3_name + print(f" Converting {wav.name} -> {mp3_name} (MIDI {parsed['midi']}, dyn={dyn})") + convert_wav_to_mp3(wav, mp3_path) + + layer = { + "file_path": f"samples/{mp3_name}", + "root_key": parsed['midi'], + } + if loop: + layer["loop_mode"] = "continuous" + dynamics_groups.setdefault(dyn, []).append(layer) + + # Determine velocity ranges based on how many dynamics levels exist + # Treat None (unmarked) as forte — it's the "normal" dynamic + dyn_keys = sorted(dynamics_groups.keys(), + key=lambda d: DYNAMICS_ORDER.index(d) if d and d in DYNAMICS_ORDER else + (DYNAMICS_ORDER.index('f') if d is None else 3)) + if len(dyn_keys) == 1: + # Only one dynamics level — full velocity + for layer in dynamics_groups[dyn_keys[0]]: + layer["velocity_min"] = 0 + layer["velocity_max"] = 127 + else: + num_levels = len(dyn_keys) + vel_step = 128 // num_levels + for i, dyn in enumerate(dyn_keys): + vel_min = i * vel_step + vel_max = (i + 1) * vel_step - 1 if i < num_levels - 1 else 127 + for layer in dynamics_groups[dyn]: + layer["velocity_min"] = vel_min + layer["velocity_max"] = vel_max + + # Compute key ranges separately for each velocity group + all_layers = [] + for dyn, group in dynamics_groups.items(): + group = compute_key_ranges(group) + all_layers.extend(group) + preset = make_preset(name, description, tags, all_layers, attack, release) + preset_path = out_dir / f"{output_subdir.split('/')[-1]}.json" + with open(preset_path, 'w') as f: + json.dump(preset, f, indent=2) + dyn_summary = ", ".join(f"{k or 'default'}: {len(v)}" for k, v in dynamics_groups.items()) + print(f" -> Wrote {preset_path} ({len(all_layers)} layers: {dyn_summary})") + return all_layers + + +def build_combined_instrument(name: str, description: str, tags: list[str], + component_dirs: list[str], output_subdir: str, + attack: float = 0.01, release: float = 0.3): + """Build a combined instrument that references samples from component instruments. + + component_dirs: list of output_subdir paths for component instruments, ordered low to high pitch. + Splits the keyboard range across them. + """ + out_dir = INSTRUMENTS_DIR / output_subdir + out_dir.mkdir(parents=True, exist_ok=True) + + # Load each component's preset to get its layers + all_component_layers = [] + for comp_dir in component_dirs: + comp_path = INSTRUMENTS_DIR / comp_dir + json_files = list(comp_path.glob("*.json")) + if not json_files: + print(f" WARNING: No preset found in {comp_dir}") + continue + with open(json_files[0]) as f: + comp_preset = json.load(f) + comp_layers = comp_preset["nodes"][1]["sample_data"]["layers"] + # Adjust file paths to be relative from the combined instrument dir + rel_prefix = os.path.relpath(comp_path, out_dir) + for layer in comp_layers: + layer["file_path"] = f"{rel_prefix}/{layer['file_path']}" + all_component_layers.extend(comp_layers) + + # Re-sort by root key and recompute ranges across all layers + # Group by velocity range to handle dynamics separately + vel_groups = {} + for layer in all_component_layers: + vel_key = (layer["velocity_min"], layer["velocity_max"]) + vel_groups.setdefault(vel_key, []).append(layer) + + final_layers = [] + for vel_key, group in vel_groups.items(): + group = compute_key_ranges(group) + # Preserve the original velocity range + for layer in group: + layer["velocity_min"] = vel_key[0] + layer["velocity_max"] = vel_key[1] + final_layers.extend(group) + + preset = make_preset(name, description, tags, final_layers, attack, release) + preset_path = out_dir / f"{output_subdir.split('/')[-1]}.json" + with open(preset_path, 'w') as f: + json.dump(preset, f, indent=2) + print(f" -> Wrote {preset_path} ({len(final_layers)} layers from {len(component_dirs)} components)") + + +def main(): + print("=== Building Lightningbeam Factory Instruments from VPO3 ===\n") + + if not VPO.exists(): + print(f"ERROR: VPO3 not found at {VPO}") + sys.exit(1) + + # --- STRINGS --- + + print("\n[1/14] Violin Section (SSO 1st Violins sustain)") + build_simple_instrument( + "Violin Section", "Orchestral violin section with sustained bowing", + ["strings", "violin", "section", "orchestral"], + VPO / "SSO" / "Samples" / "1st Violins", + "strings/violin-section", + filename_filter=lambda f: 'sus' in f.lower(), + parser=parse_sso_filename, + attack=0.05, release=0.4, + loop=True, + ) + + print("\n[2/14] Viola Section (Mattias-Westlund)") + build_simple_instrument( + "Viola Section", "Orchestral viola section with sustained bowing", + ["strings", "viola", "section", "orchestral"], + VPO / "Mattias-Westlund" / "ViolaSect" / "Samples", + "strings/viola-section", + parser=parse_mw_viola_filename, + attack=0.05, release=0.4, + loop=True, + ) + + print("\n[3/14] Cello Section (NBO sustain)") + build_simple_instrument( + "Cello Section", "Orchestral cello section with sustained bowing", + ["strings", "cello", "section", "orchestral"], + VPO / "NoBudgetOrch" / "CelloSect" / "Sustain", + "strings/cello-section", + parser=parse_nbo_filename, + attack=0.05, release=0.4, + loop=True, + ) + + print("\n[4/14] Bass Section (SSO sustain)") + build_simple_instrument( + "Bass Section", "Orchestral double bass section with sustained bowing", + ["strings", "bass", "contrabass", "section", "orchestral"], + VPO / "SSO" / "Samples" / "Basses", + "strings/bass-section", + filename_filter=lambda f: 'sus' in f.lower(), + parser=parse_sso_filename, + attack=0.08, release=0.5, + loop=True, + ) + + print("\n[5/14] Harp (VSCO2-CE)") + build_simple_instrument( + "Harp", "Concert harp", + ["strings", "harp", "orchestral"], + VPO / "VSCO2-CE" / "Strings" / "Harp", + "strings/harp", + parser=parse_vsco_harp_filename, + attack=0.001, release=0.8, + ) + + # --- WOODWINDS --- + + print("\n[6/14] Flute Section (NBO)") + build_simple_instrument( + "Flute", "Orchestral flute section", + ["woodwinds", "flute", "section", "orchestral"], + VPO / "NoBudgetOrch" / "FluteSect", + "woodwinds/flute", + parser=parse_nbo_filename, + attack=0.03, release=0.3, + loop=True, + ) + + print("\n[7/14] Oboe (SSO solo)") + build_simple_instrument( + "Oboe", "Solo oboe", + ["woodwinds", "oboe", "solo", "orchestral"], + VPO / "SSO" / "Samples" / "Oboe", + "woodwinds/oboe", + filename_filter=lambda f: f.endswith('.wav') and 'readme' not in f.lower(), + parser=parse_sso_filename, + attack=0.02, release=0.25, + loop=True, + ) + + print("\n[8/14] Clarinet Section (NBO)") + build_simple_instrument( + "Clarinet", "Orchestral clarinet section", + ["woodwinds", "clarinet", "section", "orchestral"], + VPO / "NoBudgetOrch" / "ClarinetSect" / "Sustain", + "woodwinds/clarinet", + parser=parse_nbo_filename, + attack=0.02, release=0.25, + loop=True, + ) + + print("\n[9/14] Bassoon (SSO)") + build_simple_instrument( + "Bassoon", "Solo bassoon", + ["woodwinds", "bassoon", "solo", "orchestral"], + VPO / "SSO" / "Samples" / "Bassoon", + "woodwinds/bassoon", + parser=parse_sso_filename, + attack=0.03, release=0.3, + loop=True, + ) + + # --- BRASS --- + + print("\n[10/14] Horn Section (Mattias-Westlund, ff + mp dynamics)") + build_dynamics_instrument( + "Horn Section", "French horn section with forte and mezzo-piano dynamics", + ["brass", "horn", "french horn", "section", "orchestral"], + VPO / "Mattias-Westlund" / "Horns" / "Samples", + "brass/horn-section", + parser=parse_mw_horn_filename, + attack=0.04, release=0.4, + loop=True, + ) + + print("\n[11/14] Trumpet Section (NBO2 with dynamics)") + build_dynamics_instrument( + "Trumpet Section", "Orchestral trumpet section with piano and forte dynamics", + ["brass", "trumpet", "section", "orchestral"], + VPO / "NoBudgetOrch2" / "Trumpet" / "TrumpetSect" / "Sustain", + "brass/trumpet-section", + attack=0.02, release=0.3, + loop=True, + ) + + print("\n[12/14] Trombone Section (NBO2 with dynamics)") + build_dynamics_instrument( + "Trombone Section", "Orchestral trombone section with piano and forte dynamics", + ["brass", "trombone", "section", "orchestral"], + VPO / "NoBudgetOrch2" / "Trombone" / "TromboneSect" / "Sustain", + "brass/trombone-section", + attack=0.03, release=0.35, + loop=True, + ) + + print("\n[13/14] Tuba (SSO sustain)") + build_simple_instrument( + "Tuba", "Orchestral tuba", + ["brass", "tuba", "orchestral"], + VPO / "SSO" / "Samples" / "Tuba", + "brass/tuba", + filename_filter=lambda f: 'sus' in f.lower(), + parser=parse_sso_filename, + attack=0.04, release=0.4, + loop=True, + ) + + # --- PERCUSSION --- + + print("\n[14/14] Timpani (NBO)") + build_simple_instrument( + "Timpani", "Orchestral timpani", + ["percussion", "timpani", "orchestral"], + VPO / "NoBudgetOrch" / "Timpani", + "orchestral/timpani", + parser=lambda f: parse_sso_filename(f), # Note-octave format like A2-PB.wav + attack=0.001, release=1.5, + ) + + # --- COMBINED INSTRUMENTS --- + + print("\n[Combined] Strings") + build_combined_instrument( + "Strings", "Full string section — auto-selects violin, viola, cello, or bass by pitch range", + ["strings", "section", "orchestral", "combined"], + [ + "strings/bass-section", + "strings/cello-section", + "strings/viola-section", + "strings/violin-section", + ], + "strings/strings-combined", + attack=0.05, release=0.4, + ) + + print("\n[Combined] Woodwinds") + build_combined_instrument( + "Woodwinds", "Full woodwind section — auto-selects bassoon, clarinet, oboe, or flute by pitch range", + ["woodwinds", "section", "orchestral", "combined"], + [ + "woodwinds/bassoon", + "woodwinds/clarinet", + "woodwinds/oboe", + "woodwinds/flute", + ], + "woodwinds/woodwinds-combined", + attack=0.03, release=0.3, + ) + + print("\n[Combined] Brass") + build_combined_instrument( + "Brass", "Full brass section — auto-selects tuba, trombone, horn, or trumpet by pitch range", + ["brass", "section", "orchestral", "combined"], + [ + "brass/tuba", + "brass/trombone-section", + "brass/horn-section", + "brass/trumpet-section", + ], + "brass/brass-combined", + attack=0.03, release=0.35, + ) + + print("\n=== Done! ===") + + +if __name__ == '__main__': + main() diff --git a/src/assets/instruments/brass/brass-combined/brass-combined.json b/src/assets/instruments/brass/brass-combined/brass-combined.json new file mode 100644 index 0000000..7ab78da --- /dev/null +++ b/src/assets/instruments/brass/brass-combined/brass-combined.json @@ -0,0 +1,758 @@ +{ + "metadata": { + "name": "Brass", + "description": "Full brass section \u2014 auto-selects tuba, trombone, horn, or trumpet by pitch range", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "brass", + "section", + "orchestral", + "combined" + ] + }, + "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": "Brass Sampler", + "parameters": { + "0": 1.0, + "1": 0.03, + "2": 0.35, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "../tuba/samples/E1.mp3", + "root_key": 28, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 29 + }, + { + "file_path": "../tuba/samples/G1.mp3", + "root_key": 31, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 30, + "key_max": 32 + }, + { + "file_path": "../tuba/samples/A#1.mp3", + "root_key": 34, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 33, + "key_max": 35 + }, + { + "file_path": "../tuba/samples/C#2.mp3", + "root_key": 37, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 36, + "key_max": 38 + }, + { + "file_path": "../tuba/samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 39, + "key_max": 41 + }, + { + "file_path": "../tuba/samples/G2.mp3", + "root_key": 43, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "../tuba/samples/A#2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "../tuba/samples/C#3.mp3", + "root_key": 49, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "../tuba/samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 51, + "key_max": 127 + }, + { + "file_path": "../horn-section/samples/E2_ff.mp3", + "root_key": 40, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 0, + "key_max": 40 + }, + { + "file_path": "../trombone-section/samples/F2.mp3", + "root_key": 41, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 41, + "key_max": 42 + }, + { + "file_path": "../horn-section/samples/G2_ff.mp3", + "root_key": 43, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 43, + "key_max": 44 + }, + { + "file_path": "../trombone-section/samples/A2.mp3", + "root_key": 45, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 45, + "key_max": 45 + }, + { + "file_path": "../horn-section/samples/A#2_ff.mp3", + "root_key": 46, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 46, + "key_max": 47 + }, + { + "file_path": "../trombone-section/samples/C3.mp3", + "root_key": 48, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 48, + "key_max": 48 + }, + { + "file_path": "../horn-section/samples/C#3_ff.mp3", + "root_key": 49, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 49, + "key_max": 50 + }, + { + "file_path": "../trombone-section/samples/Eb3.mp3", + "root_key": 51, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 51, + "key_max": 51 + }, + { + "file_path": "../horn-section/samples/E3_ff.mp3", + "root_key": 52, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 52, + "key_max": 53 + }, + { + "file_path": "../trombone-section/samples/Gb3.mp3", + "root_key": 54, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 54, + "key_max": 54 + }, + { + "file_path": "../horn-section/samples/G3_ff.mp3", + "root_key": 55, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 55, + "key_max": 55 + }, + { + "file_path": "../trumpet-section/samples/G3.mp3", + "root_key": 55, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 56, + "key_max": 55 + }, + { + "file_path": "../trumpet-section/samples/Ab3.mp3", + "root_key": 56, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 56, + "key_max": 56 + }, + { + "file_path": "../trombone-section/samples/A3.mp3", + "root_key": 57, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 57, + "key_max": 57 + }, + { + "file_path": "../horn-section/samples/A#3_ff.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 58, + "key_max": 58 + }, + { + "file_path": "../trumpet-section/samples/Bb3.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 59, + "key_max": 59 + }, + { + "file_path": "../trombone-section/samples/C4.mp3", + "root_key": 60, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 60, + "key_max": 60 + }, + { + "file_path": "../trumpet-section/samples/C4.mp3", + "root_key": 60, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 61, + "key_max": 60 + }, + { + "file_path": "../horn-section/samples/C#4_ff.mp3", + "root_key": 61, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 61, + "key_max": 61 + }, + { + "file_path": "../trumpet-section/samples/D4.mp3", + "root_key": 62, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 62, + "key_max": 62 + }, + { + "file_path": "../trombone-section/samples/Eb4.mp3", + "root_key": 63, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 63, + "key_max": 63 + }, + { + "file_path": "../horn-section/samples/E4_ff.mp3", + "root_key": 64, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 64, + "key_max": 64 + }, + { + "file_path": "../trumpet-section/samples/E4.mp3", + "root_key": 64, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 65, + "key_max": 64 + }, + { + "file_path": "../trumpet-section/samples/F4.mp3", + "root_key": 65, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 65, + "key_max": 65 + }, + { + "file_path": "../trombone-section/samples/Gb4.mp3", + "root_key": 66, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 66, + "key_max": 66 + }, + { + "file_path": "../horn-section/samples/G4_ff.mp3", + "root_key": 67, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 67, + "key_max": 67 + }, + { + "file_path": "../trumpet-section/samples/G4.mp3", + "root_key": 67, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 68, + "key_max": 68 + }, + { + "file_path": "../trombone-section/samples/A4.mp3", + "root_key": 69, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 69, + "key_max": 69 + }, + { + "file_path": "../trumpet-section/samples/A4.mp3", + "root_key": 69, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 70, + "key_max": 69 + }, + { + "file_path": "../horn-section/samples/A#4_ff.mp3", + "root_key": 70, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 70, + "key_max": 70 + }, + { + "file_path": "../trumpet-section/samples/Bb4.mp3", + "root_key": 70, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 71, + "key_max": 71 + }, + { + "file_path": "../trombone-section/samples/C5.mp3", + "root_key": 72, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 72, + "key_max": 72 + }, + { + "file_path": "../trumpet-section/samples/C5.mp3", + "root_key": 72, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 73, + "key_max": 72 + }, + { + "file_path": "../horn-section/samples/C#5_ff.mp3", + "root_key": 73, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 73, + "key_max": 73 + }, + { + "file_path": "../trumpet-section/samples/D5.mp3", + "root_key": 74, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 74, + "key_max": 74 + }, + { + "file_path": "../trumpet-section/samples/Eb5.mp3", + "root_key": 75, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 75, + "key_max": 75 + }, + { + "file_path": "../horn-section/samples/E5_ff.mp3", + "root_key": 76, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 76, + "key_max": 76 + }, + { + "file_path": "../trumpet-section/samples/F5.mp3", + "root_key": 77, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 77, + "key_max": 78 + }, + { + "file_path": "../trumpet-section/samples/G5.mp3", + "root_key": 79, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 79, + "key_max": 80 + }, + { + "file_path": "../trumpet-section/samples/A5.mp3", + "root_key": 81, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 81, + "key_max": 82 + }, + { + "file_path": "../trumpet-section/samples/B5.mp3", + "root_key": 83, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 83, + "key_max": 84 + }, + { + "file_path": "../trumpet-section/samples/Db6.mp3", + "root_key": 85, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 85, + "key_max": 127 + }, + { + "file_path": "../horn-section/samples/E2_mp.mp3", + "root_key": 40, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 0, + "key_max": 40 + }, + { + "file_path": "../trombone-section/samples/F2_p.mp3", + "root_key": 41, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 41, + "key_max": 42 + }, + { + "file_path": "../horn-section/samples/G2_mp.mp3", + "root_key": 43, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 43, + "key_max": 44 + }, + { + "file_path": "../trombone-section/samples/Bb2_p.mp3", + "root_key": 46, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 45, + "key_max": 46 + }, + { + "file_path": "../horn-section/samples/A#2_mp.mp3", + "root_key": 46, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 47, + "key_max": 47 + }, + { + "file_path": "../horn-section/samples/C#3_mp.mp3", + "root_key": 49, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "../trombone-section/samples/Eb3_p.mp3", + "root_key": 51, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 51, + "key_max": 51 + }, + { + "file_path": "../horn-section/samples/E3_mp.mp3", + "root_key": 52, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 52, + "key_max": 53 + }, + { + "file_path": "../horn-section/samples/G3_mp.mp3", + "root_key": 55, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 54, + "key_max": 55 + }, + { + "file_path": "../trombone-section/samples/Ab3_p.mp3", + "root_key": 56, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 56, + "key_max": 57 + }, + { + "file_path": "../horn-section/samples/A#3_mp.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 58, + "key_max": 58 + }, + { + "file_path": "../trumpet-section/samples/Bb3_p.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 59, + "key_max": 59 + }, + { + "file_path": "../trombone-section/samples/Db4_p.mp3", + "root_key": 61, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 60, + "key_max": 61 + }, + { + "file_path": "../horn-section/samples/C#4_mp.mp3", + "root_key": 61, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 62, + "key_max": 62 + }, + { + "file_path": "../trumpet-section/samples/Eb4_p.mp3", + "root_key": 63, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 63, + "key_max": 63 + }, + { + "file_path": "../horn-section/samples/E4_mp.mp3", + "root_key": 64, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 64, + "key_max": 65 + }, + { + "file_path": "../trombone-section/samples/Gb4_p.mp3", + "root_key": 66, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 66, + "key_max": 66 + }, + { + "file_path": "../horn-section/samples/G4_mp.mp3", + "root_key": 67, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 67, + "key_max": 67 + }, + { + "file_path": "../trumpet-section/samples/Ab4_p.mp3", + "root_key": 68, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 68, + "key_max": 69 + }, + { + "file_path": "../horn-section/samples/A#4_mp.mp3", + "root_key": 70, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 70, + "key_max": 70 + }, + { + "file_path": "../trombone-section/samples/B4_p.mp3", + "root_key": 71, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 71, + "key_max": 72 + }, + { + "file_path": "../horn-section/samples/C#5_mp.mp3", + "root_key": 73, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 73, + "key_max": 73 + }, + { + "file_path": "../trumpet-section/samples/Db5_p.mp3", + "root_key": 73, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 74, + "key_max": 74 + }, + { + "file_path": "../horn-section/samples/E5_mp.mp3", + "root_key": 76, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 75, + "key_max": 78 + }, + { + "file_path": "../trumpet-section/samples/Ab5_p.mp3", + "root_key": 80, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 79, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/brass/horn-section/horn-section.json b/src/assets/instruments/brass/horn-section/horn-section.json new file mode 100644 index 0000000..712aefa --- /dev/null +++ b/src/assets/instruments/brass/horn-section/horn-section.json @@ -0,0 +1,309 @@ +{ + "metadata": { + "name": "Horn Section", + "description": "French horn section with forte and mezzo-piano dynamics", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "brass", + "horn", + "french horn", + "section", + "orchestral" + ] + }, + "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": "Horn Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.04, + "2": 0.4, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/E2_ff.mp3", + "root_key": 40, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 0, + "key_max": 41 + }, + { + "file_path": "samples/G2_ff.mp3", + "root_key": 43, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "samples/A#2_ff.mp3", + "root_key": 46, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "samples/C#3_ff.mp3", + "root_key": 49, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "samples/E3_ff.mp3", + "root_key": 52, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 51, + "key_max": 53 + }, + { + "file_path": "samples/G3_ff.mp3", + "root_key": 55, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 54, + "key_max": 56 + }, + { + "file_path": "samples/A#3_ff.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 57, + "key_max": 59 + }, + { + "file_path": "samples/C#4_ff.mp3", + "root_key": 61, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 60, + "key_max": 62 + }, + { + "file_path": "samples/E4_ff.mp3", + "root_key": 64, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 63, + "key_max": 65 + }, + { + "file_path": "samples/G4_ff.mp3", + "root_key": 67, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 66, + "key_max": 68 + }, + { + "file_path": "samples/A#4_ff.mp3", + "root_key": 70, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 69, + "key_max": 71 + }, + { + "file_path": "samples/C#5_ff.mp3", + "root_key": 73, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 72, + "key_max": 74 + }, + { + "file_path": "samples/E5_ff.mp3", + "root_key": 76, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 75, + "key_max": 127 + }, + { + "file_path": "samples/E2_mp.mp3", + "root_key": 40, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 0, + "key_max": 41 + }, + { + "file_path": "samples/G2_mp.mp3", + "root_key": 43, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "samples/A#2_mp.mp3", + "root_key": 46, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "samples/C#3_mp.mp3", + "root_key": 49, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "samples/E3_mp.mp3", + "root_key": 52, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 51, + "key_max": 53 + }, + { + "file_path": "samples/G3_mp.mp3", + "root_key": 55, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 54, + "key_max": 56 + }, + { + "file_path": "samples/A#3_mp.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 57, + "key_max": 59 + }, + { + "file_path": "samples/C#4_mp.mp3", + "root_key": 61, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 60, + "key_max": 62 + }, + { + "file_path": "samples/E4_mp.mp3", + "root_key": 64, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 63, + "key_max": 65 + }, + { + "file_path": "samples/G4_mp.mp3", + "root_key": 67, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 66, + "key_max": 68 + }, + { + "file_path": "samples/A#4_mp.mp3", + "root_key": 70, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 69, + "key_max": 71 + }, + { + "file_path": "samples/C#5_mp.mp3", + "root_key": 73, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 72, + "key_max": 74 + }, + { + "file_path": "samples/E5_mp.mp3", + "root_key": 76, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 75, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/brass/horn-section/samples/A#2_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/A#2_ff.mp3 new file mode 100644 index 0000000..adf34e2 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/A#2_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/A#2_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/A#2_mp.mp3 new file mode 100644 index 0000000..f6971cd Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/A#2_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/A#3_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/A#3_ff.mp3 new file mode 100644 index 0000000..7cffe9d Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/A#3_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/A#3_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/A#3_mp.mp3 new file mode 100644 index 0000000..2faced2 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/A#3_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/A#4_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/A#4_ff.mp3 new file mode 100644 index 0000000..dba0769 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/A#4_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/A#4_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/A#4_mp.mp3 new file mode 100644 index 0000000..17d953d Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/A#4_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/C#3_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/C#3_ff.mp3 new file mode 100644 index 0000000..ed054c6 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/C#3_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/C#3_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/C#3_mp.mp3 new file mode 100644 index 0000000..9126cb6 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/C#3_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/C#4_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/C#4_ff.mp3 new file mode 100644 index 0000000..b6444c3 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/C#4_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/C#4_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/C#4_mp.mp3 new file mode 100644 index 0000000..634fca1 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/C#4_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/C#5_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/C#5_ff.mp3 new file mode 100644 index 0000000..57d66cd Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/C#5_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/C#5_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/C#5_mp.mp3 new file mode 100644 index 0000000..90c9836 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/C#5_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E2_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/E2_ff.mp3 new file mode 100644 index 0000000..44b4e4e Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E2_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E2_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/E2_mp.mp3 new file mode 100644 index 0000000..2e27202 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E2_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E3_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/E3_ff.mp3 new file mode 100644 index 0000000..1f5f355 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E3_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E3_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/E3_mp.mp3 new file mode 100644 index 0000000..61dc8d4 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E3_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E4_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/E4_ff.mp3 new file mode 100644 index 0000000..a8a3677 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E4_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E4_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/E4_mp.mp3 new file mode 100644 index 0000000..cd15ab3 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E4_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E5_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/E5_ff.mp3 new file mode 100644 index 0000000..4ffc63d Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E5_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/E5_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/E5_mp.mp3 new file mode 100644 index 0000000..bf908bf Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/E5_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/G2_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/G2_ff.mp3 new file mode 100644 index 0000000..df69093 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/G2_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/G2_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/G2_mp.mp3 new file mode 100644 index 0000000..198f588 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/G2_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/G3_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/G3_ff.mp3 new file mode 100644 index 0000000..a1760e8 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/G3_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/G3_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/G3_mp.mp3 new file mode 100644 index 0000000..2a0c3a2 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/G3_mp.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/G4_ff.mp3 b/src/assets/instruments/brass/horn-section/samples/G4_ff.mp3 new file mode 100644 index 0000000..924dbfb Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/G4_ff.mp3 differ diff --git a/src/assets/instruments/brass/horn-section/samples/G4_mp.mp3 b/src/assets/instruments/brass/horn-section/samples/G4_mp.mp3 new file mode 100644 index 0000000..f723ee4 Binary files /dev/null and b/src/assets/instruments/brass/horn-section/samples/G4_mp.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/A2.mp3 b/src/assets/instruments/brass/trombone-section/samples/A2.mp3 new file mode 100644 index 0000000..66d93e1 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/A2.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/A3.mp3 b/src/assets/instruments/brass/trombone-section/samples/A3.mp3 new file mode 100644 index 0000000..420a5ef Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/A3.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/A4.mp3 b/src/assets/instruments/brass/trombone-section/samples/A4.mp3 new file mode 100644 index 0000000..740f075 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/A4.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Ab3_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/Ab3_p.mp3 new file mode 100644 index 0000000..4e4ad8e Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Ab3_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/B4_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/B4_p.mp3 new file mode 100644 index 0000000..fe2680e Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/B4_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Bb2_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/Bb2_p.mp3 new file mode 100644 index 0000000..6118845 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Bb2_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/C3.mp3 b/src/assets/instruments/brass/trombone-section/samples/C3.mp3 new file mode 100644 index 0000000..26871b1 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/C3.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/C4.mp3 b/src/assets/instruments/brass/trombone-section/samples/C4.mp3 new file mode 100644 index 0000000..5c3eb08 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/C4.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/C5.mp3 b/src/assets/instruments/brass/trombone-section/samples/C5.mp3 new file mode 100644 index 0000000..7595540 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/C5.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Db4_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/Db4_p.mp3 new file mode 100644 index 0000000..662e8f4 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Db4_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Eb3.mp3 b/src/assets/instruments/brass/trombone-section/samples/Eb3.mp3 new file mode 100644 index 0000000..3fec57d Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Eb3.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Eb3_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/Eb3_p.mp3 new file mode 100644 index 0000000..4c1b61f Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Eb3_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Eb4.mp3 b/src/assets/instruments/brass/trombone-section/samples/Eb4.mp3 new file mode 100644 index 0000000..3fa97dd Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Eb4.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/F2.mp3 b/src/assets/instruments/brass/trombone-section/samples/F2.mp3 new file mode 100644 index 0000000..d8342fb Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/F2.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/F2_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/F2_p.mp3 new file mode 100644 index 0000000..ab9d617 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/F2_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Gb3.mp3 b/src/assets/instruments/brass/trombone-section/samples/Gb3.mp3 new file mode 100644 index 0000000..0b11f1e Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Gb3.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Gb4.mp3 b/src/assets/instruments/brass/trombone-section/samples/Gb4.mp3 new file mode 100644 index 0000000..f533388 Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Gb4.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/samples/Gb4_p.mp3 b/src/assets/instruments/brass/trombone-section/samples/Gb4_p.mp3 new file mode 100644 index 0000000..bb4d9fa Binary files /dev/null and b/src/assets/instruments/brass/trombone-section/samples/Gb4_p.mp3 differ diff --git a/src/assets/instruments/brass/trombone-section/trombone-section.json b/src/assets/instruments/brass/trombone-section/trombone-section.json new file mode 100644 index 0000000..f7675cc --- /dev/null +++ b/src/assets/instruments/brass/trombone-section/trombone-section.json @@ -0,0 +1,236 @@ +{ + "metadata": { + "name": "Trombone Section", + "description": "Orchestral trombone section with piano and forte dynamics", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "brass", + "trombone", + "section", + "orchestral" + ] + }, + "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": "Trombone Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.03, + "2": 0.35, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/F2.mp3", + "root_key": 41, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 0, + "key_max": 43 + }, + { + "file_path": "samples/A2.mp3", + "root_key": 45, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 44, + "key_max": 46 + }, + { + "file_path": "samples/C3.mp3", + "root_key": 48, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 47, + "key_max": 49 + }, + { + "file_path": "samples/Eb3.mp3", + "root_key": 51, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 50, + "key_max": 52 + }, + { + "file_path": "samples/Gb3.mp3", + "root_key": 54, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 53, + "key_max": 55 + }, + { + "file_path": "samples/A3.mp3", + "root_key": 57, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 56, + "key_max": 58 + }, + { + "file_path": "samples/C4.mp3", + "root_key": 60, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 59, + "key_max": 61 + }, + { + "file_path": "samples/Eb4.mp3", + "root_key": 63, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 62, + "key_max": 64 + }, + { + "file_path": "samples/Gb4.mp3", + "root_key": 66, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 65, + "key_max": 67 + }, + { + "file_path": "samples/A4.mp3", + "root_key": 69, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 68, + "key_max": 70 + }, + { + "file_path": "samples/C5.mp3", + "root_key": 72, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 71, + "key_max": 127 + }, + { + "file_path": "samples/F2_p.mp3", + "root_key": 41, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 0, + "key_max": 43 + }, + { + "file_path": "samples/Bb2_p.mp3", + "root_key": 46, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 44, + "key_max": 48 + }, + { + "file_path": "samples/Eb3_p.mp3", + "root_key": 51, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 49, + "key_max": 53 + }, + { + "file_path": "samples/Ab3_p.mp3", + "root_key": 56, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 54, + "key_max": 58 + }, + { + "file_path": "samples/Db4_p.mp3", + "root_key": 61, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 59, + "key_max": 63 + }, + { + "file_path": "samples/Gb4_p.mp3", + "root_key": 66, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 64, + "key_max": 68 + }, + { + "file_path": "samples/B4_p.mp3", + "root_key": 71, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 69, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/brass/trumpet-section/samples/A4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/A4.mp3 new file mode 100644 index 0000000..3520d9f Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/A4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/A5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/A5.mp3 new file mode 100644 index 0000000..6ff1631 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/A5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Ab3.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Ab3.mp3 new file mode 100644 index 0000000..9af2752 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Ab3.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Ab4_p.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Ab4_p.mp3 new file mode 100644 index 0000000..cc48ef5 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Ab4_p.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Ab5_p.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Ab5_p.mp3 new file mode 100644 index 0000000..cc8d83f Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Ab5_p.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/B5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/B5.mp3 new file mode 100644 index 0000000..f6ee29e Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/B5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Bb3.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Bb3.mp3 new file mode 100644 index 0000000..570735c Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Bb3.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Bb3_p.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Bb3_p.mp3 new file mode 100644 index 0000000..cc75445 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Bb3_p.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Bb4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Bb4.mp3 new file mode 100644 index 0000000..f0c04c5 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Bb4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/C4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/C4.mp3 new file mode 100644 index 0000000..671462e Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/C4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/C5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/C5.mp3 new file mode 100644 index 0000000..ec3c991 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/C5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/D4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/D4.mp3 new file mode 100644 index 0000000..d153604 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/D4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/D5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/D5.mp3 new file mode 100644 index 0000000..69ea694 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/D5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Db5_p.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Db5_p.mp3 new file mode 100644 index 0000000..1bd8793 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Db5_p.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Db6.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Db6.mp3 new file mode 100644 index 0000000..90ebe7b Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Db6.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/E4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/E4.mp3 new file mode 100644 index 0000000..c75e258 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/E4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Eb4_p.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Eb4_p.mp3 new file mode 100644 index 0000000..9471d6d Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Eb4_p.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/Eb5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/Eb5.mp3 new file mode 100644 index 0000000..3e7a242 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/Eb5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/F4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/F4.mp3 new file mode 100644 index 0000000..1df924a Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/F4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/F5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/F5.mp3 new file mode 100644 index 0000000..cf40887 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/F5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/G3.mp3 b/src/assets/instruments/brass/trumpet-section/samples/G3.mp3 new file mode 100644 index 0000000..7784336 Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/G3.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/G4.mp3 b/src/assets/instruments/brass/trumpet-section/samples/G4.mp3 new file mode 100644 index 0000000..773c91e Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/G4.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/samples/G5.mp3 b/src/assets/instruments/brass/trumpet-section/samples/G5.mp3 new file mode 100644 index 0000000..45fb89b Binary files /dev/null and b/src/assets/instruments/brass/trumpet-section/samples/G5.mp3 differ diff --git a/src/assets/instruments/brass/trumpet-section/trumpet-section.json b/src/assets/instruments/brass/trumpet-section/trumpet-section.json new file mode 100644 index 0000000..b0756d2 --- /dev/null +++ b/src/assets/instruments/brass/trumpet-section/trumpet-section.json @@ -0,0 +1,281 @@ +{ + "metadata": { + "name": "Trumpet Section", + "description": "Orchestral trumpet section with piano and forte dynamics", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "brass", + "trumpet", + "section", + "orchestral" + ] + }, + "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": "Trumpet Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.02, + "2": 0.3, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/G3.mp3", + "root_key": 55, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 0, + "key_max": 55 + }, + { + "file_path": "samples/Ab3.mp3", + "root_key": 56, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 56, + "key_max": 57 + }, + { + "file_path": "samples/Bb3.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 58, + "key_max": 59 + }, + { + "file_path": "samples/C4.mp3", + "root_key": 60, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 60, + "key_max": 61 + }, + { + "file_path": "samples/D4.mp3", + "root_key": 62, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 62, + "key_max": 63 + }, + { + "file_path": "samples/E4.mp3", + "root_key": 64, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 64, + "key_max": 64 + }, + { + "file_path": "samples/F4.mp3", + "root_key": 65, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 65, + "key_max": 66 + }, + { + "file_path": "samples/G4.mp3", + "root_key": 67, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 67, + "key_max": 68 + }, + { + "file_path": "samples/A4.mp3", + "root_key": 69, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 69, + "key_max": 69 + }, + { + "file_path": "samples/Bb4.mp3", + "root_key": 70, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 70, + "key_max": 71 + }, + { + "file_path": "samples/C5.mp3", + "root_key": 72, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 72, + "key_max": 73 + }, + { + "file_path": "samples/D5.mp3", + "root_key": 74, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 74, + "key_max": 74 + }, + { + "file_path": "samples/Eb5.mp3", + "root_key": 75, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 75, + "key_max": 76 + }, + { + "file_path": "samples/F5.mp3", + "root_key": 77, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 77, + "key_max": 78 + }, + { + "file_path": "samples/G5.mp3", + "root_key": 79, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 79, + "key_max": 80 + }, + { + "file_path": "samples/A5.mp3", + "root_key": 81, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 81, + "key_max": 82 + }, + { + "file_path": "samples/B5.mp3", + "root_key": 83, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 83, + "key_max": 84 + }, + { + "file_path": "samples/Db6.mp3", + "root_key": 85, + "loop_mode": "continuous", + "velocity_min": 64, + "velocity_max": 127, + "key_min": 85, + "key_max": 127 + }, + { + "file_path": "samples/Bb3_p.mp3", + "root_key": 58, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 0, + "key_max": 60 + }, + { + "file_path": "samples/Eb4_p.mp3", + "root_key": 63, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 61, + "key_max": 65 + }, + { + "file_path": "samples/Ab4_p.mp3", + "root_key": 68, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 66, + "key_max": 70 + }, + { + "file_path": "samples/Db5_p.mp3", + "root_key": 73, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 71, + "key_max": 76 + }, + { + "file_path": "samples/Ab5_p.mp3", + "root_key": 80, + "loop_mode": "continuous", + "velocity_min": 0, + "velocity_max": 63, + "key_min": 77, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/brass/tuba/samples/A#1.mp3 b/src/assets/instruments/brass/tuba/samples/A#1.mp3 new file mode 100644 index 0000000..dcf02d2 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/A#1.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/A#2.mp3 b/src/assets/instruments/brass/tuba/samples/A#2.mp3 new file mode 100644 index 0000000..affa8c0 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/A#2.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/C#2.mp3 b/src/assets/instruments/brass/tuba/samples/C#2.mp3 new file mode 100644 index 0000000..c600b14 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/C#2.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/C#3.mp3 b/src/assets/instruments/brass/tuba/samples/C#3.mp3 new file mode 100644 index 0000000..a972378 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/C#3.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/E1.mp3 b/src/assets/instruments/brass/tuba/samples/E1.mp3 new file mode 100644 index 0000000..6af9ba2 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/E1.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/E2.mp3 b/src/assets/instruments/brass/tuba/samples/E2.mp3 new file mode 100644 index 0000000..47f6d77 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/E2.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/E3.mp3 b/src/assets/instruments/brass/tuba/samples/E3.mp3 new file mode 100644 index 0000000..8f4c05c Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/E3.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/G1.mp3 b/src/assets/instruments/brass/tuba/samples/G1.mp3 new file mode 100644 index 0000000..17b58d3 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/G1.mp3 differ diff --git a/src/assets/instruments/brass/tuba/samples/G2.mp3 b/src/assets/instruments/brass/tuba/samples/G2.mp3 new file mode 100644 index 0000000..74468a9 Binary files /dev/null and b/src/assets/instruments/brass/tuba/samples/G2.mp3 differ diff --git a/src/assets/instruments/brass/tuba/tuba.json b/src/assets/instruments/brass/tuba/tuba.json new file mode 100644 index 0000000..5dcefa5 --- /dev/null +++ b/src/assets/instruments/brass/tuba/tuba.json @@ -0,0 +1,154 @@ +{ + "metadata": { + "name": "Tuba", + "description": "Orchestral tuba", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "brass", + "tuba", + "orchestral" + ] + }, + "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": "Tuba Sampler", + "parameters": { + "0": 1.0, + "1": 0.04, + "2": 0.4, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/E1.mp3", + "root_key": 28, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 29 + }, + { + "file_path": "samples/G1.mp3", + "root_key": 31, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 30, + "key_max": 32 + }, + { + "file_path": "samples/A#1.mp3", + "root_key": 34, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 33, + "key_max": 35 + }, + { + "file_path": "samples/C#2.mp3", + "root_key": 37, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 36, + "key_max": 38 + }, + { + "file_path": "samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 39, + "key_max": 41 + }, + { + "file_path": "samples/G2.mp3", + "root_key": 43, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "samples/A#2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "samples/C#3.mp3", + "root_key": 49, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 51, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/orchestral/timpani/samples/A2.mp3 b/src/assets/instruments/orchestral/timpani/samples/A2.mp3 new file mode 100644 index 0000000..2cecf88 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/A2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/A3.mp3 b/src/assets/instruments/orchestral/timpani/samples/A3.mp3 new file mode 100644 index 0000000..5224de0 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/A3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/AB2.mp3 b/src/assets/instruments/orchestral/timpani/samples/AB2.mp3 new file mode 100644 index 0000000..396e9b3 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/AB2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/AB3.mp3 b/src/assets/instruments/orchestral/timpani/samples/AB3.mp3 new file mode 100644 index 0000000..d61dfd7 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/AB3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/BB2.mp3 b/src/assets/instruments/orchestral/timpani/samples/BB2.mp3 new file mode 100644 index 0000000..0ea785e Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/BB2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/BB3.mp3 b/src/assets/instruments/orchestral/timpani/samples/BB3.mp3 new file mode 100644 index 0000000..ad7eac6 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/BB3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/C2.mp3 b/src/assets/instruments/orchestral/timpani/samples/C2.mp3 new file mode 100644 index 0000000..4872384 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/C2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/C3.mp3 b/src/assets/instruments/orchestral/timpani/samples/C3.mp3 new file mode 100644 index 0000000..02a61b4 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/C3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/D2.mp3 b/src/assets/instruments/orchestral/timpani/samples/D2.mp3 new file mode 100644 index 0000000..bc78780 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/D2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/D3.mp3 b/src/assets/instruments/orchestral/timpani/samples/D3.mp3 new file mode 100644 index 0000000..822e301 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/D3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/E2.mp3 b/src/assets/instruments/orchestral/timpani/samples/E2.mp3 new file mode 100644 index 0000000..76f8174 Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/E2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/F2.mp3 b/src/assets/instruments/orchestral/timpani/samples/F2.mp3 new file mode 100644 index 0000000..cc8dcee Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/F2.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/G3.mp3 b/src/assets/instruments/orchestral/timpani/samples/G3.mp3 new file mode 100644 index 0000000..1b8bdfd Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/G3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/samples/GB3.mp3 b/src/assets/instruments/orchestral/timpani/samples/GB3.mp3 new file mode 100644 index 0000000..af4a9ec Binary files /dev/null and b/src/assets/instruments/orchestral/timpani/samples/GB3.mp3 differ diff --git a/src/assets/instruments/orchestral/timpani/timpani.json b/src/assets/instruments/orchestral/timpani/timpani.json new file mode 100644 index 0000000..7dff474 --- /dev/null +++ b/src/assets/instruments/orchestral/timpani/timpani.json @@ -0,0 +1,185 @@ +{ + "metadata": { + "name": "Timpani", + "description": "Orchestral timpani", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "percussion", + "timpani", + "orchestral" + ] + }, + "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": "Timpani Sampler", + "parameters": { + "0": 1.0, + "1": 0.001, + "2": 1.5, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/C2.mp3", + "root_key": 36, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 0, + "key_max": 37 + }, + { + "file_path": "samples/D2.mp3", + "root_key": 38, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 38, + "key_max": 39 + }, + { + "file_path": "samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 40, + "key_max": 40 + }, + { + "file_path": "samples/F2.mp3", + "root_key": 41, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 41, + "key_max": 42 + }, + { + "file_path": "samples/AB2.mp3", + "root_key": 44, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 43, + "key_max": 44 + }, + { + "file_path": "samples/A2.mp3", + "root_key": 45, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 45, + "key_max": 45 + }, + { + "file_path": "samples/BB2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 46, + "key_max": 47 + }, + { + "file_path": "samples/C3.mp3", + "root_key": 48, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 48, + "key_max": 49 + }, + { + "file_path": "samples/D3.mp3", + "root_key": 50, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 50, + "key_max": 52 + }, + { + "file_path": "samples/GB3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 53, + "key_max": 54 + }, + { + "file_path": "samples/G3.mp3", + "root_key": 55, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 55, + "key_max": 55 + }, + { + "file_path": "samples/AB3.mp3", + "root_key": 56, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 56, + "key_max": 56 + }, + { + "file_path": "samples/A3.mp3", + "root_key": 57, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 57, + "key_max": 57 + }, + { + "file_path": "samples/BB3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 58, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/strings/bass-section/bass-section.json b/src/assets/instruments/strings/bass-section/bass-section.json new file mode 100644 index 0000000..c32bab5 --- /dev/null +++ b/src/assets/instruments/strings/bass-section/bass-section.json @@ -0,0 +1,183 @@ +{ + "metadata": { + "name": "Bass Section", + "description": "Orchestral double bass section with sustained bowing", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "strings", + "bass", + "contrabass", + "section", + "orchestral" + ] + }, + "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": "Bass Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.08, + "2": 0.5, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/C1.mp3", + "root_key": 24, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 27 + }, + { + "file_path": "samples/F#1.mp3", + "root_key": 30, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 28, + "key_max": 31 + }, + { + "file_path": "samples/A1.mp3", + "root_key": 33, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 32, + "key_max": 34 + }, + { + "file_path": "samples/C2.mp3", + "root_key": 36, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 35, + "key_max": 37 + }, + { + "file_path": "samples/D#2.mp3", + "root_key": 39, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 38, + "key_max": 40 + }, + { + "file_path": "samples/F#2.mp3", + "root_key": 42, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 41, + "key_max": 43 + }, + { + "file_path": "samples/A2.mp3", + "root_key": 45, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 44, + "key_max": 46 + }, + { + "file_path": "samples/C3.mp3", + "root_key": 48, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 47, + "key_max": 49 + }, + { + "file_path": "samples/D#3.mp3", + "root_key": 51, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 50, + "key_max": 52 + }, + { + "file_path": "samples/F#3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 53, + "key_max": 55 + }, + { + "file_path": "samples/A3.mp3", + "root_key": 57, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 56, + "key_max": 58 + }, + { + "file_path": "samples/C4.mp3", + "root_key": 60, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 59, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/strings/bass-section/samples/A1.mp3 b/src/assets/instruments/strings/bass-section/samples/A1.mp3 new file mode 100644 index 0000000..4881496 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/A1.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/A2.mp3 b/src/assets/instruments/strings/bass-section/samples/A2.mp3 new file mode 100644 index 0000000..9777c45 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/A2.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/A3.mp3 b/src/assets/instruments/strings/bass-section/samples/A3.mp3 new file mode 100644 index 0000000..06d1e52 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/A3.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/C1.mp3 b/src/assets/instruments/strings/bass-section/samples/C1.mp3 new file mode 100644 index 0000000..087156c Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/C1.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/C2.mp3 b/src/assets/instruments/strings/bass-section/samples/C2.mp3 new file mode 100644 index 0000000..7d2ac27 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/C2.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/C3.mp3 b/src/assets/instruments/strings/bass-section/samples/C3.mp3 new file mode 100644 index 0000000..c66595e Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/C3.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/C4.mp3 b/src/assets/instruments/strings/bass-section/samples/C4.mp3 new file mode 100644 index 0000000..0c31e1f Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/C4.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/D#2.mp3 b/src/assets/instruments/strings/bass-section/samples/D#2.mp3 new file mode 100644 index 0000000..76b8698 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/D#2.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/D#3.mp3 b/src/assets/instruments/strings/bass-section/samples/D#3.mp3 new file mode 100644 index 0000000..4c2bccb Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/D#3.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/F#1.mp3 b/src/assets/instruments/strings/bass-section/samples/F#1.mp3 new file mode 100644 index 0000000..c3da0d4 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/F#1.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/F#2.mp3 b/src/assets/instruments/strings/bass-section/samples/F#2.mp3 new file mode 100644 index 0000000..3d0251c Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/F#2.mp3 differ diff --git a/src/assets/instruments/strings/bass-section/samples/F#3.mp3 b/src/assets/instruments/strings/bass-section/samples/F#3.mp3 new file mode 100644 index 0000000..0a743e8 Binary files /dev/null and b/src/assets/instruments/strings/bass-section/samples/F#3.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/cello-section.json b/src/assets/instruments/strings/cello-section/cello-section.json new file mode 100644 index 0000000..8d72e41 --- /dev/null +++ b/src/assets/instruments/strings/cello-section/cello-section.json @@ -0,0 +1,182 @@ +{ + "metadata": { + "name": "Cello Section", + "description": "Orchestral cello section with sustained bowing", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "strings", + "cello", + "section", + "orchestral" + ] + }, + "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": "Cello Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.05, + "2": 0.4, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/Db2.mp3", + "root_key": 37, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 38 + }, + { + "file_path": "samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 39, + "key_max": 41 + }, + { + "file_path": "samples/G2.mp3", + "root_key": 43, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "samples/Bb2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "samples/Db3.mp3", + "root_key": 49, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 51, + "key_max": 55 + }, + { + "file_path": "samples/Bb3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 56, + "key_max": 59 + }, + { + "file_path": "samples/Db4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 60, + "key_max": 62 + }, + { + "file_path": "samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 63, + "key_max": 65 + }, + { + "file_path": "samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 66, + "key_max": 68 + }, + { + "file_path": "samples/Bb4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 69, + "key_max": 73 + }, + { + "file_path": "samples/E5.mp3", + "root_key": 76, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 74, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/strings/cello-section/samples/Bb2.mp3 b/src/assets/instruments/strings/cello-section/samples/Bb2.mp3 new file mode 100644 index 0000000..cd1a13f Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/Bb2.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/Bb3.mp3 b/src/assets/instruments/strings/cello-section/samples/Bb3.mp3 new file mode 100644 index 0000000..4e383df Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/Bb3.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/Bb4.mp3 b/src/assets/instruments/strings/cello-section/samples/Bb4.mp3 new file mode 100644 index 0000000..c1c6c02 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/Bb4.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/Db2.mp3 b/src/assets/instruments/strings/cello-section/samples/Db2.mp3 new file mode 100644 index 0000000..5904490 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/Db2.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/Db3.mp3 b/src/assets/instruments/strings/cello-section/samples/Db3.mp3 new file mode 100644 index 0000000..d6f82bb Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/Db3.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/Db4.mp3 b/src/assets/instruments/strings/cello-section/samples/Db4.mp3 new file mode 100644 index 0000000..c0beefb Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/Db4.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/E2.mp3 b/src/assets/instruments/strings/cello-section/samples/E2.mp3 new file mode 100644 index 0000000..3d82922 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/E2.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/E3.mp3 b/src/assets/instruments/strings/cello-section/samples/E3.mp3 new file mode 100644 index 0000000..96b2ecf Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/E3.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/E4.mp3 b/src/assets/instruments/strings/cello-section/samples/E4.mp3 new file mode 100644 index 0000000..4155db4 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/E4.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/E5.mp3 b/src/assets/instruments/strings/cello-section/samples/E5.mp3 new file mode 100644 index 0000000..c5273a5 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/E5.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/G2.mp3 b/src/assets/instruments/strings/cello-section/samples/G2.mp3 new file mode 100644 index 0000000..a7358b5 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/G2.mp3 differ diff --git a/src/assets/instruments/strings/cello-section/samples/G4.mp3 b/src/assets/instruments/strings/cello-section/samples/G4.mp3 new file mode 100644 index 0000000..c5d8e28 Binary files /dev/null and b/src/assets/instruments/strings/cello-section/samples/G4.mp3 differ diff --git a/src/assets/instruments/strings/harp/harp.json b/src/assets/instruments/strings/harp/harp.json new file mode 100644 index 0000000..9cd7e1f --- /dev/null +++ b/src/assets/instruments/strings/harp/harp.json @@ -0,0 +1,217 @@ +{ + "metadata": { + "name": "Harp", + "description": "Concert harp", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "strings", + "harp", + "orchestral" + ] + }, + "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": "Harp Sampler", + "parameters": { + "0": 1.0, + "1": 0.001, + "2": 0.8, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/D2.mp3", + "root_key": 38, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 0, + "key_max": 39 + }, + { + "file_path": "samples/F2.mp3", + "root_key": 41, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 40, + "key_max": 44 + }, + { + "file_path": "samples/C3.mp3", + "root_key": 48, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 45, + "key_max": 50 + }, + { + "file_path": "samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 51, + "key_max": 53 + }, + { + "file_path": "samples/G3.mp3", + "root_key": 55, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 54, + "key_max": 57 + }, + { + "file_path": "samples/B3.mp3", + "root_key": 59, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 58, + "key_max": 60 + }, + { + "file_path": "samples/D4.mp3", + "root_key": 62, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 61, + "key_max": 63 + }, + { + "file_path": "samples/F4.mp3", + "root_key": 65, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 64, + "key_max": 67 + }, + { + "file_path": "samples/A4.mp3", + "root_key": 69, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 68, + "key_max": 70 + }, + { + "file_path": "samples/C5.mp3", + "root_key": 72, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 71, + "key_max": 74 + }, + { + "file_path": "samples/E5.mp3", + "root_key": 76, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 75, + "key_max": 77 + }, + { + "file_path": "samples/G5.mp3", + "root_key": 79, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 78, + "key_max": 81 + }, + { + "file_path": "samples/B5.mp3", + "root_key": 83, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 82, + "key_max": 84 + }, + { + "file_path": "samples/D6.mp3", + "root_key": 86, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 85, + "key_max": 87 + }, + { + "file_path": "samples/F6.mp3", + "root_key": 89, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 88, + "key_max": 91 + }, + { + "file_path": "samples/A6.mp3", + "root_key": 93, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 92, + "key_max": 95 + }, + { + "file_path": "samples/D7.mp3", + "root_key": 98, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 96, + "key_max": 99 + }, + { + "file_path": "samples/F7.mp3", + "root_key": 101, + "velocity_min": 0, + "velocity_max": 127, + "key_min": 100, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/strings/harp/samples/A4.mp3 b/src/assets/instruments/strings/harp/samples/A4.mp3 new file mode 100644 index 0000000..e7d2ade Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/A4.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/A6.mp3 b/src/assets/instruments/strings/harp/samples/A6.mp3 new file mode 100644 index 0000000..d621144 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/A6.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/B3.mp3 b/src/assets/instruments/strings/harp/samples/B3.mp3 new file mode 100644 index 0000000..3934cf5 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/B3.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/B5.mp3 b/src/assets/instruments/strings/harp/samples/B5.mp3 new file mode 100644 index 0000000..890d8ff Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/B5.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/C3.mp3 b/src/assets/instruments/strings/harp/samples/C3.mp3 new file mode 100644 index 0000000..1f9dddf Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/C3.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/C5.mp3 b/src/assets/instruments/strings/harp/samples/C5.mp3 new file mode 100644 index 0000000..4df6d9a Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/C5.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/D2.mp3 b/src/assets/instruments/strings/harp/samples/D2.mp3 new file mode 100644 index 0000000..d663a29 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/D2.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/D4.mp3 b/src/assets/instruments/strings/harp/samples/D4.mp3 new file mode 100644 index 0000000..15f0bc1 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/D4.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/D6.mp3 b/src/assets/instruments/strings/harp/samples/D6.mp3 new file mode 100644 index 0000000..b42965d Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/D6.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/D7.mp3 b/src/assets/instruments/strings/harp/samples/D7.mp3 new file mode 100644 index 0000000..e1ebaa1 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/D7.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/E3.mp3 b/src/assets/instruments/strings/harp/samples/E3.mp3 new file mode 100644 index 0000000..3de63c8 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/E3.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/E5.mp3 b/src/assets/instruments/strings/harp/samples/E5.mp3 new file mode 100644 index 0000000..1cce26b Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/E5.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/F2.mp3 b/src/assets/instruments/strings/harp/samples/F2.mp3 new file mode 100644 index 0000000..fc78931 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/F2.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/F4.mp3 b/src/assets/instruments/strings/harp/samples/F4.mp3 new file mode 100644 index 0000000..844786b Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/F4.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/F6.mp3 b/src/assets/instruments/strings/harp/samples/F6.mp3 new file mode 100644 index 0000000..ec72484 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/F6.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/F7.mp3 b/src/assets/instruments/strings/harp/samples/F7.mp3 new file mode 100644 index 0000000..28196cd Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/F7.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/G3.mp3 b/src/assets/instruments/strings/harp/samples/G3.mp3 new file mode 100644 index 0000000..3a346e4 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/G3.mp3 differ diff --git a/src/assets/instruments/strings/harp/samples/G5.mp3 b/src/assets/instruments/strings/harp/samples/G5.mp3 new file mode 100644 index 0000000..5b17cb4 Binary files /dev/null and b/src/assets/instruments/strings/harp/samples/G5.mp3 differ diff --git a/src/assets/instruments/strings/strings-combined/strings-combined.json b/src/assets/instruments/strings/strings-combined/strings-combined.json new file mode 100644 index 0000000..582bec3 --- /dev/null +++ b/src/assets/instruments/strings/strings-combined/strings-combined.json @@ -0,0 +1,551 @@ +{ + "metadata": { + "name": "Strings", + "description": "Full string section \u2014 auto-selects violin, viola, cello, or bass by pitch range", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "strings", + "section", + "orchestral", + "combined" + ] + }, + "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": "Strings Sampler", + "parameters": { + "0": 1.0, + "1": 0.05, + "2": 0.4, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "../bass-section/samples/C1.mp3", + "root_key": 24, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 27 + }, + { + "file_path": "../bass-section/samples/F#1.mp3", + "root_key": 30, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 28, + "key_max": 31 + }, + { + "file_path": "../bass-section/samples/A1.mp3", + "root_key": 33, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 32, + "key_max": 34 + }, + { + "file_path": "../bass-section/samples/C2.mp3", + "root_key": 36, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 35, + "key_max": 36 + }, + { + "file_path": "../cello-section/samples/Db2.mp3", + "root_key": 37, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 37, + "key_max": 38 + }, + { + "file_path": "../bass-section/samples/D#2.mp3", + "root_key": 39, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 39, + "key_max": 39 + }, + { + "file_path": "../cello-section/samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 40, + "key_max": 41 + }, + { + "file_path": "../bass-section/samples/F#2.mp3", + "root_key": 42, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 42, + "key_max": 42 + }, + { + "file_path": "../cello-section/samples/G2.mp3", + "root_key": 43, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 43, + "key_max": 44 + }, + { + "file_path": "../bass-section/samples/A2.mp3", + "root_key": 45, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 45, + "key_max": 45 + }, + { + "file_path": "../cello-section/samples/Bb2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 46, + "key_max": 47 + }, + { + "file_path": "../bass-section/samples/C3.mp3", + "root_key": 48, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 48, + "key_max": 48 + }, + { + "file_path": "../viola-section/samples/C3.mp3", + "root_key": 48, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 49, + "key_max": 48 + }, + { + "file_path": "../cello-section/samples/Db3.mp3", + "root_key": 49, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 49, + "key_max": 50 + }, + { + "file_path": "../bass-section/samples/D#3.mp3", + "root_key": 51, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 51, + "key_max": 51 + }, + { + "file_path": "../viola-section/samples/D#3.mp3", + "root_key": 51, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 52, + "key_max": 51 + }, + { + "file_path": "../cello-section/samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 52, + "key_max": 53 + }, + { + "file_path": "../bass-section/samples/F#3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 54, + "key_max": 54 + }, + { + "file_path": "../viola-section/samples/F#3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 55, + "key_max": 54 + }, + { + "file_path": "../violin-section/samples/G3.mp3", + "root_key": 55, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 55, + "key_max": 56 + }, + { + "file_path": "../bass-section/samples/A3.mp3", + "root_key": 57, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 57, + "key_max": 57 + }, + { + "file_path": "../viola-section/samples/A3.mp3", + "root_key": 57, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 58, + "key_max": 57 + }, + { + "file_path": "../cello-section/samples/Bb3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 58, + "key_max": 58 + }, + { + "file_path": "../violin-section/samples/A#3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 59, + "key_max": 59 + }, + { + "file_path": "../bass-section/samples/C4.mp3", + "root_key": 60, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 60, + "key_max": 60 + }, + { + "file_path": "../viola-section/samples/C4.mp3", + "root_key": 60, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 61, + "key_max": 60 + }, + { + "file_path": "../cello-section/samples/Db4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 61, + "key_max": 61 + }, + { + "file_path": "../violin-section/samples/C#4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 62, + "key_max": 62 + }, + { + "file_path": "../viola-section/samples/D#4.mp3", + "root_key": 63, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 63, + "key_max": 63 + }, + { + "file_path": "../cello-section/samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 64, + "key_max": 64 + }, + { + "file_path": "../violin-section/samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 65, + "key_max": 65 + }, + { + "file_path": "../viola-section/samples/F#4.mp3", + "root_key": 66, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 66, + "key_max": 66 + }, + { + "file_path": "../cello-section/samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 67, + "key_max": 67 + }, + { + "file_path": "../violin-section/samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 68, + "key_max": 68 + }, + { + "file_path": "../viola-section/samples/A4.mp3", + "root_key": 69, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 69, + "key_max": 69 + }, + { + "file_path": "../cello-section/samples/Bb4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 70, + "key_max": 70 + }, + { + "file_path": "../violin-section/samples/A#4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 71, + "key_max": 71 + }, + { + "file_path": "../viola-section/samples/C5.mp3", + "root_key": 72, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 72, + "key_max": 72 + }, + { + "file_path": "../violin-section/samples/C#5.mp3", + "root_key": 73, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 73, + "key_max": 74 + }, + { + "file_path": "../viola-section/samples/D#5.mp3", + "root_key": 75, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 75, + "key_max": 75 + }, + { + "file_path": "../cello-section/samples/E5.mp3", + "root_key": 76, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 76, + "key_max": 76 + }, + { + "file_path": "../violin-section/samples/E5.mp3", + "root_key": 76, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 77, + "key_max": 77 + }, + { + "file_path": "../viola-section/samples/F#5.mp3", + "root_key": 78, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 78, + "key_max": 78 + }, + { + "file_path": "../violin-section/samples/G5.mp3", + "root_key": 79, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 79, + "key_max": 80 + }, + { + "file_path": "../viola-section/samples/A5.mp3", + "root_key": 81, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 81, + "key_max": 81 + }, + { + "file_path": "../violin-section/samples/A#5.mp3", + "root_key": 82, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 82, + "key_max": 83 + }, + { + "file_path": "../viola-section/samples/C6.mp3", + "root_key": 84, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 84, + "key_max": 84 + }, + { + "file_path": "../violin-section/samples/C#6.mp3", + "root_key": 85, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 85, + "key_max": 86 + }, + { + "file_path": "../viola-section/samples/D#6.mp3", + "root_key": 87, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 87, + "key_max": 87 + }, + { + "file_path": "../violin-section/samples/E6.mp3", + "root_key": 88, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 88, + "key_max": 89 + }, + { + "file_path": "../viola-section/samples/F#6.mp3", + "root_key": 90, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 90, + "key_max": 90 + }, + { + "file_path": "../violin-section/samples/G6.mp3", + "root_key": 91, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 91, + "key_max": 92 + }, + { + "file_path": "../violin-section/samples/A#6.mp3", + "root_key": 94, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 93, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/strings/viola-section/samples/A3.mp3 b/src/assets/instruments/strings/viola-section/samples/A3.mp3 new file mode 100644 index 0000000..b206bcb Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/A3.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/A4.mp3 b/src/assets/instruments/strings/viola-section/samples/A4.mp3 new file mode 100644 index 0000000..61d698c Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/A4.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/A5.mp3 b/src/assets/instruments/strings/viola-section/samples/A5.mp3 new file mode 100644 index 0000000..48b0c9c Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/A5.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/C3.mp3 b/src/assets/instruments/strings/viola-section/samples/C3.mp3 new file mode 100644 index 0000000..f2af13e Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/C3.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/C4.mp3 b/src/assets/instruments/strings/viola-section/samples/C4.mp3 new file mode 100644 index 0000000..a87b294 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/C4.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/C5.mp3 b/src/assets/instruments/strings/viola-section/samples/C5.mp3 new file mode 100644 index 0000000..df7c92c Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/C5.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/C6.mp3 b/src/assets/instruments/strings/viola-section/samples/C6.mp3 new file mode 100644 index 0000000..3e996b8 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/C6.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/D#3.mp3 b/src/assets/instruments/strings/viola-section/samples/D#3.mp3 new file mode 100644 index 0000000..c8826e8 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/D#3.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/D#4.mp3 b/src/assets/instruments/strings/viola-section/samples/D#4.mp3 new file mode 100644 index 0000000..b175bc2 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/D#4.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/D#5.mp3 b/src/assets/instruments/strings/viola-section/samples/D#5.mp3 new file mode 100644 index 0000000..8bf289b Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/D#5.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/D#6.mp3 b/src/assets/instruments/strings/viola-section/samples/D#6.mp3 new file mode 100644 index 0000000..18e7541 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/D#6.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/F#3.mp3 b/src/assets/instruments/strings/viola-section/samples/F#3.mp3 new file mode 100644 index 0000000..0f6b01c Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/F#3.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/F#4.mp3 b/src/assets/instruments/strings/viola-section/samples/F#4.mp3 new file mode 100644 index 0000000..ac97f90 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/F#4.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/F#5.mp3 b/src/assets/instruments/strings/viola-section/samples/F#5.mp3 new file mode 100644 index 0000000..2c400cd Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/F#5.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/samples/F#6.mp3 b/src/assets/instruments/strings/viola-section/samples/F#6.mp3 new file mode 100644 index 0000000..f39a121 Binary files /dev/null and b/src/assets/instruments/strings/viola-section/samples/F#6.mp3 differ diff --git a/src/assets/instruments/strings/viola-section/viola-section.json b/src/assets/instruments/strings/viola-section/viola-section.json new file mode 100644 index 0000000..a78878f --- /dev/null +++ b/src/assets/instruments/strings/viola-section/viola-section.json @@ -0,0 +1,209 @@ +{ + "metadata": { + "name": "Viola Section", + "description": "Orchestral viola section with sustained bowing", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "strings", + "viola", + "section", + "orchestral" + ] + }, + "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": "Viola Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.05, + "2": 0.4, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/C3.mp3", + "root_key": 48, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 49 + }, + { + "file_path": "samples/D#3.mp3", + "root_key": 51, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 50, + "key_max": 52 + }, + { + "file_path": "samples/F#3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 53, + "key_max": 55 + }, + { + "file_path": "samples/A3.mp3", + "root_key": 57, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 56, + "key_max": 58 + }, + { + "file_path": "samples/C4.mp3", + "root_key": 60, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 59, + "key_max": 61 + }, + { + "file_path": "samples/D#4.mp3", + "root_key": 63, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 62, + "key_max": 64 + }, + { + "file_path": "samples/F#4.mp3", + "root_key": 66, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 65, + "key_max": 67 + }, + { + "file_path": "samples/A4.mp3", + "root_key": 69, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 68, + "key_max": 70 + }, + { + "file_path": "samples/C5.mp3", + "root_key": 72, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 71, + "key_max": 73 + }, + { + "file_path": "samples/D#5.mp3", + "root_key": 75, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 74, + "key_max": 76 + }, + { + "file_path": "samples/F#5.mp3", + "root_key": 78, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 77, + "key_max": 79 + }, + { + "file_path": "samples/A5.mp3", + "root_key": 81, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 80, + "key_max": 82 + }, + { + "file_path": "samples/C6.mp3", + "root_key": 84, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 83, + "key_max": 85 + }, + { + "file_path": "samples/D#6.mp3", + "root_key": 87, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 86, + "key_max": 88 + }, + { + "file_path": "samples/F#6.mp3", + "root_key": 90, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 89, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/strings/violin-section/samples/A#3.mp3 b/src/assets/instruments/strings/violin-section/samples/A#3.mp3 new file mode 100644 index 0000000..7411012 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/A#3.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/A#4.mp3 b/src/assets/instruments/strings/violin-section/samples/A#4.mp3 new file mode 100644 index 0000000..6072cab Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/A#4.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/A#5.mp3 b/src/assets/instruments/strings/violin-section/samples/A#5.mp3 new file mode 100644 index 0000000..55092a2 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/A#5.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/A#6.mp3 b/src/assets/instruments/strings/violin-section/samples/A#6.mp3 new file mode 100644 index 0000000..935187e Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/A#6.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/C#4.mp3 b/src/assets/instruments/strings/violin-section/samples/C#4.mp3 new file mode 100644 index 0000000..5307f4f Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/C#4.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/C#5.mp3 b/src/assets/instruments/strings/violin-section/samples/C#5.mp3 new file mode 100644 index 0000000..3d7fdf5 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/C#5.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/C#6.mp3 b/src/assets/instruments/strings/violin-section/samples/C#6.mp3 new file mode 100644 index 0000000..0d97d7a Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/C#6.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/E4.mp3 b/src/assets/instruments/strings/violin-section/samples/E4.mp3 new file mode 100644 index 0000000..a8719dc Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/E4.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/E5.mp3 b/src/assets/instruments/strings/violin-section/samples/E5.mp3 new file mode 100644 index 0000000..c87be11 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/E5.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/E6.mp3 b/src/assets/instruments/strings/violin-section/samples/E6.mp3 new file mode 100644 index 0000000..896003e Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/E6.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/G3.mp3 b/src/assets/instruments/strings/violin-section/samples/G3.mp3 new file mode 100644 index 0000000..99fe2a7 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/G3.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/G4.mp3 b/src/assets/instruments/strings/violin-section/samples/G4.mp3 new file mode 100644 index 0000000..4eb592a Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/G4.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/G5.mp3 b/src/assets/instruments/strings/violin-section/samples/G5.mp3 new file mode 100644 index 0000000..57a88b4 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/G5.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/samples/G6.mp3 b/src/assets/instruments/strings/violin-section/samples/G6.mp3 new file mode 100644 index 0000000..47ebd28 Binary files /dev/null and b/src/assets/instruments/strings/violin-section/samples/G6.mp3 differ diff --git a/src/assets/instruments/strings/violin-section/violin-section.json b/src/assets/instruments/strings/violin-section/violin-section.json new file mode 100644 index 0000000..ab7c749 --- /dev/null +++ b/src/assets/instruments/strings/violin-section/violin-section.json @@ -0,0 +1,200 @@ +{ + "metadata": { + "name": "Violin Section", + "description": "Orchestral violin section with sustained bowing", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "strings", + "violin", + "section", + "orchestral" + ] + }, + "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": "Violin Section Sampler", + "parameters": { + "0": 1.0, + "1": 0.05, + "2": 0.4, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/G3.mp3", + "root_key": 55, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 56 + }, + { + "file_path": "samples/A#3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 57, + "key_max": 59 + }, + { + "file_path": "samples/C#4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 60, + "key_max": 62 + }, + { + "file_path": "samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 63, + "key_max": 65 + }, + { + "file_path": "samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 66, + "key_max": 68 + }, + { + "file_path": "samples/A#4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 69, + "key_max": 71 + }, + { + "file_path": "samples/C#5.mp3", + "root_key": 73, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 72, + "key_max": 74 + }, + { + "file_path": "samples/E5.mp3", + "root_key": 76, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 75, + "key_max": 77 + }, + { + "file_path": "samples/G5.mp3", + "root_key": 79, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 78, + "key_max": 80 + }, + { + "file_path": "samples/A#5.mp3", + "root_key": 82, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 81, + "key_max": 83 + }, + { + "file_path": "samples/C#6.mp3", + "root_key": 85, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 84, + "key_max": 86 + }, + { + "file_path": "samples/E6.mp3", + "root_key": 88, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 87, + "key_max": 89 + }, + { + "file_path": "samples/G6.mp3", + "root_key": 91, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 90, + "key_max": 92 + }, + { + "file_path": "samples/A#6.mp3", + "root_key": 94, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 93, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/woodwinds/bassoon/bassoon.json b/src/assets/instruments/woodwinds/bassoon/bassoon.json new file mode 100644 index 0000000..9a4e985 --- /dev/null +++ b/src/assets/instruments/woodwinds/bassoon/bassoon.json @@ -0,0 +1,191 @@ +{ + "metadata": { + "name": "Bassoon", + "description": "Solo bassoon", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "woodwinds", + "bassoon", + "solo", + "orchestral" + ] + }, + "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": "Bassoon Sampler", + "parameters": { + "0": 1.0, + "1": 0.03, + "2": 0.3, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/A#1.mp3", + "root_key": 34, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 35 + }, + { + "file_path": "samples/C#2.mp3", + "root_key": 37, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 36, + "key_max": 38 + }, + { + "file_path": "samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 39, + "key_max": 41 + }, + { + "file_path": "samples/G2.mp3", + "root_key": 43, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "samples/A#2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "samples/C#3.mp3", + "root_key": 49, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 48, + "key_max": 50 + }, + { + "file_path": "samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 51, + "key_max": 53 + }, + { + "file_path": "samples/G3.mp3", + "root_key": 55, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 54, + "key_max": 56 + }, + { + "file_path": "samples/A#3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 57, + "key_max": 59 + }, + { + "file_path": "samples/C#4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 60, + "key_max": 62 + }, + { + "file_path": "samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 63, + "key_max": 65 + }, + { + "file_path": "samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 66, + "key_max": 68 + }, + { + "file_path": "samples/A#4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 69, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/woodwinds/bassoon/samples/A#1.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/A#1.mp3 new file mode 100644 index 0000000..7d4040d Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/A#1.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/A#2.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/A#2.mp3 new file mode 100644 index 0000000..9ec8815 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/A#2.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/A#3.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/A#3.mp3 new file mode 100644 index 0000000..c3e2384 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/A#3.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/A#4.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/A#4.mp3 new file mode 100644 index 0000000..e53060e Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/A#4.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/C#2.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/C#2.mp3 new file mode 100644 index 0000000..86a53f4 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/C#2.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/C#3.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/C#3.mp3 new file mode 100644 index 0000000..d5ae453 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/C#3.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/C#4.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/C#4.mp3 new file mode 100644 index 0000000..cad2932 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/C#4.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/E2.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/E2.mp3 new file mode 100644 index 0000000..f92a981 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/E2.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/E3.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/E3.mp3 new file mode 100644 index 0000000..97e669d Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/E3.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/E4.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/E4.mp3 new file mode 100644 index 0000000..1d51892 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/E4.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/G2.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/G2.mp3 new file mode 100644 index 0000000..284f38d Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/G2.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/G3.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/G3.mp3 new file mode 100644 index 0000000..9234613 Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/G3.mp3 differ diff --git a/src/assets/instruments/woodwinds/bassoon/samples/G4.mp3 b/src/assets/instruments/woodwinds/bassoon/samples/G4.mp3 new file mode 100644 index 0000000..afd285f Binary files /dev/null and b/src/assets/instruments/woodwinds/bassoon/samples/G4.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/clarinet.json b/src/assets/instruments/woodwinds/clarinet/clarinet.json new file mode 100644 index 0000000..ae3455c --- /dev/null +++ b/src/assets/instruments/woodwinds/clarinet/clarinet.json @@ -0,0 +1,173 @@ +{ + "metadata": { + "name": "Clarinet", + "description": "Orchestral clarinet section", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "woodwinds", + "clarinet", + "section", + "orchestral" + ] + }, + "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": "Clarinet Sampler", + "parameters": { + "0": 1.0, + "1": 0.02, + "2": 0.25, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/D3.mp3", + "root_key": 50, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 52 + }, + { + "file_path": "samples/Gb3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 53, + "key_max": 56 + }, + { + "file_path": "samples/Bb3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 57, + "key_max": 60 + }, + { + "file_path": "samples/D4.mp3", + "root_key": 62, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 61, + "key_max": 64 + }, + { + "file_path": "samples/Gb4.mp3", + "root_key": 66, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 65, + "key_max": 68 + }, + { + "file_path": "samples/Bb4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 69, + "key_max": 72 + }, + { + "file_path": "samples/D5.mp3", + "root_key": 74, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 73, + "key_max": 76 + }, + { + "file_path": "samples/Gb5.mp3", + "root_key": 78, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 77, + "key_max": 80 + }, + { + "file_path": "samples/Bb5.mp3", + "root_key": 82, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 81, + "key_max": 84 + }, + { + "file_path": "samples/D6.mp3", + "root_key": 86, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 85, + "key_max": 88 + }, + { + "file_path": "samples/Gb6.mp3", + "root_key": 90, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 89, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Bb3.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Bb3.mp3 new file mode 100644 index 0000000..8b1debc Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Bb3.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Bb4.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Bb4.mp3 new file mode 100644 index 0000000..55d665a Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Bb4.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Bb5.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Bb5.mp3 new file mode 100644 index 0000000..bbc1c8a Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Bb5.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/D3.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/D3.mp3 new file mode 100644 index 0000000..a1d02d0 Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/D3.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/D4.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/D4.mp3 new file mode 100644 index 0000000..158a2be Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/D4.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/D5.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/D5.mp3 new file mode 100644 index 0000000..60fd875 Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/D5.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/D6.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/D6.mp3 new file mode 100644 index 0000000..24b1ac0 Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/D6.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Gb3.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Gb3.mp3 new file mode 100644 index 0000000..0dccdaa Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Gb3.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Gb4.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Gb4.mp3 new file mode 100644 index 0000000..3e95c94 Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Gb4.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Gb5.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Gb5.mp3 new file mode 100644 index 0000000..7796180 Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Gb5.mp3 differ diff --git a/src/assets/instruments/woodwinds/clarinet/samples/Gb6.mp3 b/src/assets/instruments/woodwinds/clarinet/samples/Gb6.mp3 new file mode 100644 index 0000000..449b69b Binary files /dev/null and b/src/assets/instruments/woodwinds/clarinet/samples/Gb6.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/flute.json b/src/assets/instruments/woodwinds/flute/flute.json new file mode 100644 index 0000000..c66fe5e --- /dev/null +++ b/src/assets/instruments/woodwinds/flute/flute.json @@ -0,0 +1,164 @@ +{ + "metadata": { + "name": "Flute", + "description": "Orchestral flute section", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "woodwinds", + "flute", + "section", + "orchestral" + ] + }, + "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": "Flute Sampler", + "parameters": { + "0": 1.0, + "1": 0.03, + "2": 0.3, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/Db4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 63 + }, + { + "file_path": "samples/F4.mp3", + "root_key": 65, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 64, + "key_max": 66 + }, + { + "file_path": "samples/Ab4.mp3", + "root_key": 68, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 67, + "key_max": 69 + }, + { + "file_path": "samples/B4.mp3", + "root_key": 71, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 70, + "key_max": 72 + }, + { + "file_path": "samples/D5.mp3", + "root_key": 74, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 73, + "key_max": 75 + }, + { + "file_path": "samples/F5.mp3", + "root_key": 77, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 76, + "key_max": 78 + }, + { + "file_path": "samples/Ab5.mp3", + "root_key": 80, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 79, + "key_max": 82 + }, + { + "file_path": "samples/C6.mp3", + "root_key": 84, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 83, + "key_max": 85 + }, + { + "file_path": "samples/Eb6.mp3", + "root_key": 87, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 86, + "key_max": 89 + }, + { + "file_path": "samples/Ab6.mp3", + "root_key": 92, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 90, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/woodwinds/flute/samples/Ab4.mp3 b/src/assets/instruments/woodwinds/flute/samples/Ab4.mp3 new file mode 100644 index 0000000..33b9fa1 Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/Ab4.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/Ab5.mp3 b/src/assets/instruments/woodwinds/flute/samples/Ab5.mp3 new file mode 100644 index 0000000..f327cfd Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/Ab5.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/Ab6.mp3 b/src/assets/instruments/woodwinds/flute/samples/Ab6.mp3 new file mode 100644 index 0000000..e92c9d3 Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/Ab6.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/B4.mp3 b/src/assets/instruments/woodwinds/flute/samples/B4.mp3 new file mode 100644 index 0000000..18fa965 Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/B4.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/C6.mp3 b/src/assets/instruments/woodwinds/flute/samples/C6.mp3 new file mode 100644 index 0000000..d11252d Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/C6.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/D5.mp3 b/src/assets/instruments/woodwinds/flute/samples/D5.mp3 new file mode 100644 index 0000000..63af4a1 Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/D5.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/Db4.mp3 b/src/assets/instruments/woodwinds/flute/samples/Db4.mp3 new file mode 100644 index 0000000..f5b1f25 Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/Db4.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/Eb6.mp3 b/src/assets/instruments/woodwinds/flute/samples/Eb6.mp3 new file mode 100644 index 0000000..54ed8a3 Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/Eb6.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/F4.mp3 b/src/assets/instruments/woodwinds/flute/samples/F4.mp3 new file mode 100644 index 0000000..dff3b5b Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/F4.mp3 differ diff --git a/src/assets/instruments/woodwinds/flute/samples/F5.mp3 b/src/assets/instruments/woodwinds/flute/samples/F5.mp3 new file mode 100644 index 0000000..2a7ff3e Binary files /dev/null and b/src/assets/instruments/woodwinds/flute/samples/F5.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/oboe.json b/src/assets/instruments/woodwinds/oboe/oboe.json new file mode 100644 index 0000000..a58adb6 --- /dev/null +++ b/src/assets/instruments/woodwinds/oboe/oboe.json @@ -0,0 +1,155 @@ +{ + "metadata": { + "name": "Oboe", + "description": "Solo oboe", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "woodwinds", + "oboe", + "solo", + "orchestral" + ] + }, + "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": "Oboe Sampler", + "parameters": { + "0": 1.0, + "1": 0.02, + "2": 0.25, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "samples/A#3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 59 + }, + { + "file_path": "samples/C#4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 60, + "key_max": 62 + }, + { + "file_path": "samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 63, + "key_max": 65 + }, + { + "file_path": "samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 66, + "key_max": 68 + }, + { + "file_path": "samples/A#4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 69, + "key_max": 71 + }, + { + "file_path": "samples/C#5.mp3", + "root_key": 73, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 72, + "key_max": 76 + }, + { + "file_path": "samples/G5.mp3", + "root_key": 79, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 77, + "key_max": 80 + }, + { + "file_path": "samples/A#5.mp3", + "root_key": 82, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 81, + "key_max": 83 + }, + { + "file_path": "samples/C6.mp3", + "root_key": 84, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 84, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file diff --git a/src/assets/instruments/woodwinds/oboe/samples/A#3.mp3 b/src/assets/instruments/woodwinds/oboe/samples/A#3.mp3 new file mode 100644 index 0000000..793907d Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/A#3.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/A#4.mp3 b/src/assets/instruments/woodwinds/oboe/samples/A#4.mp3 new file mode 100644 index 0000000..ef938c7 Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/A#4.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/A#5.mp3 b/src/assets/instruments/woodwinds/oboe/samples/A#5.mp3 new file mode 100644 index 0000000..450afca Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/A#5.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/C#4.mp3 b/src/assets/instruments/woodwinds/oboe/samples/C#4.mp3 new file mode 100644 index 0000000..01ce2e8 Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/C#4.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/C#5.mp3 b/src/assets/instruments/woodwinds/oboe/samples/C#5.mp3 new file mode 100644 index 0000000..49b8cfc Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/C#5.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/C6.mp3 b/src/assets/instruments/woodwinds/oboe/samples/C6.mp3 new file mode 100644 index 0000000..0ba5c60 Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/C6.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/E4.mp3 b/src/assets/instruments/woodwinds/oboe/samples/E4.mp3 new file mode 100644 index 0000000..b39bf8f Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/E4.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/G4.mp3 b/src/assets/instruments/woodwinds/oboe/samples/G4.mp3 new file mode 100644 index 0000000..d7effc3 Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/G4.mp3 differ diff --git a/src/assets/instruments/woodwinds/oboe/samples/G5.mp3 b/src/assets/instruments/woodwinds/oboe/samples/G5.mp3 new file mode 100644 index 0000000..0065eae Binary files /dev/null and b/src/assets/instruments/woodwinds/oboe/samples/G5.mp3 differ diff --git a/src/assets/instruments/woodwinds/woodwinds-combined/woodwinds-combined.json b/src/assets/instruments/woodwinds/woodwinds-combined/woodwinds-combined.json new file mode 100644 index 0000000..28b7133 --- /dev/null +++ b/src/assets/instruments/woodwinds/woodwinds-combined/woodwinds-combined.json @@ -0,0 +1,461 @@ +{ + "metadata": { + "name": "Woodwinds", + "description": "Full woodwind section \u2014 auto-selects bassoon, clarinet, oboe, or flute by pitch range", + "author": "Virtual Playing Orchestra 3", + "version": 1, + "tags": [ + "woodwinds", + "section", + "orchestral", + "combined" + ] + }, + "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": "Woodwinds Sampler", + "parameters": { + "0": 1.0, + "1": 0.03, + "2": 0.3, + "3": 0.0 + }, + "sample_data": { + "type": "multi_sampler", + "layers": [ + { + "file_path": "../bassoon/samples/A#1.mp3", + "root_key": 34, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 0, + "key_max": 35 + }, + { + "file_path": "../bassoon/samples/C#2.mp3", + "root_key": 37, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 36, + "key_max": 38 + }, + { + "file_path": "../bassoon/samples/E2.mp3", + "root_key": 40, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 39, + "key_max": 41 + }, + { + "file_path": "../bassoon/samples/G2.mp3", + "root_key": 43, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 42, + "key_max": 44 + }, + { + "file_path": "../bassoon/samples/A#2.mp3", + "root_key": 46, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 45, + "key_max": 47 + }, + { + "file_path": "../bassoon/samples/C#3.mp3", + "root_key": 49, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 48, + "key_max": 49 + }, + { + "file_path": "../clarinet/samples/D3.mp3", + "root_key": 50, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 50, + "key_max": 51 + }, + { + "file_path": "../bassoon/samples/E3.mp3", + "root_key": 52, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 52, + "key_max": 53 + }, + { + "file_path": "../clarinet/samples/Gb3.mp3", + "root_key": 54, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 54, + "key_max": 54 + }, + { + "file_path": "../bassoon/samples/G3.mp3", + "root_key": 55, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 55, + "key_max": 56 + }, + { + "file_path": "../bassoon/samples/A#3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 57, + "key_max": 58 + }, + { + "file_path": "../clarinet/samples/Bb3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 59, + "key_max": 58 + }, + { + "file_path": "../oboe/samples/A#3.mp3", + "root_key": 58, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 59, + "key_max": 59 + }, + { + "file_path": "../bassoon/samples/C#4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 60, + "key_max": 61 + }, + { + "file_path": "../oboe/samples/C#4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 62, + "key_max": 61 + }, + { + "file_path": "../flute/samples/Db4.mp3", + "root_key": 61, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 62, + "key_max": 61 + }, + { + "file_path": "../clarinet/samples/D4.mp3", + "root_key": 62, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 62, + "key_max": 63 + }, + { + "file_path": "../bassoon/samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 64, + "key_max": 64 + }, + { + "file_path": "../oboe/samples/E4.mp3", + "root_key": 64, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 65, + "key_max": 64 + }, + { + "file_path": "../flute/samples/F4.mp3", + "root_key": 65, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 65, + "key_max": 65 + }, + { + "file_path": "../clarinet/samples/Gb4.mp3", + "root_key": 66, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 66, + "key_max": 66 + }, + { + "file_path": "../bassoon/samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 67, + "key_max": 67 + }, + { + "file_path": "../oboe/samples/G4.mp3", + "root_key": 67, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 68, + "key_max": 67 + }, + { + "file_path": "../flute/samples/Ab4.mp3", + "root_key": 68, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 68, + "key_max": 69 + }, + { + "file_path": "../bassoon/samples/A#4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 70, + "key_max": 70 + }, + { + "file_path": "../clarinet/samples/Bb4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 71, + "key_max": 70 + }, + { + "file_path": "../oboe/samples/A#4.mp3", + "root_key": 70, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 71, + "key_max": 70 + }, + { + "file_path": "../flute/samples/B4.mp3", + "root_key": 71, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 71, + "key_max": 72 + }, + { + "file_path": "../oboe/samples/C#5.mp3", + "root_key": 73, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 73, + "key_max": 73 + }, + { + "file_path": "../clarinet/samples/D5.mp3", + "root_key": 74, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 74, + "key_max": 74 + }, + { + "file_path": "../flute/samples/D5.mp3", + "root_key": 74, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 75, + "key_max": 75 + }, + { + "file_path": "../flute/samples/F5.mp3", + "root_key": 77, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 76, + "key_max": 77 + }, + { + "file_path": "../clarinet/samples/Gb5.mp3", + "root_key": 78, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 78, + "key_max": 78 + }, + { + "file_path": "../oboe/samples/G5.mp3", + "root_key": 79, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 79, + "key_max": 79 + }, + { + "file_path": "../flute/samples/Ab5.mp3", + "root_key": 80, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 80, + "key_max": 81 + }, + { + "file_path": "../clarinet/samples/Bb5.mp3", + "root_key": 82, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 82, + "key_max": 82 + }, + { + "file_path": "../oboe/samples/A#5.mp3", + "root_key": 82, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 83, + "key_max": 83 + }, + { + "file_path": "../oboe/samples/C6.mp3", + "root_key": 84, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 84, + "key_max": 84 + }, + { + "file_path": "../flute/samples/C6.mp3", + "root_key": 84, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 85, + "key_max": 85 + }, + { + "file_path": "../clarinet/samples/D6.mp3", + "root_key": 86, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 86, + "key_max": 86 + }, + { + "file_path": "../flute/samples/Eb6.mp3", + "root_key": 87, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 87, + "key_max": 88 + }, + { + "file_path": "../clarinet/samples/Gb6.mp3", + "root_key": 90, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 89, + "key_max": 91 + }, + { + "file_path": "../flute/samples/Ab6.mp3", + "root_key": 92, + "velocity_min": 0, + "velocity_max": 127, + "loop_mode": "continuous", + "key_min": 92, + "key_max": 127 + } + ] + }, + "position": [ + 350.0, + 0.0 + ] + }, + { + "id": 2, + "node_type": "AudioOutput", + "name": "Out", + "parameters": {}, + "position": [ + 700.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 + } + ] +} \ No newline at end of file