Web-based MIDI SysEx librarian, patch vault, and hardware synth bridge for DX7, Juno-106, D-50, and vintage synthesizers.
1
stars
1
commits
Python
primary language
Sep 14, 2026
updated
The open-source browser-native SysEx librarian, patch decapsulator, and cloud vault for vintage hardware synthesizers.
Zero software installation. Zero legacy 32-bit drivers. Sample-accurate Web MIDI packet pacing. 110+ synthesizers supported.
If you own vintage hardware synthesizers (from a 1983 Yamaha DX7 or a 1984 Roland Juno-106 to a Sequential Prophet-5 or Korg M1), managing your patch banks has historically been painful:
[!NOTE] bipluk runs entirely inside modern web browsers using the open W3C Web MIDI API. Open a tab, connect your 5-pin DIN or USB-MIDI interface, back up your soundbanks, search patch names by text, and flash banks back to your instrument in one click.
Inside nearly every 1980s and 1990s hardware synthesizer sits a soldered 3-Volt lithium battery (typically a CR2032, BR2325, or rechargeable NiCad/Varta cell) keeping internal static RAM (SRAM) energized while the power switch is off.
[!WARNING] CRITICAL VOLTAGE CLIFF
- 3.2V to 3.0V: Healthy nominal battery voltage.
- 2.8V to 2.6V: Unstable threshold. RAM bit-rot begins, patch names corrupt, and parameters scramble.
- Below 2.5V: Instant memory wipe. The moment voltage collapses or a technician desolders the battery during service, every custom sound designed over the past 10 to 30 years is permanently erased.
flowchart LR
A["π Factory Battery (3.0V)"] --> B["β οΈ Voltage Drops (< 2.6V)"]
B --> C["π₯ SRAM Power Collapses"]
C --> D["β Custom Soundbanks Wiped Forever"]
B -.->|"Emergency bipluk Web MIDI Dump"| E["βοΈ Safe Cloud Vault (.syx)"]
E --> F["π§ Solder New Battery"]
F --> G["β‘ One-Click Restore to Hardware"]
bipluk provides an instant, zero-install emergency backup flow to capture raw .syx binary snapshots before opening the chassis or servicing the motherboard.
performance.now() + offset timestamp scheduling rather than unreliable JavaScript setTimeout(), eliminating UART packet loss and buffer overflow errors on classic instruments..syx files at any time, or send banks back to your gear with one click.[!TIP] Lossless Guarantee: bipluk never converts your soundbank into a proprietary closed format. Your data remains 100% standard uncompressed System Exclusive binary (
.syx), downloadable anytime.
flowchart TD
subgraph Hardware ["Physical Studio Rig"]
Synth["πΉ Vintage Hardware Synth<br>(DX7, Juno-106, Prophet-5, M1)"]
MIDI_IF["π Hardware MIDI Interface<br>(5-pin DIN to USB)"]
Synth <-->|"31.25 kbaud Serial UART"| MIDI_IF
end
subgraph Browser ["Modern Browser (Client)"]
WebMIDI["π W3C Web MIDI API<br>(sysex: true)"]
Scheduler["β±οΈ Microsecond Pacing Engine<br>(performance.now offsets)"]
Decoder["π Binary Stream Decapsulator<br>(ASCII, 7-bit unpack, Checksums)"]
UI["π» bipluk Web Interface<br>(Oscilloscope, Bank Slots, Search)"]
MIDI_IF <-->|"USB-MIDI Packets"| WebMIDI
WebMIDI --> Decoder
Decoder --> UI
UI --> Scheduler
Scheduler -->|"Paced F0...F7 Chunks"| WebMIDI
end
subgraph Cloud ["bipluk Cloud Services"]
Server["π FastAPI Backend Application"]
Vault[("πΎ Encrypted Soundbank Vault<br>SQLite / PostgreSQL")]
PPP["π Live Purchasing Power Parity Engine"]
Stripe["π³ Stripe Payment Gateway"]
Resend["π¬ CAN-SPAM Email System"]
UI <-->|"HTTPS JSON / REST"| Server
Server <--> Vault
Server <--> PPP
Server <--> Stripe
Server --> Resend
end
The physical MIDI specification operates as a 5 mA current loop over shielded twisted pair cable with standard DIN 41524 connectors. The baud rate is defined exactly as:
$$f_{\text{baud}} = 31,250\text{ bits per second} \implies T_{\text{bit}} = \frac{1}{31,250} = 32\ \mu\text{s}$$
Because MIDI transmission is asynchronous, every transferred byte is framed by 1 start bit (logic 0), 8 data bits, and 1 stop bit (logic 1), totaling 10 bit periods per byte frame:
$$T_{\text{frame}} = 10 \times T_{\text{bit}} = 320\ \mu\text{s per byte}$$
The theoretical maximum continuous bandwidth of a physical MIDI line is:
$$\text{Throughput}_{\max} = \frac{31,250\text{ bits/s}}{10\text{ bits/byte}} = 3,125\text{ bytes/second} = 3.125\text{ KB/s}$$
For a standard Yamaha DX7 bulk patch dump (4,096 bytes):
$$T_{\text{transfer}} = \frac{4096\text{ bytes}}{3125\text{ bytes/s}} = 1.31072\text{ seconds}$$
Optocouplers used in 1980s synthesizer inputs (such as the Sharp PC-900 or HP 6N138) have finite rise and fall times:
$$t_r \approx 1.5\ \mu\text{s} \text{ to } 3.0\ \mu\text{s}, \quad t_f \approx 0.5\ \mu\text{s} \text{ to } 1.5\ \mu\text{s}$$
When modern multi-gigahertz host computers blast packets without inter-byte pacing, optocoupler slew asymmetry combined with 1-byte FIFO buffers on vintage microcontrollers (Intel 8031, Zilog Z80) induces frame framing errors and buffer overrun interrupts. bipluk schedules packet dispatches with microsecond timestamps calibrated to vintage receive envelopes.
The MIDI 1.0 standard reserves any byte with the Most Significant Bit (MSB) set to 1 (values $128 \le B \le 255$ or 0x80 to 0xFF) exclusively for Status Bytes (Note On, CC, SysEx start 0xF0, SysEx end 0xF7).
Therefore, all parameter data bytes must satisfy:
$$\text{MSB}(D) = 0 \iff 0 \le D \le 127 \quad (\text{hex: } 0\text{x}00 \text{ to } 0\text{x}7\text{F})$$
To transmit unconstrained 8-bit binary integers ($0 \le X \le 255$) or 12-bit DAC modulation values, synthesizer manufacturers developed distinct data-packing theorems:
Each 8-bit byte $X$ is partitioned into two 4-bit nibbles, with each nibble transmitted in a 7-bit data byte:
$$D_{\text{low}} = X \land 0\text{x}0\text{F}, \quad D_{\text{high}} = (X \gg 4) \land 0\text{x}0\text{F}$$
Reconstruction at receiver:
$$X = (D_{\text{high}} \ll 4) \lor D_{\text{low}}$$
This incurs a data expansion factor of:
$$\text{Expansion Ratio} = \frac{2\text{ transmitted bytes}}{1\text{ source byte}} = 200%$$
Yamaha engineers avoided the 200% overhead by grouping four 8-bit bytes ($B_0, B_1, B_2, B_3$, totaling 32 bits of parameter data) into five 7-bit MIDI bytes ($M_0, M_1, M_2, M_3, M_4$, totaling 35 bits):
$$M_k = B_k \land 0\text{x}7\text{F} \quad \text{for } k \in {0, 1, 2, 3}$$
The fifth byte $M_4$ accumulates the Most Significant Bits of all four source bytes:
$$M_4 = \sum_{k=0}^{3} \left(\frac{B_k \land 0\text{x}80}{0\text{x}80}\right) \cdot 2^k$$
This achieves an efficient transmission ratio:
$$\text{Expansion Ratio} = \frac{5}{4} = 125%$$
bipluk implements automated bidirectional decapsulation for both schemes in real time.
Unlike subtractive analog synthesizers that filter harmonics with operational transconductance amplifiers (OTAs), Casio CZ synthesizers (CZ-101, CZ-1000, CZ-5000) employ Phase Distortion (PD) synthesis.
The output waveform $y(t)$ is generated by reading a pure sine wave look-up table at an angle driven by a piecewise-distorted phase accumulator $\phi_d(t)$:
$$y(t) = \sin(\phi_d(t))$$
The normalized phase accumulator $\phi(t)$ runs linearly from $0$ to $2\pi$ over fundamental period $T = 1/f_0$:
$$\phi(t) = 2\pi f_0 t \pmod{2\pi}$$
Under Casio PD synthesis, an inflection knee $t_k \in (0, T)$ dynamically warps the phase angle:
$$\phi_d(t) = \begin{cases} \left(\frac{\pi}{t_k}\right) t & 0 \le t < t_k \ \pi + \left(\frac{\pi}{T - t_k}\right) (t - t_k) & t_k \le t < T \end{cases}$$
flowchart TD
LinearPhase["Linear Phase Accumulator: Ο(t)"] --> DistortionBlock["Phase Distortion Transfer: Ο_d(t)"]
DistortionBlock --> SineLUT["Sine Look-Up Table: sin(Ο_d(t))"]
SineLUT --> OutputWaveform["Synthesized Waveform: y(t)<br>(Saw, Resonant, Square)"]
When $t_k = T/2$, the phase is undistorted, generating a pure sine wave. When $t_k \to 0$, the phase slope approaches infinity at the start of each cycle, generating a sawtooth harmonic series. Modulating $t_k$ via an 8-stage envelope generator replicates the resonant frequency sweeps of analog VCF filters without physical capacitors or inductors.
Roland GS and LA System Exclusive protocol specifications mandate that the payload data packet (address bytes plus data bytes) satisfies an exact modulo-128 parity condition:
$$\left(\sum_{i=1}^{k} \text{PayloadByte}_i + \text{Checksum}\right) \bmod 128 = 0$$
To derive the required checksum byte from the data payload:
$$\text{Checksum} \equiv -\sum_{i=1}^{k} \text{PayloadByte}_i \pmod{128}$$
Using two's complement arithmetic within a 7-bit field:
$$\text{Checksum} = \left(128 - \left(\sum_{i=1}^{k} \text{PayloadByte}_i \bmod 128\right)\right) \land 0\text{x}7\text{F}$$
If the remainder of the sum is zero, the checksum simplifies to zero:
$$\text{If } \sum \text{PayloadByte}_i \equiv 0 \pmod{128} \implies \text{Checksum} = 0$$
bipluk re-computes and verifies this checksum on every Roland patch transfer to guarantee soundbank integrity before sending byte streams to physical hardware.
The coin cell powering synthesizer volatile SRAM utilizes Lithium Manganese Dioxide chemistry:
$$\text{Li} + \text{Mn}^{\text{IV}}\text{O}_2 \longrightarrow \text{Li}\text{Mn}^{\text{III}}\text{O}_2$$
The terminal cell voltage $V_{\text{terminal}}$ as a function of drawn capacity $Q(t) = \int I(t) dt$ follows:
$$V_{\text{terminal}}(t) = V_{\text{open}} - I_{\text{load}} \cdot R_{\text{internal}}(Q) - \frac{RT}{F} \ln\left(\frac{C_{\text{active}}}{C_0 - Q(t)}\right)$$
Cell Voltage (V)
3.2V |-------------------\
3.0V | \
2.8V | SAFE RETENTION \ UNSTABLE REGION
2.6V | \
2.4V |-----------------------\================== MEMORY LOSS
2.0V | \
0.0V +---------------------------------------------> Time (Years)
For over 90% of the battery service life (typically 10 to 20 years with typical SRAM standby currents of $0.5\ \mu\text{A}$ to $2.0\ \mu\text{A}$), $V_{\text{terminal}}$ remains above 2.8V. When remaining capacity drops below 5%, the internal resistance $R_{\text{internal}}$ escalates exponentially from $20\ \Omega$ to over $1,000\ \Omega$.
Once voltage drops beneath the SRAM transistor holding voltage $V_{\text{hold}} \approx 2.4\text{V}$, cross-coupled inverter gates randomly toggle state, corrupting patch data irrevocably.
bipluk includes hardware decoders and SysEx adaptations for historic synthesizers across all major manufacturers:
| Model | Synthesis Engine | Voice Arch | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| DX7 / TX7 | 6-Operator FM (32 Algorithms) | 16 Voices | Packed 32-voice 4096-byte bulk dump decoding | Function 8 -> Memory Protect Internal -> Off |
| DX7II / DX7s | Dual 6-Op FM, Fractional Scaling | 16/32 Voices | Fractional micro-tuning & dual performance dumps | Edit -> 14 Memory Protect -> Internal Off |
| TX81Z / DX11 | 4-Operator FM (8 Waveforms) | 8 Voices | Lately Bass voice parameter & multi-setup dumps | Utility -> Memory Protect -> Off |
| FB-01 | 4-Operator FM (8-part Multitimbral) | 8 Voices | System Setup & voice configuration dumps | System -> Config Protect -> Off |
| FS1R | 8-Operator FM + Formant Synthesis | 16 Voices | Massive 132KB voice and formant bank dumps | Utility -> Protect -> Off |
| Reface DX | Modern 4-Op FM with Continuous Feedback | 8 Voices | JSON-in-SysEx parameter parsing & live sync | Settings -> Memory Protect -> Disabled |
| SY77 / TG77 | AFM + AWM2 Hybrid Synthesis | 16/32 Voices | RCM hybrid voice structure & multi-filter dumps | Utility -> Protect -> Off |
| Model | Synthesis Engine | Filter / Voice Chips | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| Juno-106 | 6-Voice Polyphonic DCO Analog | Roland 80017A VCF/VCA | Native 11-88 Base-8 patch naming & voice chip check | Rear switch -> Memory Protect: SAVE |
| Juno-60 | Polyphonic DCO (DCB / Retrofit) | IR3109 24dB 4-pole | DCB-to-MIDI retrofit dump pacing (Minerva/Tubbutec) | Memory Protect Switch -> Off |
| Jupiter-6 | Subtractive Analog Polyphonic | Curtis CEM3340 + CEM3360 | Europa firmware SysEx expansion & arpeggio memory | Rear Protect switch -> Off |
| Jupiter-8 | Dual VCO Discrete Analog Poly | Discrete IR3109 | Encore / Groove MIDI SysEx upgrade bulk banks | Memory Protect Switch -> Manual |
| D-50 / D-550 | Linear Arithmetic (LA) Synthesis | Roland LA32 DSP + PCM | Upper/Lower partial split & reverb mode decoding | Tune/Function -> Protect -> Off |
| MKS-50 | 1U Rackmount Alpha Juno Analog | IR3R05 Filter IC | Full Sysex Tone & Patch parameter decapsulation | Protect Switch -> Off |
| MKS-70 | Dual JX-8P Analog Synthesizer | IR3R05 Dual Filters | Colin Fraser V4 / Fred Vecoven firmware dumps | Memory Protect -> Off |
| MKS-80 | Super Jupiter Analog Rack | CEM3340 (Rev 4) / IR3R03 (Rev 5) | Tone & Patch bank decoding with MPG-80 mapping | Memory Protect Switch -> Off |
| JV-1080 / 2080 | 64-Voice 4-Tone PCM Workstation | Roland Custom DSP | Patch, Performance, and Rhythm setup bulk dumps | System -> Protect -> Off |
| XV-3080 / 5080 | 128-Voice Advanced PCM Expander | Roland XV Engine | 32-bit floating point matrix modulation dumps | System -> Utility -> Protect Off |
| JD-800 / JD-990 | Linear Synthesizer PCM Workstation | Super-JD Vintage PCM | 4-tone layered architecture patch decoders | Utility -> Memory Protect -> Off |
| Model | Synthesis Engine | Key Hardware | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| M1 / M1R | AI Synthesis Workstation (PCM) | 16-bit PCM ROM | 100 Programs + 100 Combinations bulk dump | Global -> Page 5 -> Protect Internal -> Off |
| Wavestation | Advanced Vector & Wave Sequencing | Dual 16-bit DACs | Performance, Patch, and Wave Sequence dumps | Global -> Page 2 -> Memory Protect -> Off |
| DW-8000 / EX-8000 | Digital Waveform + Analog VCF | NJM2069 24dB VCF | DWGS waveform parameter & arpeggiator banks | Rear Protect Switch -> Off |
| MS2000 / MS2000R | DSP Analog Modeling (OASYS-derived) | Dual DSP Engine | Single patch & 16-step modulation sequence dump | Global -> Protect -> Disable |
| microKORG | 4-Voice Virtual Analog + Vocoder | Korg MS DSP | 128-preset bank parsing & vocoder settings | Shift + Key 8 -> Protect -> Off |
| Minilogue XD | 4-Voice Analog + Multi-Engine Digital | Discrete Analog + SDK | User oscillator & FX slot SysEx configuration | Global Settings -> SysEx Dump -> Enable |
| Model | Architecture | Voice / Filter Chips | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| Prophet-5 (Rev 2/3/4) | 5-Voice Polyphonic VCO Analog | SSM2040 / CEM3320 / Rev 4 | Native Rev 4 SysEx & Rev 3.3 MIDI cassette dumps | Globals -> MIDI SysEx -> Dump/Load Enable |
| Prophet-6 | 6-Voice Discrete VCO Analog | Discrete 4-Pole Lowpass | Program & Global settings bulk dump parsing | Globals -> Page 8 -> SysEx: All |
| Prophet-600 | First Commercial MIDI Synth | CEM3340 VCOs + CEM3372 | Factory & GliGli custom firmware SysEx support | Ensure Memory Protect switch is unlocked |
| Prophet-08 / Rev2 | 8/16-Voice DCO Analog Polyphonic | Curtis CEM3396 | Layer A + Layer B dual-stack voice parsing | Globals -> MIDI SysEx -> All |
| OB-6 | 6-Voice Discrete Oberheim Analog | SEM-inspired State-Variable | 500 User + 500 Factory preset decoders | Globals -> MIDI SysEx -> On |
| Trigon-6 | 3-VCO Ladder Filter Analog Poly | Discrete 3-VCOs + Ladder | 500 Preset bank backup and restore | Globals -> SysEx Dump -> All |
| Take 5 | 5-Voice Compact VCO Polyphonic | Dual Analog VCOs + SSM VCF | 128-patch live bank capture & rename | Globals -> MIDI SysEx -> All |
| Tempest | 6-Voice Analog Drum Machine | Dual Analog + Dual Digital | Sound & Beat SysEx project decapsulation | System -> SysEx Dump |
| Model | Synthesis Engine | Filter Hardware | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| Matrix-1000 | 1,000 Analog Patches in 1U Rack | CEM3396 Voice-on-Chip | Bank 0 & 1 User RAM SysEx librarian flow | Unlock Memory Protect via Front Panel Code |
| Matrix-6 / 6R | 6-Voice Matrix Modulation Analog | Dual CEM3396 ICs | Quick Voice & Master Matrix routing dumps | Master -> Parameter 08 -> Protect Off |
| OB-8 | 8-Voice Discrete Dual VCO Analog | Curtis CEM3320 VCF | Page 2 MIDI SysEx retrofits & factory dumps | Rear Memory Protect Switch -> Off |
| Model | Synthesis Engine | Key Architecture | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| CZ-101 / CZ-1000 | Phase Distortion (PD) Synthesis | Dual Line DCO/DCW/DCA | 16 Internal + 16 Cartridge preset un-packer | Memory Protect Switch -> Disable |
| CZ-3000 / CZ-5000 | 8/16-Voice Full-Key PD Synthesizer | Dual Line + 8-Track Sequencer | Voice data & onboard sequencer track dumps | Protect switch on rear panel -> Off |
| VZ-1 / VZ-10M | Interactive Phase Distortion (iPD) | 8-Module Digital Engine | Multi-channel operation & patch data backup | Utility -> Memory Protect -> Off |
F0 ... F7).Explore in-depth technical specifications, factory patch listings, filter schematics, and memory protect guides on the live bipluk wiki:
| Synthesizer | Architecture Profile | Era | Live Interactive Wiki Link |
|---|---|---|---|
| Yamaha DX7 | 6-Operator FM, 32 Algorithms, John Chowning DAC | 1983 | bipluk.com/dx7 |
| Roland Juno-106 | 6-Voice DCO Analog, 80017A Filter/VCA, Stereo Chorus | 1984 | bipluk.com/juno-106 |
| Korg M1 | 16-bit PCM Workstation, AI Synthesis Engine | 1988 | bipluk.com/m1 |
| Roland Jupiter-6 | Multi-mode Resonant Analog Poly, CEM3340 VCOs | 1983 | bipluk.com/jupiter-6 |
| Casio CZ-101 | Phase Distortion (PD) Synthesis, Dual DCO/DCW/DCA | 1984 | bipluk.com/cz-101 |
| Roland D-50 | Linear Arithmetic (LA) Synthesis, 32 partials | 1987 | bipluk.com/d-50 |
| Sequential Prophet-5 | Rev 2/3/4 Curtis CEM & SSM Analog VCOs | 1978 / 2020 | bipluk.com/prophet-5 |
| Sequential Prophet-600 | First MIDI Synthesizer, GliGli High-Speed Mod | 1982 | bipluk.com/prophet-600 |
| Oberheim Matrix-1000 | 1,000 Patches, Dual CEM3396 Voice-on-Chip | 1988 | bipluk.com/matrix-1000 |
| Yamaha TX81Z | 4-Op FM, 8 Waveforms, Lately Bass Module | 1986 | bipluk.com/tx81z |
| Roland Juno-60 | DCB / Retrofit DCO Analog Polyphonic | 1982 | bipluk.com/juno-60 |
| Korg Wavestation | Vector Synthesis & Dynamic Wave Sequencing | 1990 | bipluk.com/korg-wavestation |
| Alesis Andromeda A6 | 16-Voice True Discrete Dual-Filter Analog | 2000 | bipluk.com/alesis-andromeda-a6 |
| Access Virus C | Virtual Analog Polyphonic DSP Synthesizer | 2002 | bipluk.com/access-virus-c |
| Moog Voyager | Bob Moog Analog Monosynth, Dual Ladder Filters | 2002 | bipluk.com/moog-voyager |
| Black Corp Kijimi | RSF Polykobol Inspired Discrete Analog | 2018 | bipluk.com/bc-kijimi |
Standard JavaScript setTimeout() and setInterval() run on an unprioritized browser event loop clamped to 4ms with significant jitter. Blasting a 4096-byte Yamaha DX7 bank or a 32KB Roland D-50 dump without exact inter-packet delays chokes the synthesizer UART buffer, resulting in checksum errors.
sequenceDiagram
autonumber
actor User as Musician / Producer
participant Browser as bipluk Engine (Browser)
participant Driver as Web MIDI Output Queue
participant Synth as Vintage Synth UART (8031 CPU)
User->>Browser: Click "Send Soundbank to Synth"
Note over Browser: Calculate microsecond offsets via performance.now()
Browser->>Driver: output.send(Chunk 0, T0)
Driver->>Synth: 256 bytes over 31.25 kbaud
Note over Synth: Process into SRAM & calculate checksum
Browser->>Driver: output.send(Chunk 1, T0 + 40ms)
Driver->>Synth: 256 bytes (Buffer safe!)
Browser->>Driver: output.send(Chunk 2, T0 + 80ms)
Driver->>Synth: 256 bytes (Buffer safe!)
Note over Synth: Bank Write Complete (0 Errors)
// Sample-accurate Web MIDI packet pacing implementation
function sendSysExWithPacing(midiOutput, bytes, chunkSize = 256, delayMs = 40) {
const startTime = performance.now();
let offset = 0;
for (let i = 0; i < bytes.length; i += chunkSize) {
const chunk = bytes.slice(i, i + chunkSize);
const targetTimestamp = startTime + offset;
// Dispatched directly to the OS MIDI scheduler
midiOutput.send(chunk, targetTimestamp);
offset += delayMs;
}
}
Synthesizers like the Roland Juno-106, Juno-60, and Sequential Prophet-5 feature front panels with 8 bank buttons and 8 patch buttons (numbered 1 to 8). Decimal indexing (0 to 63) confuses musicians during live sets. bipluk natively converts these to physical labels:
$$\text{Display Number} = \left(\left\lfloor \frac{\text{index}}{8} \right\rfloor + 1\right) \times 10 + \left((\text{index} \bmod 8) + 1\right)$$
(Index 0 maps to Patch 11, Index 63 maps to Patch 88).
| Feature | bipluk | MIDI-OX | Snoize SysEx Librarian | SoundTower | MIDI Quest |
|---|---|---|---|---|---|
| Platform | Any modern web browser | Windows only (x86) | macOS only | Windows / macOS | Windows / macOS |
| Setup Time | 0 Seconds (Zero Install) | Manual .exe setup | Manual .dmg setup | Heavy desktop app | Heavy desktop app |
| Deprecation Risk | None (W3C Web Standard) | High (Abandoned) | Medium (macOS updates) | High (Version locks) | High (Version locks) |
| Patch Search | Instant fuzzy search | None | None | Limited | Proprietary DB |
| Packet Pacing | Microsecond timestamp | Manual buffer tweaks | Fixed millisecond delay | Model-specific | Model-specific |
| Mobile / ChromeOS | Supported | Not supported | Not supported | Not supported | Not supported |
| Pricing Model | $39 Lifetime / Free tier | Free (Abandoned) | Free / Open Source | $199 per synth | $399 per version |
.
βββ main.py # FastAPI backend application, routing, and discovery
βββ ppp_pricing.py # Dynamic Purchasing Power Parity (PPP) engine
βββ synth_seo_catalog.py # Programmatic SEO matrix for 110+ synthesizers
βββ faq_knowledge.py # Structured FAQ and technical knowledge base
βββ settings.py # Environment configuration & credential management
βββ database.py # Database models, soundbank vault & user sessions
βββ sysex_adapters/ # Hardware-specific SysEx decoding test suites & parsers
β βββ testData/ # Authentic raw .syx dumps from vintage synthesizers
β βββ test_*.py # Automated test suites for DX7, Juno, M1, OB-6, etc.
βββ knobkraft_src/ # KnobKraft Orm integration adaptations
βββ templates/ # Modern Jinja2 templates (Lapis & Studio themes)
β βββ landing.html # High-converting homepage & live Web MIDI demo
β βββ index.html # Authenticated user dashboard & soundbank manager
β βββ wiki_detail.html # Programmatic synthesizer wiki documentation
β βββ blog_web_midi.html # Technical engineering log on Web MIDI pacing
β βββ blog_sysex_7bit_packing.html # Guide to 7-bit MIDI byte packing & decapsulation
β βββ email_*.html # 13 CAN-SPAM compliant transactional email templates
βββ static/ # High-resolution pixel art, SVGs, and brand assets
βββ logo.svg # Pixelated brand mark
βββ llms.txt # AI agent context discovery documentation
Clone the repository:
git clone https://github.com/maxcomperatore/bipluk.com.git
cd bipluk.com
Create and activate a virtual environment:
python -m venv venv
# On Windows:
.\venv\Scripts\Activate.ps1
# On macOS/Linux:
source venv/bin/activate
Install dependencies:
pip install -r requirements.txt
Configure environment variables:
cp .env.example .env
Start the local server:
uvicorn main:app --reload --host 127.0.0.1 --port 8000
Open in browser: Navigate to http://localhost:8000 and allow Web MIDI permissions when prompted.
[!IMPORTANT] Web MIDI requires secure context (
https://orhttp://localhost). Browsers will not permit System Exclusive access over insecure HTTP connections on external IP addresses.
To add support for a new hardware synthesizer:
sysex_adapters/testData/<Manufacturer>_<Model>/.sysex_adapters/:
class NewSynthAdapter:
MANUFACTURER_ID = 0x41 # e.g., Roland
MODEL_ID = 0x16 # e.g., Juno-106
@classmethod
def parse_patch_name(cls, raw_bytes: bytes) -> str:
# Extract ASCII character string from header offset
return raw_bytes[16:26].decode("ascii", errors="ignore").strip()
synth_seo_catalog.py.pytest sysex_adapters/test_<synth_model>.py
bipluk exposes discovery endpoints for Large Language Models and AI web agents:
/static/llms.txt: Plain-text engineering specification and feature summary./openapi.json: Complete machine-readable API definitions with Stripe x-payment-info declarations.GET /api/geoip: Resolves client country and active currency catalog.GET /api/ppp-price?country=AR: Returns dynamic exchange rates, GDP discounts, and Stripe line items for any ISO country code.If you are researching Web MIDI implementation, synthesizer memory decay, or musical instrument software longevity, you may cite our published field studies:
bipluk is engineered and operated by Half Radiation LLC, an independent technology studio organized under the laws of the State of New Mexico, United States.
Half Radiation LLC
1209 Mountain Road PL NE STE N
Albuquerque, NM 87110
United States
Contact: support@bipluk.com
Built for the love of hardware synthesizers. Keep the analog fires burning.
1 commits
Python
52.8%
HTML
42.5%
C++
3.6%
Web-based MIDI SysEx librarian, patch vault, and hardware synth bridge for DX7, Juno-106, D-50, and vintage synthesizers.
1
stars
1
commits
Python
primary language
Sep 14, 2026
updated
The open-source browser-native SysEx librarian, patch decapsulator, and cloud vault for vintage hardware synthesizers.
Zero software installation. Zero legacy 32-bit drivers. Sample-accurate Web MIDI packet pacing. 110+ synthesizers supported.
If you own vintage hardware synthesizers (from a 1983 Yamaha DX7 or a 1984 Roland Juno-106 to a Sequential Prophet-5 or Korg M1), managing your patch banks has historically been painful:
[!NOTE] bipluk runs entirely inside modern web browsers using the open W3C Web MIDI API. Open a tab, connect your 5-pin DIN or USB-MIDI interface, back up your soundbanks, search patch names by text, and flash banks back to your instrument in one click.
Inside nearly every 1980s and 1990s hardware synthesizer sits a soldered 3-Volt lithium battery (typically a CR2032, BR2325, or rechargeable NiCad/Varta cell) keeping internal static RAM (SRAM) energized while the power switch is off.
[!WARNING] CRITICAL VOLTAGE CLIFF
- 3.2V to 3.0V: Healthy nominal battery voltage.
- 2.8V to 2.6V: Unstable threshold. RAM bit-rot begins, patch names corrupt, and parameters scramble.
- Below 2.5V: Instant memory wipe. The moment voltage collapses or a technician desolders the battery during service, every custom sound designed over the past 10 to 30 years is permanently erased.
flowchart LR
A["π Factory Battery (3.0V)"] --> B["β οΈ Voltage Drops (< 2.6V)"]
B --> C["π₯ SRAM Power Collapses"]
C --> D["β Custom Soundbanks Wiped Forever"]
B -.->|"Emergency bipluk Web MIDI Dump"| E["βοΈ Safe Cloud Vault (.syx)"]
E --> F["π§ Solder New Battery"]
F --> G["β‘ One-Click Restore to Hardware"]
bipluk provides an instant, zero-install emergency backup flow to capture raw .syx binary snapshots before opening the chassis or servicing the motherboard.
performance.now() + offset timestamp scheduling rather than unreliable JavaScript setTimeout(), eliminating UART packet loss and buffer overflow errors on classic instruments..syx files at any time, or send banks back to your gear with one click.[!TIP] Lossless Guarantee: bipluk never converts your soundbank into a proprietary closed format. Your data remains 100% standard uncompressed System Exclusive binary (
.syx), downloadable anytime.
flowchart TD
subgraph Hardware ["Physical Studio Rig"]
Synth["πΉ Vintage Hardware Synth<br>(DX7, Juno-106, Prophet-5, M1)"]
MIDI_IF["π Hardware MIDI Interface<br>(5-pin DIN to USB)"]
Synth <-->|"31.25 kbaud Serial UART"| MIDI_IF
end
subgraph Browser ["Modern Browser (Client)"]
WebMIDI["π W3C Web MIDI API<br>(sysex: true)"]
Scheduler["β±οΈ Microsecond Pacing Engine<br>(performance.now offsets)"]
Decoder["π Binary Stream Decapsulator<br>(ASCII, 7-bit unpack, Checksums)"]
UI["π» bipluk Web Interface<br>(Oscilloscope, Bank Slots, Search)"]
MIDI_IF <-->|"USB-MIDI Packets"| WebMIDI
WebMIDI --> Decoder
Decoder --> UI
UI --> Scheduler
Scheduler -->|"Paced F0...F7 Chunks"| WebMIDI
end
subgraph Cloud ["bipluk Cloud Services"]
Server["π FastAPI Backend Application"]
Vault[("πΎ Encrypted Soundbank Vault<br>SQLite / PostgreSQL")]
PPP["π Live Purchasing Power Parity Engine"]
Stripe["π³ Stripe Payment Gateway"]
Resend["π¬ CAN-SPAM Email System"]
UI <-->|"HTTPS JSON / REST"| Server
Server <--> Vault
Server <--> PPP
Server <--> Stripe
Server --> Resend
end
The physical MIDI specification operates as a 5 mA current loop over shielded twisted pair cable with standard DIN 41524 connectors. The baud rate is defined exactly as:
$$f_{\text{baud}} = 31,250\text{ bits per second} \implies T_{\text{bit}} = \frac{1}{31,250} = 32\ \mu\text{s}$$
Because MIDI transmission is asynchronous, every transferred byte is framed by 1 start bit (logic 0), 8 data bits, and 1 stop bit (logic 1), totaling 10 bit periods per byte frame:
$$T_{\text{frame}} = 10 \times T_{\text{bit}} = 320\ \mu\text{s per byte}$$
The theoretical maximum continuous bandwidth of a physical MIDI line is:
$$\text{Throughput}_{\max} = \frac{31,250\text{ bits/s}}{10\text{ bits/byte}} = 3,125\text{ bytes/second} = 3.125\text{ KB/s}$$
For a standard Yamaha DX7 bulk patch dump (4,096 bytes):
$$T_{\text{transfer}} = \frac{4096\text{ bytes}}{3125\text{ bytes/s}} = 1.31072\text{ seconds}$$
Optocouplers used in 1980s synthesizer inputs (such as the Sharp PC-900 or HP 6N138) have finite rise and fall times:
$$t_r \approx 1.5\ \mu\text{s} \text{ to } 3.0\ \mu\text{s}, \quad t_f \approx 0.5\ \mu\text{s} \text{ to } 1.5\ \mu\text{s}$$
When modern multi-gigahertz host computers blast packets without inter-byte pacing, optocoupler slew asymmetry combined with 1-byte FIFO buffers on vintage microcontrollers (Intel 8031, Zilog Z80) induces frame framing errors and buffer overrun interrupts. bipluk schedules packet dispatches with microsecond timestamps calibrated to vintage receive envelopes.
The MIDI 1.0 standard reserves any byte with the Most Significant Bit (MSB) set to 1 (values $128 \le B \le 255$ or 0x80 to 0xFF) exclusively for Status Bytes (Note On, CC, SysEx start 0xF0, SysEx end 0xF7).
Therefore, all parameter data bytes must satisfy:
$$\text{MSB}(D) = 0 \iff 0 \le D \le 127 \quad (\text{hex: } 0\text{x}00 \text{ to } 0\text{x}7\text{F})$$
To transmit unconstrained 8-bit binary integers ($0 \le X \le 255$) or 12-bit DAC modulation values, synthesizer manufacturers developed distinct data-packing theorems:
Each 8-bit byte $X$ is partitioned into two 4-bit nibbles, with each nibble transmitted in a 7-bit data byte:
$$D_{\text{low}} = X \land 0\text{x}0\text{F}, \quad D_{\text{high}} = (X \gg 4) \land 0\text{x}0\text{F}$$
Reconstruction at receiver:
$$X = (D_{\text{high}} \ll 4) \lor D_{\text{low}}$$
This incurs a data expansion factor of:
$$\text{Expansion Ratio} = \frac{2\text{ transmitted bytes}}{1\text{ source byte}} = 200%$$
Yamaha engineers avoided the 200% overhead by grouping four 8-bit bytes ($B_0, B_1, B_2, B_3$, totaling 32 bits of parameter data) into five 7-bit MIDI bytes ($M_0, M_1, M_2, M_3, M_4$, totaling 35 bits):
$$M_k = B_k \land 0\text{x}7\text{F} \quad \text{for } k \in {0, 1, 2, 3}$$
The fifth byte $M_4$ accumulates the Most Significant Bits of all four source bytes:
$$M_4 = \sum_{k=0}^{3} \left(\frac{B_k \land 0\text{x}80}{0\text{x}80}\right) \cdot 2^k$$
This achieves an efficient transmission ratio:
$$\text{Expansion Ratio} = \frac{5}{4} = 125%$$
bipluk implements automated bidirectional decapsulation for both schemes in real time.
Unlike subtractive analog synthesizers that filter harmonics with operational transconductance amplifiers (OTAs), Casio CZ synthesizers (CZ-101, CZ-1000, CZ-5000) employ Phase Distortion (PD) synthesis.
The output waveform $y(t)$ is generated by reading a pure sine wave look-up table at an angle driven by a piecewise-distorted phase accumulator $\phi_d(t)$:
$$y(t) = \sin(\phi_d(t))$$
The normalized phase accumulator $\phi(t)$ runs linearly from $0$ to $2\pi$ over fundamental period $T = 1/f_0$:
$$\phi(t) = 2\pi f_0 t \pmod{2\pi}$$
Under Casio PD synthesis, an inflection knee $t_k \in (0, T)$ dynamically warps the phase angle:
$$\phi_d(t) = \begin{cases} \left(\frac{\pi}{t_k}\right) t & 0 \le t < t_k \ \pi + \left(\frac{\pi}{T - t_k}\right) (t - t_k) & t_k \le t < T \end{cases}$$
flowchart TD
LinearPhase["Linear Phase Accumulator: Ο(t)"] --> DistortionBlock["Phase Distortion Transfer: Ο_d(t)"]
DistortionBlock --> SineLUT["Sine Look-Up Table: sin(Ο_d(t))"]
SineLUT --> OutputWaveform["Synthesized Waveform: y(t)<br>(Saw, Resonant, Square)"]
When $t_k = T/2$, the phase is undistorted, generating a pure sine wave. When $t_k \to 0$, the phase slope approaches infinity at the start of each cycle, generating a sawtooth harmonic series. Modulating $t_k$ via an 8-stage envelope generator replicates the resonant frequency sweeps of analog VCF filters without physical capacitors or inductors.
Roland GS and LA System Exclusive protocol specifications mandate that the payload data packet (address bytes plus data bytes) satisfies an exact modulo-128 parity condition:
$$\left(\sum_{i=1}^{k} \text{PayloadByte}_i + \text{Checksum}\right) \bmod 128 = 0$$
To derive the required checksum byte from the data payload:
$$\text{Checksum} \equiv -\sum_{i=1}^{k} \text{PayloadByte}_i \pmod{128}$$
Using two's complement arithmetic within a 7-bit field:
$$\text{Checksum} = \left(128 - \left(\sum_{i=1}^{k} \text{PayloadByte}_i \bmod 128\right)\right) \land 0\text{x}7\text{F}$$
If the remainder of the sum is zero, the checksum simplifies to zero:
$$\text{If } \sum \text{PayloadByte}_i \equiv 0 \pmod{128} \implies \text{Checksum} = 0$$
bipluk re-computes and verifies this checksum on every Roland patch transfer to guarantee soundbank integrity before sending byte streams to physical hardware.
The coin cell powering synthesizer volatile SRAM utilizes Lithium Manganese Dioxide chemistry:
$$\text{Li} + \text{Mn}^{\text{IV}}\text{O}_2 \longrightarrow \text{Li}\text{Mn}^{\text{III}}\text{O}_2$$
The terminal cell voltage $V_{\text{terminal}}$ as a function of drawn capacity $Q(t) = \int I(t) dt$ follows:
$$V_{\text{terminal}}(t) = V_{\text{open}} - I_{\text{load}} \cdot R_{\text{internal}}(Q) - \frac{RT}{F} \ln\left(\frac{C_{\text{active}}}{C_0 - Q(t)}\right)$$
Cell Voltage (V)
3.2V |-------------------\
3.0V | \
2.8V | SAFE RETENTION \ UNSTABLE REGION
2.6V | \
2.4V |-----------------------\================== MEMORY LOSS
2.0V | \
0.0V +---------------------------------------------> Time (Years)
For over 90% of the battery service life (typically 10 to 20 years with typical SRAM standby currents of $0.5\ \mu\text{A}$ to $2.0\ \mu\text{A}$), $V_{\text{terminal}}$ remains above 2.8V. When remaining capacity drops below 5%, the internal resistance $R_{\text{internal}}$ escalates exponentially from $20\ \Omega$ to over $1,000\ \Omega$.
Once voltage drops beneath the SRAM transistor holding voltage $V_{\text{hold}} \approx 2.4\text{V}$, cross-coupled inverter gates randomly toggle state, corrupting patch data irrevocably.
bipluk includes hardware decoders and SysEx adaptations for historic synthesizers across all major manufacturers:
| Model | Synthesis Engine | Voice Arch | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| DX7 / TX7 | 6-Operator FM (32 Algorithms) | 16 Voices | Packed 32-voice 4096-byte bulk dump decoding | Function 8 -> Memory Protect Internal -> Off |
| DX7II / DX7s | Dual 6-Op FM, Fractional Scaling | 16/32 Voices | Fractional micro-tuning & dual performance dumps | Edit -> 14 Memory Protect -> Internal Off |
| TX81Z / DX11 | 4-Operator FM (8 Waveforms) | 8 Voices | Lately Bass voice parameter & multi-setup dumps | Utility -> Memory Protect -> Off |
| FB-01 | 4-Operator FM (8-part Multitimbral) | 8 Voices | System Setup & voice configuration dumps | System -> Config Protect -> Off |
| FS1R | 8-Operator FM + Formant Synthesis | 16 Voices | Massive 132KB voice and formant bank dumps | Utility -> Protect -> Off |
| Reface DX | Modern 4-Op FM with Continuous Feedback | 8 Voices | JSON-in-SysEx parameter parsing & live sync | Settings -> Memory Protect -> Disabled |
| SY77 / TG77 | AFM + AWM2 Hybrid Synthesis | 16/32 Voices | RCM hybrid voice structure & multi-filter dumps | Utility -> Protect -> Off |
| Model | Synthesis Engine | Filter / Voice Chips | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| Juno-106 | 6-Voice Polyphonic DCO Analog | Roland 80017A VCF/VCA | Native 11-88 Base-8 patch naming & voice chip check | Rear switch -> Memory Protect: SAVE |
| Juno-60 | Polyphonic DCO (DCB / Retrofit) | IR3109 24dB 4-pole | DCB-to-MIDI retrofit dump pacing (Minerva/Tubbutec) | Memory Protect Switch -> Off |
| Jupiter-6 | Subtractive Analog Polyphonic | Curtis CEM3340 + CEM3360 | Europa firmware SysEx expansion & arpeggio memory | Rear Protect switch -> Off |
| Jupiter-8 | Dual VCO Discrete Analog Poly | Discrete IR3109 | Encore / Groove MIDI SysEx upgrade bulk banks | Memory Protect Switch -> Manual |
| D-50 / D-550 | Linear Arithmetic (LA) Synthesis | Roland LA32 DSP + PCM | Upper/Lower partial split & reverb mode decoding | Tune/Function -> Protect -> Off |
| MKS-50 | 1U Rackmount Alpha Juno Analog | IR3R05 Filter IC | Full Sysex Tone & Patch parameter decapsulation | Protect Switch -> Off |
| MKS-70 | Dual JX-8P Analog Synthesizer | IR3R05 Dual Filters | Colin Fraser V4 / Fred Vecoven firmware dumps | Memory Protect -> Off |
| MKS-80 | Super Jupiter Analog Rack | CEM3340 (Rev 4) / IR3R03 (Rev 5) | Tone & Patch bank decoding with MPG-80 mapping | Memory Protect Switch -> Off |
| JV-1080 / 2080 | 64-Voice 4-Tone PCM Workstation | Roland Custom DSP | Patch, Performance, and Rhythm setup bulk dumps | System -> Protect -> Off |
| XV-3080 / 5080 | 128-Voice Advanced PCM Expander | Roland XV Engine | 32-bit floating point matrix modulation dumps | System -> Utility -> Protect Off |
| JD-800 / JD-990 | Linear Synthesizer PCM Workstation | Super-JD Vintage PCM | 4-tone layered architecture patch decoders | Utility -> Memory Protect -> Off |
| Model | Synthesis Engine | Key Hardware | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| M1 / M1R | AI Synthesis Workstation (PCM) | 16-bit PCM ROM | 100 Programs + 100 Combinations bulk dump | Global -> Page 5 -> Protect Internal -> Off |
| Wavestation | Advanced Vector & Wave Sequencing | Dual 16-bit DACs | Performance, Patch, and Wave Sequence dumps | Global -> Page 2 -> Memory Protect -> Off |
| DW-8000 / EX-8000 | Digital Waveform + Analog VCF | NJM2069 24dB VCF | DWGS waveform parameter & arpeggiator banks | Rear Protect Switch -> Off |
| MS2000 / MS2000R | DSP Analog Modeling (OASYS-derived) | Dual DSP Engine | Single patch & 16-step modulation sequence dump | Global -> Protect -> Disable |
| microKORG | 4-Voice Virtual Analog + Vocoder | Korg MS DSP | 128-preset bank parsing & vocoder settings | Shift + Key 8 -> Protect -> Off |
| Minilogue XD | 4-Voice Analog + Multi-Engine Digital | Discrete Analog + SDK | User oscillator & FX slot SysEx configuration | Global Settings -> SysEx Dump -> Enable |
| Model | Architecture | Voice / Filter Chips | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| Prophet-5 (Rev 2/3/4) | 5-Voice Polyphonic VCO Analog | SSM2040 / CEM3320 / Rev 4 | Native Rev 4 SysEx & Rev 3.3 MIDI cassette dumps | Globals -> MIDI SysEx -> Dump/Load Enable |
| Prophet-6 | 6-Voice Discrete VCO Analog | Discrete 4-Pole Lowpass | Program & Global settings bulk dump parsing | Globals -> Page 8 -> SysEx: All |
| Prophet-600 | First Commercial MIDI Synth | CEM3340 VCOs + CEM3372 | Factory & GliGli custom firmware SysEx support | Ensure Memory Protect switch is unlocked |
| Prophet-08 / Rev2 | 8/16-Voice DCO Analog Polyphonic | Curtis CEM3396 | Layer A + Layer B dual-stack voice parsing | Globals -> MIDI SysEx -> All |
| OB-6 | 6-Voice Discrete Oberheim Analog | SEM-inspired State-Variable | 500 User + 500 Factory preset decoders | Globals -> MIDI SysEx -> On |
| Trigon-6 | 3-VCO Ladder Filter Analog Poly | Discrete 3-VCOs + Ladder | 500 Preset bank backup and restore | Globals -> SysEx Dump -> All |
| Take 5 | 5-Voice Compact VCO Polyphonic | Dual Analog VCOs + SSM VCF | 128-patch live bank capture & rename | Globals -> MIDI SysEx -> All |
| Tempest | 6-Voice Analog Drum Machine | Dual Analog + Dual Digital | Sound & Beat SysEx project decapsulation | System -> SysEx Dump |
| Model | Synthesis Engine | Filter Hardware | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| Matrix-1000 | 1,000 Analog Patches in 1U Rack | CEM3396 Voice-on-Chip | Bank 0 & 1 User RAM SysEx librarian flow | Unlock Memory Protect via Front Panel Code |
| Matrix-6 / 6R | 6-Voice Matrix Modulation Analog | Dual CEM3396 ICs | Quick Voice & Master Matrix routing dumps | Master -> Parameter 08 -> Protect Off |
| OB-8 | 8-Voice Discrete Dual VCO Analog | Curtis CEM3320 VCF | Page 2 MIDI SysEx retrofits & factory dumps | Rear Memory Protect Switch -> Off |
| Model | Synthesis Engine | Key Architecture | Key SysEx Feature | Memory Protect Bypass |
|---|---|---|---|---|
| CZ-101 / CZ-1000 | Phase Distortion (PD) Synthesis | Dual Line DCO/DCW/DCA | 16 Internal + 16 Cartridge preset un-packer | Memory Protect Switch -> Disable |
| CZ-3000 / CZ-5000 | 8/16-Voice Full-Key PD Synthesizer | Dual Line + 8-Track Sequencer | Voice data & onboard sequencer track dumps | Protect switch on rear panel -> Off |
| VZ-1 / VZ-10M | Interactive Phase Distortion (iPD) | 8-Module Digital Engine | Multi-channel operation & patch data backup | Utility -> Memory Protect -> Off |
F0 ... F7).Explore in-depth technical specifications, factory patch listings, filter schematics, and memory protect guides on the live bipluk wiki:
| Synthesizer | Architecture Profile | Era | Live Interactive Wiki Link |
|---|---|---|---|
| Yamaha DX7 | 6-Operator FM, 32 Algorithms, John Chowning DAC | 1983 | bipluk.com/dx7 |
| Roland Juno-106 | 6-Voice DCO Analog, 80017A Filter/VCA, Stereo Chorus | 1984 | bipluk.com/juno-106 |
| Korg M1 | 16-bit PCM Workstation, AI Synthesis Engine | 1988 | bipluk.com/m1 |
| Roland Jupiter-6 | Multi-mode Resonant Analog Poly, CEM3340 VCOs | 1983 | bipluk.com/jupiter-6 |
| Casio CZ-101 | Phase Distortion (PD) Synthesis, Dual DCO/DCW/DCA | 1984 | bipluk.com/cz-101 |
| Roland D-50 | Linear Arithmetic (LA) Synthesis, 32 partials | 1987 | bipluk.com/d-50 |
| Sequential Prophet-5 | Rev 2/3/4 Curtis CEM & SSM Analog VCOs | 1978 / 2020 | bipluk.com/prophet-5 |
| Sequential Prophet-600 | First MIDI Synthesizer, GliGli High-Speed Mod | 1982 | bipluk.com/prophet-600 |
| Oberheim Matrix-1000 | 1,000 Patches, Dual CEM3396 Voice-on-Chip | 1988 | bipluk.com/matrix-1000 |
| Yamaha TX81Z | 4-Op FM, 8 Waveforms, Lately Bass Module | 1986 | bipluk.com/tx81z |
| Roland Juno-60 | DCB / Retrofit DCO Analog Polyphonic | 1982 | bipluk.com/juno-60 |
| Korg Wavestation | Vector Synthesis & Dynamic Wave Sequencing | 1990 | bipluk.com/korg-wavestation |
| Alesis Andromeda A6 | 16-Voice True Discrete Dual-Filter Analog | 2000 | bipluk.com/alesis-andromeda-a6 |
| Access Virus C | Virtual Analog Polyphonic DSP Synthesizer | 2002 | bipluk.com/access-virus-c |
| Moog Voyager | Bob Moog Analog Monosynth, Dual Ladder Filters | 2002 | bipluk.com/moog-voyager |
| Black Corp Kijimi | RSF Polykobol Inspired Discrete Analog | 2018 | bipluk.com/bc-kijimi |
Standard JavaScript setTimeout() and setInterval() run on an unprioritized browser event loop clamped to 4ms with significant jitter. Blasting a 4096-byte Yamaha DX7 bank or a 32KB Roland D-50 dump without exact inter-packet delays chokes the synthesizer UART buffer, resulting in checksum errors.
sequenceDiagram
autonumber
actor User as Musician / Producer
participant Browser as bipluk Engine (Browser)
participant Driver as Web MIDI Output Queue
participant Synth as Vintage Synth UART (8031 CPU)
User->>Browser: Click "Send Soundbank to Synth"
Note over Browser: Calculate microsecond offsets via performance.now()
Browser->>Driver: output.send(Chunk 0, T0)
Driver->>Synth: 256 bytes over 31.25 kbaud
Note over Synth: Process into SRAM & calculate checksum
Browser->>Driver: output.send(Chunk 1, T0 + 40ms)
Driver->>Synth: 256 bytes (Buffer safe!)
Browser->>Driver: output.send(Chunk 2, T0 + 80ms)
Driver->>Synth: 256 bytes (Buffer safe!)
Note over Synth: Bank Write Complete (0 Errors)
// Sample-accurate Web MIDI packet pacing implementation
function sendSysExWithPacing(midiOutput, bytes, chunkSize = 256, delayMs = 40) {
const startTime = performance.now();
let offset = 0;
for (let i = 0; i < bytes.length; i += chunkSize) {
const chunk = bytes.slice(i, i + chunkSize);
const targetTimestamp = startTime + offset;
// Dispatched directly to the OS MIDI scheduler
midiOutput.send(chunk, targetTimestamp);
offset += delayMs;
}
}
Synthesizers like the Roland Juno-106, Juno-60, and Sequential Prophet-5 feature front panels with 8 bank buttons and 8 patch buttons (numbered 1 to 8). Decimal indexing (0 to 63) confuses musicians during live sets. bipluk natively converts these to physical labels:
$$\text{Display Number} = \left(\left\lfloor \frac{\text{index}}{8} \right\rfloor + 1\right) \times 10 + \left((\text{index} \bmod 8) + 1\right)$$
(Index 0 maps to Patch 11, Index 63 maps to Patch 88).
| Feature | bipluk | MIDI-OX | Snoize SysEx Librarian | SoundTower | MIDI Quest |
|---|---|---|---|---|---|
| Platform | Any modern web browser | Windows only (x86) | macOS only | Windows / macOS | Windows / macOS |
| Setup Time | 0 Seconds (Zero Install) | Manual .exe setup | Manual .dmg setup | Heavy desktop app | Heavy desktop app |
| Deprecation Risk | None (W3C Web Standard) | High (Abandoned) | Medium (macOS updates) | High (Version locks) | High (Version locks) |
| Patch Search | Instant fuzzy search | None | None | Limited | Proprietary DB |
| Packet Pacing | Microsecond timestamp | Manual buffer tweaks | Fixed millisecond delay | Model-specific | Model-specific |
| Mobile / ChromeOS | Supported | Not supported | Not supported | Not supported | Not supported |
| Pricing Model | $39 Lifetime / Free tier | Free (Abandoned) | Free / Open Source | $199 per synth | $399 per version |
.
βββ main.py # FastAPI backend application, routing, and discovery
βββ ppp_pricing.py # Dynamic Purchasing Power Parity (PPP) engine
βββ synth_seo_catalog.py # Programmatic SEO matrix for 110+ synthesizers
βββ faq_knowledge.py # Structured FAQ and technical knowledge base
βββ settings.py # Environment configuration & credential management
βββ database.py # Database models, soundbank vault & user sessions
βββ sysex_adapters/ # Hardware-specific SysEx decoding test suites & parsers
β βββ testData/ # Authentic raw .syx dumps from vintage synthesizers
β βββ test_*.py # Automated test suites for DX7, Juno, M1, OB-6, etc.
βββ knobkraft_src/ # KnobKraft Orm integration adaptations
βββ templates/ # Modern Jinja2 templates (Lapis & Studio themes)
β βββ landing.html # High-converting homepage & live Web MIDI demo
β βββ index.html # Authenticated user dashboard & soundbank manager
β βββ wiki_detail.html # Programmatic synthesizer wiki documentation
β βββ blog_web_midi.html # Technical engineering log on Web MIDI pacing
β βββ blog_sysex_7bit_packing.html # Guide to 7-bit MIDI byte packing & decapsulation
β βββ email_*.html # 13 CAN-SPAM compliant transactional email templates
βββ static/ # High-resolution pixel art, SVGs, and brand assets
βββ logo.svg # Pixelated brand mark
βββ llms.txt # AI agent context discovery documentation
Clone the repository:
git clone https://github.com/maxcomperatore/bipluk.com.git
cd bipluk.com
Create and activate a virtual environment:
python -m venv venv
# On Windows:
.\venv\Scripts\Activate.ps1
# On macOS/Linux:
source venv/bin/activate
Install dependencies:
pip install -r requirements.txt
Configure environment variables:
cp .env.example .env
Start the local server:
uvicorn main:app --reload --host 127.0.0.1 --port 8000
Open in browser: Navigate to http://localhost:8000 and allow Web MIDI permissions when prompted.
[!IMPORTANT] Web MIDI requires secure context (
https://orhttp://localhost). Browsers will not permit System Exclusive access over insecure HTTP connections on external IP addresses.
To add support for a new hardware synthesizer:
sysex_adapters/testData/<Manufacturer>_<Model>/.sysex_adapters/:
class NewSynthAdapter:
MANUFACTURER_ID = 0x41 # e.g., Roland
MODEL_ID = 0x16 # e.g., Juno-106
@classmethod
def parse_patch_name(cls, raw_bytes: bytes) -> str:
# Extract ASCII character string from header offset
return raw_bytes[16:26].decode("ascii", errors="ignore").strip()
synth_seo_catalog.py.pytest sysex_adapters/test_<synth_model>.py
bipluk exposes discovery endpoints for Large Language Models and AI web agents:
/static/llms.txt: Plain-text engineering specification and feature summary./openapi.json: Complete machine-readable API definitions with Stripe x-payment-info declarations.GET /api/geoip: Resolves client country and active currency catalog.GET /api/ppp-price?country=AR: Returns dynamic exchange rates, GDP discounts, and Stripe line items for any ISO country code.If you are researching Web MIDI implementation, synthesizer memory decay, or musical instrument software longevity, you may cite our published field studies:
bipluk is engineered and operated by Half Radiation LLC, an independent technology studio organized under the laws of the State of New Mexico, United States.
Half Radiation LLC
1209 Mountain Road PL NE STE N
Albuquerque, NM 87110
United States
Contact: support@bipluk.com
Built for the love of hardware synthesizers. Keep the analog fires burning.
1 commits
Python
52.8%
HTML
42.5%
C++
3.6%