# SELAH NOTE sound library Sampled instruments for the studio (작곡실), built by `scripts/build-sound-library.mjs` from two freely licensed sources. 337 instruments: 28 from VSCO 2 Community Edition (listed first, `featured`) and 309 from MuseScore General (every preset and drum kit it has). By category: piano 5, keys 7, organ 24, guitar 15, bass 10, strings 72, brass 27, woodwind 37, choir 6, pad 15, synth 33, mallet 14, ethnic 12, drums 51, sfx 9. Total size 121.7 MB: 64.6 MB MuseScore General audio, 53.3 MB VSCO audio, the rest JSON and text. ## Sources ### VSCO 2 Community Edition (CC0 1.0) - Versilian Studios LLC (Sam Gossner), https://versilian-studios.com/vsco-community/ - Repository https://github.com/sgossner/VSCO-2-CE, revision `440300901dfe9275fd84e0b7763af1f8443ae62e`; files fetched from `https://raw.githubusercontent.com/sgossner/VSCO-2-CE/440300901dfe9275fd84e0b7763af1f8443ae62e/` and checked against the git blob hashes of that revision. - 699 WAV files, 849.7 MB (every file, URL, size and SHA-256 in `SOURCES.json`). - Licence: CC0 1.0 (`licenses/vsco-2-ce-CC0.txt`); Versilian asks for credit to Versilian Studios / Sam Gossner and a link to the VSCO: CE page (`licenses/vsco-2-ce-README.txt`). ### MuseScore General 0.2 (MIT) - `https://ftp.osuosl.org/pub/musescore/soundfont/MuseScore_General/MuseScore_General.sf3`: 39900972 bytes, SHA-256 `5b85b6c2c61d10b2b91cddd41efcce7b25cd31c8271d511c73afafbef20b6fa3` (the SF3 edition: SoundFont 2 with Ogg Vorbis samples; the 215 MB SF2 was not used). - Also fetched from the same folder: `MuseScore_General_License.md`, `MuseScore_General_Readme.md`, `MuseScore_General_Sample_Sources.csv`, `MuseScore_General_Changelog.md`, `VERSION`. - FluidR3 (original version) by Frank Wen, copyright (c) 2000-02; mono conversion (FluidR3Mono) by Michael Cowgill, copyright (c) 2014-17; adaptation for MuseScore_General by S. Christian Collins, copyright (c) 2018-19; Temple Blocks instrument provided by Ethan Winer, copyright (c) 2002; Drumline Cymbals provided by Michael Schorsch, copyright (c) 2016. MIT licence. Its licence requires these acknowledgements and copyright notices in any derivative work: the licence and readme are copied verbatim in `licenses/MuseScore_General_License.md` and `licenses/MuseScore_General_Readme.md`, with the per-preset sample credits in `licenses/MuseScore_General_Sample_Sources.csv`. ## What was selected and changed ### VSCO | id | name | zones | audio | |---|---|---|---| | `vsco-violins` | 바이올린 섹션 / バイオリン・セクション | 22 | 2.7 MB | | `vsco-violins-pizz` | 바이올린 섹션 피치카토 / バイオリン・セクション(ピチカート) | 44 | 1.0 MB | | `vsco-violas` | 비올라 섹션 / ヴィオラ・セクション | 26 | 3.2 MB | | `vsco-violas-pizz` | 비올라 섹션 피치카토 / ヴィオラ・セクション(ピチカート) | 48 | 1.1 MB | | `vsco-cellos` | 첼로 섹션 / チェロ・セクション | 26 | 3.2 MB | | `vsco-cellos-pizz` | 첼로 섹션 피치카토 / チェロ・セクション(ピチカート) | 52 | 2.1 MB | | `vsco-violin` | 솔로 바이올린 / ソロ・バイオリン | 30 | 3.7 MB | | `vsco-violin-pizz` | 솔로 바이올린 피치카토 / ソロ・バイオリン(ピチカート) | 49 | 1.3 MB | | `vsco-contrabass` | 솔로 콘트라베이스 / ソロ・コントラバス | 26 | 3.2 MB | | `vsco-contrabass-pizz` | 콘트라베이스 피치카토 / コントラバス(ピチカート) | 56 | 1.9 MB | | `vsco-harp` | 콘서트 하프 / コンサート・ハープ | 23 | 2.2 MB | | `vsco-trumpet` | 트럼펫 / トランペット | 20 | 2.4 MB | | `vsco-trumpet-mute` | 트럼펫 (스트레이트 뮤트) / トランペット(ストレートミュート) | 16 | 1.9 MB | | `vsco-horn` | 호른 / ホルン | 22 | 2.2 MB | | `vsco-trombone` | 테너 트롬본 / テナー・トロンボーン | 22 | 2.4 MB | | `vsco-tuba` | 튜바 / チューバ | 18 | 1.4 MB | | `vsco-flute` | 플루트 / フルート | 10 | 1.1 MB | | `vsco-oboe` | 오보에 / オーボエ | 18 | 2.2 MB | | `vsco-clarinet` | 클라리넷 / クラリネット | 22 | 2.6 MB | | `vsco-bassoon` | 바순 / ファゴット | 26 | 3.0 MB | | `vsco-piccolo` | 피콜로 / ピッコロ | 5 | 0.6 MB | | `vsco-glockenspiel` | 글로켄슈필 / グロッケンシュピール | 6 | 0.4 MB | | `vsco-xylophone` | 실로폰 / シロフォン | 8 | 0.2 MB | | `vsco-marimba` | 마림바 / マリンバ | 10 | 0.5 MB | | `vsco-tubular-bells` | 튜블러 벨 / チューブラーベル | 4 | 0.6 MB | | `vsco-timpani` | 팀파니 / ティンパニ | 20 | 1.5 MB | | `vsco-orchestra-kit` | 오케스트라 타악기 / オーケストラ打楽器 | 146 | 5.2 MB | | `vsco-fx` | 오케스트라 효과음 / オーケストラ効果音 | 29 | 2.0 MB | - Selection: section violins (susVib, Pizz), violas (susvib, pizz), cellos (susvib, pizzT), solo violin (Arco Vib, Pizz), solo contrabass (SusVib, Pizz), harp; trumpet (sus, straight-mute sus), F horn, tenor trombone and tuba (sus); flute (susvib), oboe (Vib), clarinet (susLong), bassoon (sus), piccolo (Sus); glockenspiel, xylophone, marimba, tubular bells, timpani hits; and orchestral one-shots from `Percussion/`: `bass-drum` BDrumNewhit_v2_rr1_Sum.wav, BDrumNewhit_v2_rr2_Sum.wav, BDrumNewhit_v4_rr1_Sum.wav, BDrumNewhit_v4_rr2_Sum.wav, BDrumNewhit_v7_rr1_Sum.wav, BDrumNewhit_v7_rr2_Sum.wav; `snare` Snare2-HitSN_v3_rr1_Sum.wav, Snare2-HitSN_v3_rr2_Sum.wav, Snare2-HitSN_v5_rr1_Sum.wav, Snare2-HitSN_v5_rr2_Sum.wav, Snare2-HitSN_v9_rr1_Sum.wav, Snare2-HitSN_v9_rr2_Sum.wav; `snare-off` Snare2-HitNS_v3_rr1_Sum.wav, Snare2-HitNS_v3_rr2_Sum.wav, Snare2-HitNS_v6_rr1_Sum.wav, Snare2-HitNS_v6_rr2_Sum.wav; `crash` cymbal-crash1_pp_rr1.wav, cymbal-crash1_mf_rr1.wav, cymbal-crash1_ff_rr1.wav; `splash` cymbal-crashshort_v1.wav; `cymbal-mallet` susCymb1-hit_mp_rr1.wav, susCymb1-hit_f_rr1.wav; `ride` susCymb1-hitstick_mp_rr1.wav, susCymb1-hitstick_f_rr1.wav; `ride-bell` susCymb1-hit-bell_mf.wav, susCymb1-hit-bell_fff.wav; `tambourine` Tamb1-Hit_v1_rr1_Sum.wav, Tamb1-Hit_v1_rr2_Sum.wav, Tamb1-Hit_v2_rr1_Sum.wav, Tamb1-Hit_v2_rr2_Sum.wav; `shaker` Tamb1-Shake_v1_rr1_Sum.wav, Tamb1-Shake_v1_rr2_Sum.wav; `cowbell` Cowbell1_Hit_v2_rr1_Sum.wav, Cowbell1_Hit_v2_rr2_Sum.wav, Cowbell1_Hit_v4_rr1_Sum.wav, Cowbell1_Hit_v4_rr2_Sum.wav; `vibra-ring` vibraring_v1_rr1.wav, vibraring_v1_rr2.wav; `quinto` Quinto-HitN_v1_rr1_Sum.wav, Quinto-HitN_v1_rr2_Sum.wav, Quinto-HitN_v3_rr1_Sum.wav, Quinto-HitN_v3_rr2_Sum.wav; `conga-mute` Conga-Tap1_v1_rr1_Sum.wav, Conga-Tap1_v1_rr2_Sum.wav; `conga` Conga-HitN_v1_rr1_Sum.wav, Conga-HitN_v1_rr2_Sum.wav, Conga-HitN_v3_rr1_Sum.wav, Conga-HitN_v3_rr2_Sum.wav; `tumba` Tumba-HitN_v1_rr1_Sum.wav, Tumba-HitN_v1_rr2_Sum.wav, Tumba-HitN_v3_rr1_Sum.wav, Tumba-HitN_v3_rr2_Sum.wav; `guiro-short` Guiro-Hit_v1_rr1_Sum.wav, Guiro-Hit_v1_rr2_Sum.wav; `guiro-long` Guiro-Slow_v1_Sum.wav; `claves` Claves1_Hit_v1_rr1_Sum.wav, Claves1_Hit_v1_rr2_Sum.wav, Claves1_Hit_v3_rr1_Sum.wav, Claves1_Hit_v3_rr2_Sum.wav; `log-high` LogDrumHi_MedM_v1_rr1_Sum.wav, LogDrumHi_MedM_v1_rr2_Sum.wav, LogDrumHi_MedM_v3_rr1_Sum.wav, LogDrumHi_MedM_v3_rr2_Sum.wav; `log-low` LogDrumLo_MedM_v1_rr1_Sum.wav, LogDrumLo_MedM_v1_rr2_Sum.wav, LogDrumLo_MedM_v3_rr1_Sum.wav, LogDrumLo_MedM_v3_rr2_Sum.wav; `triangle-mute` Triangle6-HitM_v1_rr1_Sum.wav, Triangle6-HitM_v1_rr2_Sum.wav, Triangle6-HitM_v2_rr1_Sum.wav, Triangle6-HitM_v2_rr2_Sum.wav; `triangle` Triangle6-Hit_v1_rr1_Sum.wav, Triangle6-Hit_v1_rr2_Sum.wav, Triangle6-Hit_v2_rr1_Sum.wav, Triangle6-Hit_v2_rr2_Sum.wav; `sleigh-bells` Sleighbells_Hit_v1_rr1_Mid.wav, Sleighbells_Hit_v1_rr2_Mid.wav; `bell-tree` BellTree_Stroke1_v1_Sum.wav, BellTree_Stroke3_v1_Sum.wav; `gong` gongHit_p.wav, gongHit_f.wav; `anvil` Anvil_Hit1_v1_Sum.wav, Anvil_Hit1_v3_Sum.wav; `brake-drum` BrakeDrum1_Hammer_v1_Sum.wav, BrakeDrum1_Hammer_v3_Sum.wav; `ratchet` Ratchet1-Crank_v1_rr1_Sum.wav, Ratchet1-Crank_v1_rr2_Sum.wav; `ratchet-roll` Ratchet1-Fast_v1_rr1_Sum.wav; `cymbal-swell` susCymb1-cresc-Short_v1.wav; `gong-scrape` gongscrape_mf.wav; `drum-rub` bassdrum_rub1_v1.wav; `alien-1` alien1_pp.wav, alien1_ff.wav; `alien-2` alien2_f.wav; `alien-3` alien3_f.wav; `zap-1` zap1_v1.wav; `zap-2` zap2_v1.wav; `zap-3` zap3_v1.wav; `zap-4` zap4_v1.wav. Of the dynamics recorded for a note only the softest and the loudest are kept (two velocity layers, 0-79 and 80-127); alternate takes (`_2`) are left out; round robins are kept where listed. - Each file is decoded at 44.1 kHz, the silence before the note is cut (5 ms kept), and it is encoded as MP3 (stereo 160 kbps where the recording is meaningfully stereo, i.e. the side signal is within 14 dB of the mid; otherwise mono 128 kbps). - Held notes get a seamless loop: up to 2.2 s ending before the player releases (at most 6 s into the note); the loop length is matched to whole periods of the note, its last part (0.25 s, or a third of a short loop) is crossfaded into the stretch before the loop start (equal power, or equal gain when the two are well correlated), and the last 2048 samples before and after the loop end are exact copies of those around the loop start, so the loop stays seamless even when an MP3 decoder shifts the file by up to 2048 samples. The recording after the loop is dropped (the player's release fades the note). - Struck and plucked notes end where they have fallen 60 dB (with at most a few seconds kept, then faded). - Pitch: every melodic file is measured (YIN). VSCO names notes with two octave conventions; the convention of each instrument is taken from the measurements (vsco-violins +12, vsco-violins-pizz +12, vsco-violas +12, vsco-violas-pizz +12, vsco-cellos +12, vsco-cellos-pizz +12, vsco-contrabass +12, vsco-contrabass-pizz +12, vsco-trumpet +12, vsco-trumpet-mute +12, vsco-horn +12, vsco-trombone +12, vsco-tuba +12, vsco-flute +12, vsco-oboe +12, vsco-clarinet +12, vsco-bassoon +12, vsco-piccolo +12, vsco-glockenspiel +12, vsco-xylophone +12, vsco-marimba +12), and `tune` corrects each file to equal temperament at A = 440 Hz (measured again within ±1.6 semitones of the named note, so harmonics and subharmonics cannot be mistaken for it; a file that sounds a semitone away from its name is mapped to the note it sounds). Timpani are tuned to their principal tone (the (1,1) mode, found in the spectrum with its partners near 1.5x and 2x; each drum keeps one tuning), tubular bells by their file names (their strike tone is not a periodic pitch). Notes on individual files: contrabass-pizz Strings/Solo Contrabass/Pizz/BKCtbss_Pizz_E1_v1_rr1.wav: no clear pitch near e2 (aperiodicity 0.30), tuned by name; clarinet Woodwinds/Clarinet/susLong/DCClar_susLong_F#5_v1_rr1_sum.wav: sounds f6 (1397.06 Hz, -100 cents from the named fs6), mapped as f6; clarinet Woodwinds/Clarinet/susLong/DCClar_susLong_F#5_v3_rr1_sum.wav: sounds f6 (1394.96 Hz, -102 cents from the named fs6), mapped as f6. - Levels: within an instrument the loud layer of every note is evened to the instrument's median (at most 6 dB, the same correction for the note's soft layer, so the layers keep their natural difference), in zone `gainDb`. - Kits: `vsco-orchestra-kit` maps the pieces to General MIDI drum notes (bass drum 35/36, snare 38, snare without snares 40, crash 49, ride 51, ride bell 53, tambourine 54, short crash 55, cowbell 56, mallet cymbal 57, vibraslap 58, quinto 60, congas 62-64, guiro 73/74, claves 75, log drums 76/77, triangles 80/81, shaker 82, sleigh bells 83, bell tree 84), timpani on 41-53 (GS orchestra kit layout), and gong, anvil, brake drum, ratchet and cymbal swell on 88-92. `vsco-fx` puts the effects from C4 (60) up. Both carry `keyNames` in Korean and Japanese. ### MuseScore General - Every preset (309: banks 0, 1, 8, 16, the expression banks 17/18/21/26/31/41/51, the string section banks 20/25/30/40/50, and the drum kits in bank 128) becomes one instrument: `msg--`, kits `msg-kit-`. - The SoundFont is resolved the way a SoundFont 2.01 player does: preset and instrument global zones, key and velocity ranges (intersected), instrument generators absolute and preset generators added, overridingRootKey, coarse and fine tune with the sample's pitch correction, scaleTuning, sampleModes 1 and 3 (both play as a held loop), the address offsets, pan, exclusiveClass, initialAttenuation (scaled by 0.4, as FluidSynth and the E-mu hardware the SoundFont was voiced on do) and the volume envelope (keynum-to-hold/decay taken at the zone's root key). - Modulators that set level, envelope times, tuning or pan (including the default velocity-to-attenuation one, and the key-scaling and velocity-dependent attack/release ones MuseScore General uses) are evaluated once, at velocity 100 and the zone's root key with the breath controller (which the "Expr." presets follow) at 100, and folded into `gainDb`, `eg`, `tune` and `pan`; the player's own velocity curve then does the dynamics. - Not carried over: filters, LFOs (vibrato), the modulation envelope and the volume envelope's delay. MuseScore General opens most of its low-pass filters with velocity and the modulation envelope, so a static filter would be wrong; 5725 zones in 174 presets have one, and those presets (synth leads and pads especially, the piano at low velocities) sound brighter here than in MuseScore. - 1246 of 1246 samples are used. Each Ogg Vorbis stream is decoded once with ffmpeg, taking the decoder's raw output and cutting it the Vorbis way (first packet dropped, end at the last page's granule position): ffmpeg's own trimming is wrong for streams whose only audio page is the last page (188 short samples here; one decoded to nothing), and for every other stream the result equals ffmpeg's output sample for sample. Each sample is stored once as `msg/sNNNN.mp3` (mono 128 kbps, resampled to 44.1 kHz with SoX's resampler) and shared by every preset; 71 more files (`msg/sNNNN-1.mp3`) exist where a sample is played both looped and unlooped or with other address offsets. - Loops are unrolled: the original loop is repeated so the file has at least 0.5 s of loop after the attack; the new loop starts whole loop lengths (at least 2048 output samples) after the original start, lasts a whole number of original loops (at least 0.25 s; for other sample rates the count closest to a whole number of 44.1 kHz samples within 1.5x), and the file goes on at least 2048 samples past the loop end. Loop points are in seconds. - Drum kits (and the few zones whose scaleTuning is not 100) are expanded to one fixed-pitch zone per key, the key's pitch offset in `tune`. - Sample levels are unchanged except where a sample peaked above 0.95 (scaled down, compensated in `gainDb`). ### Calibration Every instrument's `gainDb` brings a velocity-100 note in its middle register to the same loudness (-24.08 dB K-weighted, loudest 400 ms), bounded to ±12 dB; see `calibration.json`. Spread before: 29.65 dB (10th-90th percentile -25.63 to -13.65); after: 5.65 dB (-24.08 to -24.08). 15 instruments needed more than 12 dB (vsco-glockenspiel, msg-0-97, msg-0-87, msg-8-31, msg-8-30, msg-8-26, msg-0-115, msg-0-84, msg-kit-56, msg-kit-57, msg-0-57, msg-17-57, msg-17-84, msg-17-87, msg-17-97); they stay within 5.7 dB of the target. Short struck sounds (mallets, plucks, kits) read low on a 400 ms loudness measure, so they are the ones boosted most. With all gains the highest sample peak of an instrument is at most 9 dBFS (median -14.1), before the velocity curve: the player needs that much headroom or a limiter. ## Pruned list After the build, `node scripts/prune-sound-library.mjs` takes out the "expression" banks (the same sound here), exact copies of other presets and the four GM acoustic pianos (23 MB; the site's own piano plays those programs). General MIDI programs that copy another stay, marked `hide`, for MIDI files. ## Format - `index.json`: `{"version":1,"instruments":[{id,label,labelJa,cat,sub,subJa,source,kind,featured,bytes,range,program?,bank?}]}`. `bytes` is the sum of the distinct MP3 files the instrument uses; `program` is the General MIDI program (for a kit, the GS kit number), `bank` the MuseScore General bank. - `.json`: `{id,kind,gainDb,attack,release,poly,mono,keyNames?,zones:[...]}`. A zone: `file` (under `/audio/lib/`), `root` (MIDI key of the recording), `tune` (cents), `lo..hi` keys, `vlo..vhi` velocities, `rr` (round robin, from 1), `loop` (`[startSeconds,endSeconds]` or null), `gainDb`, `pan` (-1..1), `eg`, `excl` (exclusive class; a new note stops sounding notes of the same class in the instrument), `fixed`, `dur` (decoded length in seconds). Kits from VSCO also have `keyNames` (`{"36":{"label":"...","labelJa":"..."}}`). - Pitch: playback rate = 2^(((fixed ? 0 : key - root) * 100 + tune) / 1200). - Level: instrument `gainDb` + zone `gainDb`, then the velocity curve. - `eg`: `a` attack seconds (linear), `h` hold seconds, `d` seconds to fall from full level to `s` (linear in dB; when `s` is 0 the level reaches -100 dB at `d`), `s` sustain level 0-1, `r` seconds for a 100 dB fall after release (linear in dB). ## Licences of this library The MP3 files and JSON here are derivative works of the sources above and keep their licences: the VSCO files CC0 1.0, the MuseScore General files MIT (with the notices in `licenses/`). ## Attribution text for the licence page 한국어: > 작곡실의 악기 소리 가운데 일부는 Versilian Studios(Sam Gossner)의 VSCO 2 Community Edition(CC0 1.0, https://versilian-studios.com/vsco-community/) 녹음을 바탕으로 만들었습니다. 또한 MuseScore General 사운드폰트(MIT 라이선스)를 사용했습니다: FluidR3 (original version) by Frank Wen Copyright (c) 2000-02; Mono conversion (FluidR3Mono) by Michael Cowgill Copyright (c) 2014-17; Adaptation for MuseScore_General.sf2 by S. Christian Collins Copyright (c) 2018-19; Temple Blocks instrument provided by Ethan Winer Copyright (c) 2002; Drumline Cymbals provided by Michael Schorsch Copyright (c) 2016. 원본 라이선스 전문은 /audio/lib/licenses/ 에 있습니다. 日本語: > 作曲室の楽器音の一部は、Versilian Studios(Sam Gossner)の VSCO 2 Community Edition(CC0 1.0、https://versilian-studios.com/vsco-community/)の録音をもとに作成しています。また、MuseScore General サウンドフォント(MITライセンス)を使用しています: FluidR3 (original version) by Frank Wen Copyright (c) 2000-02; Mono conversion (FluidR3Mono) by Michael Cowgill Copyright (c) 2014-17; Adaptation for MuseScore_General.sf2 by S. Christian Collins Copyright (c) 2018-19; Temple Blocks instrument provided by Ethan Winer Copyright (c) 2002; Drumline Cymbals provided by Michael Schorsch Copyright (c) 2016. ライセンスの全文は /audio/lib/licenses/ にあります。