{"id":49825970,"url":"https://github.com/brummer10/SmoothIR","last_synced_at":"2026-05-30T07:00:39.565Z","repository":{"id":352803973,"uuid":"1215957696","full_name":"brummer10/SmoothIR","owner":"brummer10","description":"Creating impulse responses (IRs) through spectral matching of two audio files.","archived":false,"fork":false,"pushed_at":"2026-05-13T04:31:48.000Z","size":1076,"stargazers_count":29,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-14T13:46:06.599Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brummer10.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-20T12:26:16.000Z","updated_at":"2026-05-13T04:31:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/brummer10/SmoothIR","commit_stats":null,"previous_names":["brummer10/smoothir"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/brummer10/SmoothIR","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brummer10%2FSmoothIR","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brummer10%2FSmoothIR/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brummer10%2FSmoothIR/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brummer10%2FSmoothIR/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brummer10","download_url":"https://codeload.github.com/brummer10/SmoothIR/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brummer10%2FSmoothIR/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33682998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-13T17:00:20.127Z","updated_at":"2026-05-30T07:00:39.558Z","avatar_url":"https://github.com/brummer10.png","language":"C++","funding_links":[],"categories":["Software"],"sub_categories":["Effects/Processing - Other"],"readme":"# SmoothIR\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/brummer10/SmoothIR/blob/main/SmoothIR.png?raw=true\" /\u003e\n\u003c/p\u003e\n\n**SmoothIR** is a tool for creating impulse responses (IRs) through spectral matching of two audio files  \n– with a focus on **musically useful results**, stability, and predictable behavior.\n\n**SmoothEQ** is a Linear Phase EQ based on Impulse Response Processing as Clap plugin.\n\nThe idea is simple:\n\n\u003e The spectral difference between a *Reference* and a *Source* is transformed into an IR  \n\u003e – then carefully shaped using EQ-style controls.\n\nThe result is an IR that behaves like a **well-tuned filter**, ideal for creative applications such as guitars, reamping, and sound design.\n\n---\n\n## Features\n\n* Spectral matching (Reference vs. Source)\n* Robust handling of missing inputs (Reference-only / Source-only modes)\n* Minimum-phase IR generation with adjustable IR length\n* **EQ-style low/high rolloff (true dB/oct behavior)**\n* Continuous **Smooth** control for musical shaping\n* Stable, deterministic processing (no heuristics, no randomness)\n* Interactive spectrum UI with band-style workflow\n* Zero-latency hybrid convolution engine (FIR head + FFT tail)\n* Real-time safe processing suitable for plugin environments\n* IR morphing / live updates without audio dropouts\n\n---\n\n## Processing Engine\n\nSmoothIR uses a **hybrid convolution engine** designed for real-time audio use.\n\nIt combines:\n\n* A **zero-latency FIR head** (time domain)\n* A **partitioned FFT tail** (frequency domain)\n\nThis design ensures:\n\n* Instant transient response (no delay on attack)\n* Efficient processing of long impulse responses\n* Stable CPU usage even with large IR sizes\n\nIn practice, this behaves as **true zero-latency processing**,  \nwhile still supporting high-resolution filtering.\n\n---\n\n## IR Length\n\nThe **IR length** defines the duration of the generated impulse response and directly affects frequency resolution and low-frequency accuracy.\n\n* **Longer IRs** → better low-end resolution and smoother matching  \n* **Shorter IRs** → lower latency and CPU usage  \n\nRule of thumb:\n\n    f_min ≈ sampleRate / IR_length\n\nPractical ranges:\n\n* 2048 samples → ~40–50 Hz  \n* 4096 samples → ~25–30 Hz  \n* 8192+ samples → recommended for deep low-end work  \n\nFrequencies below ~20 Hz are automatically de-emphasized to avoid instability and unnecessary energy.\n\n---\n\n## Usage\n\n    smoothir -r \u003creference.wav\u003e -s \u003csource.wav\u003e\n\n### Parameters\n\n* `-r`, `--ref`  \n  Reference file (target sound)\n\n* `-s`, `--src`  \n  Source file (input sound)\n\n---\n\n## Real-Time Interaction\n\nSmoothIR is designed for interactive workflows:\n\n* Immediate IR updates after parameter changes\n* Click-free IR switching\n* Stable behavior even under rapid parameter changes\n\nThis allows SmoothIR to behave like a real-time EQ,\nwhile internally operating on impulse responses.\n\n## Sound Shaping\n\nAfter spectral matching, the IR is shaped in a controlled and predictable way.\n\n## Spectral EQ Concept\n\nSmoothIR can also be understood as a **spectral EQ built on impulse responses**.\n\nInstead of stacking traditional filter stages:\n\n\u003e The entire EQ curve is embedded into a single minimum-phase IR\n\nThis approach provides:\n\n* Perfectly smooth phase behavior\n* No filter interaction artifacts\n* Extremely natural tonal shaping\n\nAll band adjustments (frequency, gain, Q) directly modify the spectral target,\nwhich is then converted into a coherent IR.\n\nThis results in:\n\n\u003e EQ behavior that feels continuous, stable, and highly musical\n\n### Low / High Cut (EQ-style)\n\nSmoothIR uses a **true EQ-like rolloff**:\n\n* Defined in **dB per octave**\n* Monotonic and stable (no low-end rebound, no ripple)\n* Comparable to analog-style highpass/lowpass filters (Butterworth-like)\n\nThis ensures:\n\n* Clean low-end (no rumble buildup)  \n* Smooth high-end (no harsh fizz)  \n* No unexpected spectral artifacts  \n\n---\n\n### Smooth\n\nA continuous control for spectral smoothing:\n\n* `0.0` → maximum detail transfer  \n* `~0.2 – 0.4` → musical sweet spot  \n* `1.0` → heavily smoothed  \n\nInternally:\n\n\u003e The raw transfer function is blended with a smoothed version  \n\u003e → preserving tone while removing narrow resonances and noise  \n\n---\n\n## Analysis Modes\n\nSmoothIR behaves robustly depending on available inputs:\n\n* **Reference + Source** → full spectral matching  \n* **Reference only** →  visualize the Reference spectrum\n* **Source only** → spectrum capture  \n\nMissing inputs do **not** produce undefined behavior.\n\n---\n\n## UI / Interaction (EQ-style Workflow)\n\nSmoothIR follows a modern parametric EQ interaction model:\n\n* **Drag \u0026 Drop Bands**\n  * Up / Down → Gain  \n  * Left / Right → Frequency  \n\n* **Mouse Wheel**\n  * Adjusts **Q (bandwidth)**  \n\n* Immediate visual feedback via spectrum display  \n* Band-oriented workflow similar to professional EQs  \n\nGoal:\n\n\u003e Make IR creation feel like working with an EQ – not a black box\n\n---\n\n## Typical Workflow\n\n1. Load Reference and Source  \n2. Generate IR  \n3. Set Low/High Cut (define usable range)  \n4. Adjust bands (freq / gain / Q)  \n5. Dial in Smooth  \n6. Apply IR  \n\n---\n\n## Notes\n\n* Extreme low/high frequencies often contain little usable information  \n  → controlled rolloff improves stability and sound quality  \n\n* Over-smoothing removes character  \n  → use moderately  \n\n* The generated IR is **minimum-phase**\n  → efficient, phase-coherent, and optimized for zero-latency convolution\n\n---\n\n## Example\n\nA creative use case:\n\n* Reference: Piano  \n* Source: Harp  \n* Applied to: Guitar  \n\n→ produces a unique but still musical tonal character\n\n---\n\n## Dependencies\n\nSmoothIR relies on a small set of widely available libraries:\n\n* **X11** – windowing (Linux)  \n* **cairo** – UI rendering  \n* **libsndfile** – audio I/O  \n* **FFTW3** – spectral processing  \n* **jackd** – real-time audio  \n\n### Install (Debian/Ubuntu)\n\n    sudo apt install libx11-dev libcairo2-dev libsndfile1-dev libfftw3-dev libjack-jackd2-dev\n\n---\n\n## Build\n\n    git clone https://github.com/brummer10/SmoothIR.git\n    cd SmoothIR\n    git submodule init\n    git submodule update\n    make\n    sudo make install\n\n## Build as Clap plugin\n\n    make clap\n    make install\n\n---\n\n## Concept\n\nSmoothIR deliberately avoids:\n\n* heuristic corrections  \n* unstable spectral tricks  \n* artificial post-processing  \n\nInstead:\n\n\u003e Clear separation of **analysis → shaping → synthesis**\n\nResulting in predictable, reproducible, and musical behavior.\n\n---\n\n## License\n\nBSD-3-Clause\n\n---\n\n## Philosophy\n\n\u003e If it sounds good, it is right.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrummer10%2FSmoothIR","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrummer10%2FSmoothIR","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrummer10%2FSmoothIR/lists"}