ling-station
↓ 0 downloadsLingStationX: a DAW in Ling with a piano roll, arranger, performance view, theory-aware score fixing, Qwen instrument choice, Prism / Growl / Synth X / Membrane instruments and Ling-design-system effect windows
lingfu install ling-stationREADME
LingStationX
A digital audio workstation written in Ling — the arranger, piano roll, mixer, node editor, performance launcher, file browser, dialogs and every instrument are .ling programs. It is a port of LingStation (same layout, same ROYGBIV palette, same panels) that swaps the egui/VST host for Ling's own runtime and audio crates.
LingStationX/
ling/ the application (main.ling + modules) <- the DAW itself
instruments/ instrument "plugins": plain .ling patch files <- edit / write your own
assets/ font, project templates (Ambient Pads, EDM Starter, Hip Hop)
tools/ patch/template generators, screenshot test harness
docs/ DEV_NOTES.md (language gotchas, API, testing)The audio engine is the native ling-daw crate in the Ling repo (../ling/crates/ling-daw), exposed to scripts as daw_* builtins; a handful of px_* / st_* / fs_* / dlg_* builtins give the UI fast pixel drawing, a shared state store, file browsing and native dialogs.
Build & run
Needs a checkout of the Ling repo next to this folder (../ling, branch lingstationx) and Rust.
cd ..\ling
cargo build --release --bin ling # once (add --bin ling only; ~10 min)
cd ..\LingStationX
.\run.bat # or: ../ling/target/release/ling run --interp ling/main.lingrun.bat prefers the release build and falls back to the debug build.
Distributables
tools/build.py builds every edition from one command (python tools/build.py --help lists the options):
python tools/build.py win # Windows x64 portable folder + zip (add --installer for the Inno Setup installer)
python tools/build.py lin # Linux x86_64 folder + tar.gz (native on Linux; in Docker on Windows / macOS)
python tools/build.py mac # macOS .app + zip (on a Mac)
python tools/build.py web # WebAssembly bundle in dist/web
python tools/build.py lingos-x86 # LingOS x86_64 live ISO with LingStationX in the desktop (needs ../LingOS)
python tools/build.py lingos-pi5 # LingOS for the Raspberry Pi 5: kernel8.img + FAT32 boot image (needs ../LingOS)
python tools/build.py all # everything this machine can buildThe desktop editions are a native launcher (ling build --platform ...) that runs ling/main.ling on the interpreter from the folder it sits in; --features llm (the default) bakes the in-process Qwen helper into it, --features none is the quick build. The LingOS editions are built by LingOS's own kernels (kernel/x86_64-wm, kernel/rpi-lingstation), which compile this checkout into the image as a built-in app, and packaged with its live/ scripts (in a WSL distro that has grub-mkrescue / mtools, natively on Linux, or in tools/docker/lingos-pack.Dockerfile). The web bundle builds, but the wasm runtime has no DAW engine yet, so it is the UI program only. .github/workflows/build.yml runs the same script on Windows, Linux and macOS runners.
What is in it
- Arranger — timeline with ruler, loop region, tracks, clips (MIDI note previews, audio waveforms), Draw / Select (marquee) / Move / Slice tools, grid snap, zoom, copy-drag, drag files in from the sidebar, expandable automation lanes (level, pan, any instrument/effect parameter) with point editing and automation recording.
- Piano roll & Parameters — draw/select/move/resize notes, snap and note-length, velocity / pan / cutoff / resonance lanes per note, quantize / humanize / transpose; the Parameters tab adds the instrument's knobs, presets, patch load/save and (for drums) a 4x4 pad grid.
- Instruments — Ling Synth X (subtractive + additive + FM in one voice), Ling Membrane (physical-modeling drums), Ling Growl (monophonic dubstep / electro bass and lead: wavetable stack, FM, vowel filter, four drawable 16-point modulation lanes and a 7x10 mod matrix, 8 presets in
instruments/Growl/) and Ling Voice (a formant singer driven by IPA lyrics, 7 singers ininstruments/Voice/). Patches are text files ininstruments/. The instrument panels are drawn in the Ling design system (outline + crosshatch, tile lettering, ROYGBIV meanings;ling/ds.ling). - Ling Prism - a 16-voice analog-style synth for big electronic sounds (
ling-daw/src/dsp/prism.rs): two morphing wavetable oscillators (sine / tri / saw / square / pulse / organ / bell / spectral) with 1-7 unison voices and phase warp, six ways for A and B to interact (add, ring, phase-mod, hard sync, xor, min), sub, noise, an analog hum drone and voice drift, a stereo multimode filter plus a note-tuned comb, eight multi-point envelopes (draw / drag / add / remove breakpoints) and two LFOs that reach 20 destinations through a 13 x 20 modulation matrix, and a harmonizer, phaser, ensemble chorus, ping-pong delay and reverb. Microtonal: 19 / 22 / 24 / 31 / 17 / 53 EDO, just intonation, Pythagorean, meantone, Bohlen-Pierce, slendro, pelog, harmonic series, whole tone, octave stretch, or twelve hand-tuned notes. The dice randomize the sound, the modulation, the effects or all of it, and mut wanders away from the current patch. 281 presets ininstruments/Prism/(trance, deep house, disco, witch house, hyperpop, microtonal, ambient, plus a bank of sounds named after and imitating FL Studio's Sytrus and Harmor factory presets - pads, hoovers, donk and wobble basses, arps, keys, bells, kicks, FX) fromtools/gen_prism.pyandtools/gen_prism_fl.py. - Electronic GM -
instruments/Electronic GM/is a second 128-patch General MIDI bank (e-pianos, house organs, acid / sub / wobble / reese / neuro basses, supersaw pads and strings, stabs, sync / laser / vowel leads, risers and FX).tools/gen_gm_electronic.py+cargo run --release -p ling-daw --example gm_electronic. - Sidechain duck - Edit > Sidechain Duck... (or the Duck button in the arranger toolbar): pick a track, say the drum kit, choose what triggers it (the kick only, the snare, every hit...) and the tracks that should get out of its way. Each gets a Ducker effect (depth, attack, hold, release, curve; the dip is drawn as you set it) triggered from the kick's notes, so only the kick ducks, it is exact to the sample, and it works even with the drums muted. Ducks show in the Node Editor and the effect list.
- Tracker import - File > Import MIDI / FL Studio / Tracker... reads ProTracker
.mod, ScreamTracker.s3m, FastTracker.xm, Impulse Tracker.itand OpenMPT.mptmmodules (compressed IT samples too;.mo3is not supported - save as.it/.xmin OpenMPT). Every module instrument becomes a track playing the module's real samples (written as a SoundFont with loops, panning, fine tune and fade-out), the patterns are played through in song order (jumps and breaks followed) into notes with their volumes, pans, lengths and note cuts, and speed/tempo changes become the tempo map. Vibrato, slides, arpeggios and sample offsets are not modelled. - Vocal editor (Piano Roll on an audio clip, or Edit > Edit Vocal) - like Melodyne: Analyze finds the sung notes and shows them as blobs on the pitch grid (shape = loudness, line = the pitch as sung). Drag a note up / down for pitch (semitones, Alt = free), sideways to move it (grid snap, Alt = free), its edges to stretch it (time-slice stretch: the breaths and consonants around it stretch along); double-click puts its centre on the nearest note; Split / Drift / Gain tools; Up / Down, Delete (mute), Ctrl+A, box select. The panel corrects pitch to a scale (centre and drift amounts, five temperaments), quantizes timing, aligns pitch and timing to a guide (a MIDI part, or another edited vocal to tighten a double), adds vibrato, merges / resets notes and writes them out as MIDI. Every edit re-renders the clip with pitch-synchronous resynthesis (formants kept); the recording is kept, so Compare plays the original. It replaces Vocal to MIDI, the Vocal Tuner and Tune to the score.
- Ling Membrane drums - 28 knobs per piece and a kit bus. Character: sub (a sine at the fundamental that follows the pitch drop), snap (a tonal chirp on the attack), ring (ring-modulated clang), fold (wavefolder), vary (every hit a little different). Kit bus, the same on every piece: duck (the kick pumps the rest of the kit), room (one shared room), glue (bus compression), smash (parallel compression), tape (saturation with a soft top), boom and air (low / high shelves). 20 kits in
instruments/Kit_*.ling(new: Trap, Techno Hard, Drum and Bass, Boom Bap, Industrial, UK Garage, Stadium Rock, Brushes, Afro Percussion, Hyperpop, Dembow, Dub), written bytools/gen_kits.py. - FL Studio automation on import - automation clips come in with the project: each one is mapped onto the parameter it moves (the clip's FL name, "SubSynth - Filter Cutoff", picks the part and the knob: cutoff, resonance, envelope, drive, chorus, delay, reverb, LFO, volume, pan, pitch ...), kept as a lane you point at a parameter later, or skipped - for all clips or one by one in the import dialog. An unmapped lane shows "FL: <name>" in the Automation lanes; click its name to choose what it moves (any lane can be re-pointed the same way).
- New AI Track (File menu) - a whole song from a description, lyrics and an optional reference song. Describe it ("uplifting trance at 138 bpm in F# minor over i VI III VII, female vocal, intro verse chorus ..."), paste lyrics ([Verse] / [Chorus] labels or stanzas), and optionally pick a reference WAV / MP3: its tempo, key, chord loop and form (from its energy, bar by bar) are borrowed and its sound guides the mix. Qwen can fill in what the description leaves open. Plan shows everything as one editable line (genre, bpm, key, chords, structure, instruments, voice, seed); Generate builds it: instruments chosen for one of 27 genres (Prism / Growl / Synth / GM patches, a Membrane kit), a phrase per section for every part (repeated sections repeat, drums fill into the next section, parts enter as the energy rises), a Ling Voice singing the lyrics, filter sweeps through the builds and sidechain-style pumping in club drops, articulation on the bass and lead, section tags on the ruler; then Mix AI levels, pans and masters it to the genre's loudness, and Voice Skin can have an RVC model sing the vocal. Qwen proposes verse and chorus chords, which are checked against the key (out-of-key chords that are not a usual borrowing are corrected). The lead and the singer develop one motif through the song (quoted in the chorus, inverted in the bridge, varied when a verse returns, lifted in the last chorus); the bass locks to the kick; the whole band shares one human feel (
human=in the plan line, 0 = on the grid); the arrangement changes section by section (a small intro, a part dropping out in the bridge, a fuller second verse, everything in the last chorus). LENGTH: Short / Normal / Long, Fit lyrics (each sung section as long as its words need, about 2.2 syllables a second with room to hold notes), Fit MIDI (the guide MIDI's form, bars and tempo) or a Duration (m:ss); the sung line is shaped to the words: one note per syllable (two only on a long note when a line has no room left), nothing shorter than a sixteenth, the last word of every line held with a breath before the next line - the same SING mode Generate Vocal Track uses by default. Same description + seed = same song.- Guide MIDI + Follow it: give it a MIDI file and a slider. The song takes the file's tempo, key, chord loop and form (energy per bar) - the description still wins - and the slider says how much of the file's NOTES it keeps: 0 ignores the file, low borrows only tempo/key/chords/form, in the middle that share of the bars play the file's notes (in the song's key and each part's register, picked the same way for one seed) and the rest is written new over the same chords, 100 plays the file's notes everywhere in new instruments. Instruments the file has and the genre lacks (a bass line, a melody) are added once the slider passes 40 %.
- Instruments are measured, not assumed (ling-daw/src/soundcat.rs): every synth patch is played offline (a handful of notes: pitch against twelve-tone equal temperament, partials off the harmonic series, attack, sustain, brightness, low end; results cached in cache/soundcat.tsv). Patches that play out of tune or clash (19-EDO / slendro / Bohlen-Pierce / shruti / quarter-tone patches, stretched-partial bells, a tape-wobble pad...) are never picked for a song or an import - the role tables are filtered by what was measured. Qwen is told what each plugin is for (Prism, Growl, Synth X, Pluck, Voice, Membrane, SoundFont) and, for every role, the instrument that will play it in the song's genre with how it measured (in tune, soft attack, sustained, warm ...), in the import chooser and the song planner alike.
- Export Tracker (File menu) - tick MOD, S3M, XM, IT, MPTM and/or PDF. The plugins are sampled from the project: several pitches per instrument where the format keymaps instruments (XM, IT, MPTM), one sample where it cannot (MOD, S3M), a sample per drum for kits, loops on whole periods of sustained sounds (IT keeps the release after a sustain loop). Audio tracks are cut into tempo-tagged segments ("Vox 128bpm 03") triggered on their rows, so they stay in time through tempo changes. Tempo changes become tempo commands; when a format runs out of samples or channels the result says what was simplified.
- Register (Help > Register LingStationX) - nothing is locked. Open (or paste) the license file from your account or download page on studio.linglin.art: a LingStationX Lifetime License, or a Studio subscription while it runs. The file is checked on this computer (two signatures, ML-DSA-87 and Ed25519, nothing is sent anywhere); a registered copy shows your name in the title bar and About, and can set a wallpaper behind the editors (choose an image, set its strength).
- Save to Cloud (File menu) - uploads the saved project folder to studio.linglin.art with its details filled in from the project (title, artist, genre, tags, a description from the tempo / key / instruments or File > Metadata, the lyrics typed on the clips) for you to edit first, as private / unlisted / public. Sign in once with your username or e-mail and password (only the account's API token is kept), or paste the API token from your Account page. Later saves add a new version to the same project. Uploading needs a Studio subscription.
- Text size - A- / A+ at the top right (click the % to reset), Ctrl+Shift+= / Ctrl+Shift+-, Ctrl+0, or Settings > General.
- Voice Skin (RVC) (Edit menu, the vocal editor, or "Sing with an RVC voice..." on a Ling Voice part) - sings a vocal with an RVC voice model. The NATIVE engine (default) runs RVC inside LingStation (HuBERT, the voice model and its vocoder on the GPU with CUDA, or the CPU) with no Python: it only needs
hubert_base.ptinmodels/rvcor the RVC folder. The PYTHON engine uses an RVC WebUI install on this machine (RVC folder in the dialog, defaultE:/SannyChat/talk) and adds RMVPE pitch, the .index accent and breath protection. An audio clip is converted in place (Restore brings the recording back); a Ling Voice part - lyrics fitted to a MIDI clip - is rendered alone and sung by the model on a new audio track, which turns pasted lyrics + a melody into a real voice. Voices:models/rvc/(Name.pth + its .index, or a folder per voice) and the install'sweights/withlogs/<Name>/*.index. Pitch shift, pitch tracking (RMVPE needsrmvpe.ptin the RVC folder, else harvest), index amount, breath protection, loudness, GPU. Runs in the background; the Python engine is driven bytools/rvc_skin.py. Generate Vocal Track (Edit menu) turns a MIDI melody + pasted lyrics into a Ling Voice take for one of 16 voice types (pop / jazzy smoky / breathy / R&B / opera female, choir soprano / alto / tenor / bass, pop / soul / rock / crooner / opera male, whisper, robot) with knobs for gender, tone, breath, grit, vibrato, scoop, ring and ensemble, then optionally has an RVC voice sing it. - Tracker tab (F4, between Node Editor and Performance) - the arrangement as patterns and pages like OpenMPT: rows down, channels across (a track gets one channel per note that sounds at once, up to 8, so chords read across), an order list of pages, note / instrument / volume cells, hold and note-off marks, the playhead row (Follow keeps it in view), rows per beat 1-8, page size 16-128, hex or decimal row numbers. Click a cell and type notes on the keyboard (Z S X D C V G B H N J M / Q 2 W 3 E R 5 T 6 Y 7 U I), Delete clears, arrows move, [ ] shorten / lengthen the note, Esc leaves the grid. The Font switch draws the grid in the normal English font, Daemon, Chesilin or Konnarian (Chesilin has no - # = so those use the normal font). Konnarian is Daemon stacked into syllable blocks: a note is a solfège block (도 레 미 파 솔 라 시) with ♯ and the octave raised (C#5 = 도♯⁵), channel names are romanized into blocks, and the numbers use the font's own numerals.
- Sampler (a new plugin; Parameters tab) - zones of audio files with root note, key / velocity range, fine tune, volume, pan, pitch tracking, forward / ping-pong loops (draggable markers, Auto loop), trim, reverse, one-shot; amplitude ADSR or a full multi-point envelope with sustain / loop points and fade-out, plus panning, pitch and filter envelopes, a resonant low-pass (cutoff, resonance) and random variation per note (volume, pan, cutoff, resonance, like OpenMPT's swings); WAV / FLAC / OGG / MP3, WavPack (via ffmpeg) and Ogg-in-WAV files. Saved with the project (samples are copied into
<project>/samples). - Tracker import now plays the module's own samples through Samplers: arpeggios become notes, pitch slides / portamento / vibrato become pitch-bend lanes, volume slides / tremolo / retrigger become volume lanes and notes, Zxx filter changes become cutoff / resonance lanes, pattern loops and delays are followed, XM / IT volume, panning and pitch / filter envelopes, fade-outs, instrument cutoff / resonance and global volumes come across. Channels that use these effects get their own track with their lanes. Checked against libopenmpt renders: pitch correlation 0.96-0.99, durations within 0.05 %, level within 1.5 dB. In the import dialog each part can use its original samples, go to a shared percussion kit (one Sampler track), or use a drum sample found in your sample folders by name ("Splash Cymbal" -> a splash sample); Ask Qwen gives percussion parts search words and the importer falls back to the module's own sample when nothing is found. Sample folders searched:
[LingStation]next to the programs folder,library/samples,assets/samplesand Settings > sample_roots. - Export Karaoke (File menu) - subtitles
.ass(per-syllable karaoke, count-in dots),.srt(lines and a progressive-colour version),.lrc(word level), a self-contained HTML player (cursor: sweep / pop / bouncing ball / underline / block / arrow; pitch ribbon of the melody; every look option live in a panel) and an MP4 through ffmpeg, with the backing audio (instrumental = lyric tracks muted). Look options: font (default, Daemon, Chesilin or any font file), size, text / sung / outline / cursor colours, outline thickness and opacity, text opacity, shadow, background, lines on screen, colour by pitch, resolution. - Transcribe Vocals (File menu) - speech to text with faster-whisper running on this computer (GPU when available): picks a model from your Hugging Face cache, writes
.srt(cues from the word timings, broken at sentences and pauses) and.txt, and can fit the words to a MIDI clip's notes. ling-lang itself has the same thing asstt_*builtins (stt_start,stt_poll,stt_segments,stt_words,stt_srt...; seeling/stt/README.md