{"_id":"@audio/saturate-tube","_rev":"6-ffee9113f40f5255f813538f35af92e0","name":"@audio/saturate-tube","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@audio/saturate-tube","version":"1.0.0","keywords":["audio","dsp","saturation","tube"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/saturate-tube@1.0.0","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"dist":{"shasum":"d6451bf0b63ab969810b53cf651b696da55d6461","tarball":"https://registry.npmjs.org/@audio/saturate-tube/-/saturate-tube-1.0.0.tgz","fileCount":3,"integrity":"sha512-buNtbUrUY1q4cVbE9Bg4hUsigBCw1mO0wL1fDHGsgS1amAGICrXd1MXvTnzzLhMrvUtmGd796UQ2Hol+eTRMHQ==","signatures":[{"sig":"MEUCIQDh5Mv3tTgBOAFSox2UZkbwGJFQ08IR25vXtTmbmQ5/YQIgCIJ4O8p3fBXlcMRR3rZ0PbHhITU8sgPgij96PnxPOJw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2092},"main":"tube.js","type":"module","engines":{"node":">=18"},"exports":{".":"./tube.js","./audio-module":"./audio-module.js","./package.json":"./package.json"},"gitHead":"d66dbb92515c68d654294a7500febf8fdac9f627","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"_npmVersion":"11.12.1","description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","audio-module":"./audio-module.js","dependencies":{"@audio/saturate-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/saturate-tube_1.0.0_1783540323026_0.5077135927483196","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@audio/saturate-tube","version":"1.0.1","keywords":["audio","dsp","saturation","tube"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/saturate-tube@1.0.1","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"atom":"./atom.js","dist":{"shasum":"970fd0929d423bc0a76c2a1a8ff0cccd7a9795c4","tarball":"https://registry.npmjs.org/@audio/saturate-tube/-/saturate-tube-1.0.1.tgz","fileCount":3,"integrity":"sha512-8YGT/H7pOSES4e0hAAQTUZhHTTI1c0rKsZoY3dGK3QYPo07pnmc37F3rBEZVtp00m1Q2bU10pecfdFjeFUVVsw==","signatures":[{"sig":"MEUCIFQeuBJbTcamU8IU6bqyjazNljtlcbhAkrpwQ8/OPLNkAiEA1HV53oGrWab6YnB0zq0xBenHLlmwDkEj0N0B8EQAidA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2041},"main":"tube.js","type":"module","engines":{"node":">=18"},"exports":{".":"./tube.js","./atom":"./atom.js","./package.json":"./package.json"},"gitHead":"35c9825c6c127e56337e74c117b2b2c639c4bc11","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"_npmVersion":"11.12.1","description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@audio/saturate-core":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/saturate-tube_1.0.1_1783560313996_0.785071108637539","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@audio/saturate-tube","version":"1.0.2","keywords":["audio","dsp","saturation","tube"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/saturate-tube@1.0.2","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"atom":"./atom.js","dist":{"shasum":"8286d1f66866da25620e889da9dd0d6657c73292","tarball":"https://registry.npmjs.org/@audio/saturate-tube/-/saturate-tube-1.0.2.tgz","fileCount":4,"integrity":"sha512-OWDnFxfaDC17nm3LZAszwY5dqvVT4MNOGWnvM8dZsA41GIQarayFVAIAW1NIuCsMUyxY+ZmbyAWZim6TMl1KIg==","signatures":[{"sig":"MEUCIGTiQKD4o3fUNfP/DgBHpYtdGDtlHcNdOSSEpHfv682fAiEA1UtoHuVDYeKwHXPrSAruh27upX8OEfw/fhVfc4BlLc8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3084},"main":"tube.js","type":"module","engines":{"node":">=18"},"exports":{".":"./tube.js","./atom":"./atom.js","./package.json":"./package.json"},"gitHead":"18a6fb1ccc06c55f4297e6a4f60c5eff28ab0a8d","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"_npmVersion":"11.12.1","description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@audio/resample-sinc":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/saturate-tube_1.0.2_1783623894629_0.23861077712903755","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@audio/saturate-tube","version":"1.0.3","keywords":["audio","dsp","saturation","tube"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/saturate-tube@1.0.3","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"dist":{"shasum":"d507d6cfed756d69117f4d8d2cd72466f3b1dd86","tarball":"https://registry.npmjs.org/@audio/saturate-tube/-/saturate-tube-1.0.3.tgz","fileCount":4,"integrity":"sha512-vgCm6WYeY4wIRzQnQwDEvFbNAiGF9YA1Yl6omUHFOquspG8s0mXSjaKHk8OxtVOa1WiYnfqevGtZI78yL9JAAQ==","signatures":[{"sig":"MEQCIDx6/4H2zQdhzCbqaZynZWHC3wxymEyExYyBhosMpQTnAiAyEwvh5Y86filbkdcmTXvF18uK+hn/ZYrz8NcpWhrU9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3089},"main":"tube.js","type":"module","audio":"./audio.js","engines":{"node":">=18"},"exports":{".":"./tube.js","./audio":"./audio.js","./package.json":"./package.json"},"gitHead":"dcd47d2bf50c850b504a9e771ff4f9ed7472530e","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"_npmVersion":"11.12.1","description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@audio/resample-sinc":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/saturate-tube_1.0.3_1783645032488_0.6782962653791678","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@audio/saturate-tube","version":"1.0.4","keywords":["audio","dsp","saturation","tube"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/saturate-tube@1.0.4","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"dist":{"shasum":"e00f5fc00c87f1ba0556439da632d7cc7381a3f0","tarball":"https://registry.npmjs.org/@audio/saturate-tube/-/saturate-tube-1.0.4.tgz","fileCount":5,"integrity":"sha512-Rq5uzR87/SklqT3Cr+f7EuN1iyl3a72kXA1d1dxWcj7oWLuWmHYl2p7ioIPvyL40km4G8uxUtwkx4rsUS2i7FA==","signatures":[{"sig":"MEUCIC9m77j4Dlj9YolmgUdYIZN70TLXWNOImUpTZNZ7GHUAAiEAzM6x0N4hzRl9bqmp9twzHNY2dzfFgf2Jm6ympDaW1f4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4521},"main":"tube.js","type":"module","audio":"./audio.js","engines":{"node":">=18"},"exports":{".":"./tube.js","./audio":{"types":"./audio.d.ts","default":"./audio.js"},"./package.json":"./package.json"},"gitHead":"b5ad7689b2358b09a03cc5eeb458308711a01cce","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"_npmVersion":"11.12.1","description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","dependencies":{"@audio/resample-sinc":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/saturate-tube_1.0.4_1783701795760_0.9322532859215271","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@audio/saturate-tube","version":"1.0.5","description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","type":"module","sideEffects":false,"main":"tube.js","exports":{".":"./tube.js","./package.json":"./package.json","./audio":{"types":"./audio.d.ts","default":"./audio.js"}},"dependencies":{"@audio/resample-sinc":"^1.0.0"},"keywords":["audio","dsp","saturation","tube"],"license":"MIT","author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"audio":"./audio.js","repository":{"type":"git","url":"git+https://github.com/audiojs/saturate.git","directory":"packages/saturate-tube"},"funding":"https://github.com/sponsors/audiojs","types":"tube.d.ts","gitHead":"8e5a2f210f134ccb055e9ca88a40c255bcf4985d","_id":"@audio/saturate-tube@1.0.5","bugs":{"url":"https://github.com/audiojs/saturate/issues"},"homepage":"https://github.com/audiojs/saturate#readme","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-CAbJGmAnMtYOBl5fc6bo538k1xg36gLwbZWATHAfh2Ndk3rFtvKrWMSuwXdRhLhHHWZXQYjTuwSzqC88T8S5mA==","shasum":"3c79d47044791a9914dfdbeb90f484b502258b81","tarball":"https://registry.npmjs.org/@audio/saturate-tube/-/saturate-tube-1.0.5.tgz","fileCount":7,"unpackedSize":7399,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIE7Blg9VTDWxJiR8TuDjzL8xzsT8I12E39CPRBALnfWDAiEA1FaBowaUr4juzYtHpo27IejjPGndKL2kZ+nzYnton5o="}]},"_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"directories":{},"maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/saturate-tube_1.0.5_1783731760397_0.1136585798446148"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-08T19:52:02.831Z","modified":"2026-07-11T01:02:40.688Z","1.0.0":"2026-07-08T19:52:03.183Z","1.0.1":"2026-07-09T01:25:14.134Z","1.0.2":"2026-07-09T19:04:54.792Z","1.0.3":"2026-07-10T00:57:12.625Z","1.0.4":"2026-07-10T16:43:15.898Z","1.0.5":"2026-07-11T01:02:40.531Z"},"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","keywords":["audio","dsp","saturation","tube"],"description":"Tube saturation — asymmetric biased tanh, even-harmonic signature","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"readme":"# @audio/saturate-tube [![npm](https://img.shields.io/npm/v/@audio/saturate-tube)](https://www.npmjs.com/package/@audio/saturate-tube) [![MIT](https://img.shields.io/badge/MIT-%E0%A5%90-white)](https://github.com/krishnized/license)\n\nTube saturation — asymmetric biased tanh, even-harmonic signature\n\n```\nnpm install @audio/saturate-tube\n```\n\n```js\nimport tube from '@audio/saturate-tube'\n```\n\nValve/tube-style saturation: a DC-compensated, asymmetric `tanh` transfer (`bias` shifts the curve off-center). The asymmetry is what generates even harmonics — the \"warm\" 2nd-harmonic tube signature — versus the odd-only symmetric curves in `transistor`/`waveshaper`. Oversampled (windowed-sinc up → shape → windowed-sinc down) to keep the extra harmonics from aliasing.\n\n```js\ntube(data, { drive: 3, fs: 44100 })\ntube(data, { drive: 2, bias: 0.4, mix: 0.6 })\n```\n\n| Param | Default | |\n|---|---|---|\n| `drive` | `2` | pre-gain into the biased tanh curve |\n| `bias` | `0.25` | 0..1 — asymmetry (DC-compensated); higher = more even-harmonic content |\n| `fs` | `44100` | sample rate |\n| `oversample` | `4` | oversample factor; `1` disables oversampling (naive, aliased) |\n| `mix` | `1` | 0..1 — wet/dry blend |\n\n**Mutates `data` in place** and returns it (same array reference, not a copy). Even (2nd) harmonic energy measurably exceeds `transistor`'s at equal drive — verified in the family test suite via Goertzel analysis at 2nd/3rd harmonic bins.\n\nThis package's own host wrapper (`./audio` export, for chainable-host use) is `streaming: false` — the sinc-oversampled transfer needs whole-signal context; a per-block realtime path would need a streaming polyphase oversampler first.\n\n**Use when:** warm, \"tube-y\" 2nd-harmonic coloration.<br>\n**Not for:** odd-harmonic console character (use `transistor`) or HF-rolled tape character (use `tape`).\n\n---\n\nPart of the [@audio/saturate](https://github.com/audiojs/saturate) family.\n\nMIT © [audiojs](https://github.com/audiojs)\n","readmeFilename":"README.md","homepage":"https://github.com/audiojs/saturate#readme","repository":{"type":"git","url":"git+https://github.com/audiojs/saturate.git","directory":"packages/saturate-tube"},"bugs":{"url":"https://github.com/audiojs/saturate/issues"}}