MyGo 云音乐
用 Go 与 MyGo 写成的第三方网易云音乐桌面客户端。原生界面,没有 WebView;边下边播,无损与 Hi-Res,逐字歌词与「律动」,刘海播放器。
Translation pending
Chompfe: an 8-voice wavetable synth in the browser.
Translation pending
MediaJavaScript · C++GitHub @CDMGamingOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Chompfe: an 8-voice wavetable synth in the browser, built on the open-source CHOMPI WAVE engine (MIT). Unofficial.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A wavetable synth and a sampler with a tape looper, in the browser. Share it
as a link, play it with the computer keyboard, the mouse, or a MIDI controller.
It runs two engines from the open-source CHOMPI firmware by
CHOMPI Club (MIT), each compiled to
WebAssembly unchanged and run in an AudioWorklet at 48 kHz:Read the full README ↗Play it: https://cdmgaming.github.io/chompfe/
A wavetable synth and a sampler with a tape looper, in the browser. Share it as a link, play it with the computer keyboard, the mouse, or a MIDI controller.
It runs two engines from the open-source CHOMPI firmware by CHOMPI Club (MIT), each compiled to WebAssembly unchanged and run in an AudioWorklet at 48 kHz:
The controls, step grid, LED display and controller support are new.
Chompfe is an independent project, not affiliated with or endorsed by CHOMPI Club or Chase Bliss. CHOMPI is a trademark of CHOMPI Club.
| Phase | What | State |
|---|---|---|
| 1 | Engine → WASM, factory tables, computer-keyboard play | done |
| 2 | Full on-screen controls, loop recorder + step grid, presets, URL sharing | done |
| 3 | Ableton Push 1 profile, MIDI input | done (untested on hardware) |
| 4 | Arturia MiniLab mkII profile, generic MIDI learn | done (untested on hardware) |
| 5 | Your own wavetables + guide | done |
| 6 | TAPE: sampler, factory sounds, tape looper, effects pre/post, recording, WAVE → TAPE bridge | done |
Any static file server works, because the app is just files in web/. For
local use, tools/serve.mjs (Node, no dependencies) serves web/ with caching
turned off, so a reload always picks up changes:
node tools/serve.mjs
tools/serve.py does the same with Python, but on Windows it stalls on the
parallel requests TAPE makes when it loads a bank of sounds, so prefer the Node
one. (If you use another server and changes don't show up, hard-reload with
Ctrl+Shift+R.)
Then open http://localhost:8080 and click tap to wake it up.
Browsers only allow AudioWorklets on https:// or localhost, so opening
index.html straight from disk won't work.
Chompfe is laid out like the WAVE firmware's hardware (its workflow, not its look): six push-button knobs, a mode switch, a star key, PLAY and LOOP, and a 25-key keybed. It adds an LED display, which the hardware doesn't have, for readouts, the wavetable, the loop and step-by-step prompts. labels (top right) shows or hides the tags on every control, and the line under the panel explains whatever you point at.
| Knob | Page 1 | Page 1 + shift | Page 2 | Page 2 + shift |
|---|---|---|---|---|
| Pitch | fine tune | half-steps | scan the wavetable | change table |
| Attack | attack | coarse attack | vibrato depth | vibrato rate |
| Decay | release | coarse release | filter LFO depth | filter LFO rate |
| Effects | delay ← → reverb | delay time / reverb size | filter | resonance |
| Tempo | tempo | clock divide | ||
| Volume | volume | compressor | pan | compressor |
A S D F G H J K L ; ' are white keys and
W E T Y U O P black keys. Z/X octave, C/V velocity. With Shift
held, they reach the keybed's shift functions (A = slot 1, W = «, ...).
Space = PLAY, Enter = LOOP, Q = rest.Below the panel are drawers for things the hardware doesn't have: the loop as a 32-step grid, sounds and sharing, wavetables (view, import, export), every parameter on its own knob (handy for MIDI learn), and a cheat sheet.
Click tape at the top right of the panel (it remembers). The same face relabels for the TAPE firmware; the tape guide drawer under it has recipes and the knob table. In short:
Computer keys play TAPE the same way (A = middle C, the sample's own pitch); Space / Enter are PLAY / LOOP and Q is the star key.
| Button | Key | What it does |
|---|---|---|
| play | Space | Start/stop the loop |
| loop | Enter | Tap: arm/disarm recording. Hold ~1.25 s: delete the last step |
| play + loop | Space+Enter | Hold both ~1.25 s: clear the loop |
| rest / mute | Q | While recording: add a rest. Otherwise: hold to mute the loop |
Recording works two ways:
MIDI keyboards and pads record too.
The same 32 steps are shown as a grid. The selected note is the last note you played (shown next to the loop length). Click a step to put the selected note there; click a step that already has it to make it a rest (right-click or Delete also clears). Click past the end to extend the loop. Drag a step up/down (or scroll, or use the arrow keys) to change its note. Tempo, tap tempo, step length and gate (10 / 50 / 100 %, the hardware's three choices) are next to it.
#.Click load your own… under the wavetable slots, or drag a file onto a slot. Chompfe works out what it is:
clm chunk). 33 frames fit exactly; other
counts are spread across the 33 frames.WAV works in every browser. MP3, M4A (phone voice memos), OGG and FLAC work where the browser can decode them (Chrome and Edge decode all of these; Safari decodes MP3/M4A).
The new table is loaded into the slot straight away, so you can play while you adjust. keep it saves it in this browser (it's still there next visit); cancel puts the old table back. Under the slots:
clm chunk), so
other wavetable synths can open it, and it should also load on the original
hardware's SD card (not tested on hardware).Share links carry settings, not tables, because a table is ~270 KB. If your
sound uses your own table, send the .wav along with the link; your friend
drops it into the same slot.
How it works. The oscillator plays one 2048-sample cycle at a time, and the Frame knob moves through 33 of them. A good table is a sound that changes over time, captured one cycle at a time: frame 1 is the start of your stretch, frame 33 the end. When you play, the table follows your keyboard; the pitch of the recording doesn't matter.
There are two ways to turn a recording into frames (auto picks for you):
Recording tips
In Chompfe
Good to know
Click connect MIDI in Chrome or Edge. Safari has no Web MIDI. Firefox puts Web MIDI behind a one-time "site permission add-on" for each site; on a local server it may just refuse with "WebMIDI requires a site permission add-on to activate". Use Chrome or Edge for controllers (the computer keyboard and mouse work everywhere). Allow SysEx when asked; the Push display needs it. Devices are recognised by port name. Once connected, the MIDI button opens a panel listing your devices and learned mappings.
Anything without a built-in profile plays notes (any channel, recorded into the loop), with pitch bend (±2 semitones on top of the Pitch knob), sustain (CC 64) and the mod wheel on vibrato depth. It also understands the hardware firmware's own CC map, so a DAW or controller set up for the original works:
| CC | CC | ||
|---|---|---|---|
| 20 | Pitch | 26 | Frame |
| 21 | Attack | 27 | Vibrato depth |
| 22 | Release | 28 | Wobble depth |
| 23 | Delay / Reverb | 29 | Filter |
| 25 | Level | 30 | Pan |
| 14 | Rest / mute key | 15 | Loop key |
With TAPE up, it speaks TAPE's own map instead (ui.h): CC 20–25 set the six knobs (Speed, Start, End, Magic, Tape, Volume) on their current page, CC 26 / 27 are PLAY / LOOP; notes play TAPE (MIDI 24–72, middle C = the sample's own pitch; in CUBBI the white keys are the kit).
MIDI → learn a control…, click anything on screen (a knob, an on/off switch, the octave/step/gate buttons, a wavetable or sound slot, play / loop / rest / tap / clear), then move a knob or press a button on any controller. Chompfe works out whether it's an absolute knob, a relative encoder or a button; you can change that in the MIDI panel. Mappings are per device, saved in this browser, and take priority over the built-in layouts. Controls with a mapping get a small blue dot. Esc or done ends learn mode.
Works with the factory preset (memory 1, "Analog Lab"); the CC/note numbers were cross-checked against Ardour's MiniLab mkII map and two other drivers.
| Knob | Knob | ||
|---|---|---|---|
| 1 (endless) | Frame scan; click = first frame | 9 (endless) | Wavetable; click = cycle octave |
| 2 | Pitch | 10 | Wobble amount |
| 3 | Attack | 11 | Wobble rate |
| 4 | Release | 12 | Vibrato amount |
| 5 | Filter | 13 | Vibrato rate |
| 6 | Resonance | 14 | Delay time / size |
| 7 | Delay / Reverb | 15 | Squash |
| 8 | Level | 16 | Tempo |
With TAPE up: knobs 2–6 are Speed, Start, End, Magic and Volume (on their current page), knob 8 the output level, endless knob 1 the Tape knob (click: back to 1x) and endless knob 9 the Magic knob (click: next page). Pads 1–8 are sounds 1–8 (CUBBI: play them; JAMMI: pick one). Pads 9–16: JAMMI, CUBBI, FX before/after the tape, input (mic → line → resample), PLAY, LOOP, the star key (press on, press off) and the mode switch.
Plug it in. Quit Live first (on Windows only one program can use a MIDI port at a time). Chompfe switches the Push into Live mode, writes the display and LEDs on its first port, and listens on both of its ports.
If something doesn't respond, open the MIDI panel: the Incoming box shows every message as it arrives and which port it came on.
[enc1] [enc2] [enc3] [enc4] [enc5] [enc6] [enc7] [enc8] [tempo] [swing=frame] [master=out]
┌──────────────────────────── LCD ───────────────────────────┐
│ param names │
│ values │
│ bar graphs │
│ Sound Motion Out/Seq Scale <snd snd> sound loop │ <- labels for the row below
└────────────────────────────────────────────────────────────┘
[Sound][Motion][Out/Seq][Scale][<snd][snd>][ ][ ] upper row: pages, previous/next sound
[ r ][ r ][ r ][ r ][ r ][ r ][ r ][ r ] lower row: reset (or toggle) the knob above
┌─────────── pads ───────────┐ [gate 10%]
│ steps 1-8 │ [gate 50%] scene buttons
│ steps 9-16 (Session) │ [gate 100%]
│ steps 17-24 │ [1/4] [1/8.] [1/8] [1/8T] [1/16] step length
│ steps 25-32 │
│ in-key keys (4 rows) │
└────────────────────────────┘
| Page | Encoders 1-8 |
|---|---|
| Sound | Table, Frame, Pitch, Filter, Resonance, Attack, Release, Delay/Reverb |
| Motion | Wobble amount/rate/on, Vibrato amount/rate/on, FX time, Octave |
| Out/Seq | Squash, Level, Pan, Tempo, Step length, Gate, Loop length, Output level |
| Scale | Root, Scale, In key / chromatic, Pad octave |
TAPE on the Push. Upper-row button 8 (">TAPE" on the display) switches to TAPE, and the Push follows:
The MIDI details (SysEx display format, pad/encoder/button numbers, LED colour
values) were checked against Ableton's own Push remote script, not guessed.
node tools/push1-test.mjs checks the profile against a fake Push.
Every push to main publishes web/ to GitHub Pages
(.github/workflows/pages.yml). Any other static host works too; upload the
web/ folder.
The compiled web/chompfe.wasm and web/tape.wasm are committed, so you
only need this if you change the C++.
emsdk install latest && emsdk activate latest).bash engine/build.sh builds WAVE, bash engine/build-tape.sh builds TAPE
(both look for em++ on PATH, else $EMSDK or ~/emsdk).node tools/render-test.mjs renders test notes offline into test-out/*.wav
and checks pitch, release, reverb tail and sequencer timing.
node tools/push1-test.mjs and node tools/controllers-test.mjs check
the Push, MiniLab, generic and MIDI-learn code against fake devices.
node tools/panel-test.mjs checks the panel against the WAVE manual.
node tools/wavetable-test.mjs checks importing (pitch detection,
one-cycle frames, spectral mode) and the export file layout.
node tools/tape-test.mjs checks the TAPE engine (card, boot copier,
JAMMI / CUBBI, the looper, FX routing, line-in recording) and
node tools/tape-ui-test.mjs drives it through the ported control layer
(shift page, banks, per-slot settings, record / save / copy / erase, the
looper keys). Both need the factory samples in upstream/ (below).The factory TAPE sounds ship as lossless FLAC (web/samples/tape/, ~36 MB
instead of ~112 MB of WAV). python tools/make-tape-samples.py makes them from
the card profile in upstream/ and writes index.json with a checksum per
file; the page decodes each FLAC, checks it against that checksum and hands
the engine the original 16-bit WAV bytes.
To re-vendor from upstream: clone the CHOMPI repo into upstream/ and run
bash engine/vendor.sh (WAVE and TAPE sources). It records the commit in
engine/vendor/UPSTREAM.txt.
engine/
vendor/firmware/ DSP headers from firmware/chompi-wave/code/src, byte-identical
vendor/DaisySP/ DaisySP as shipped with the firmware (Electrosmith, MIT)
vendor/libDaisy/ just util/FIFO.h (Electrosmith, MIT)
shim/ stand-ins for the hardware: daisy.h, fatfs.h,
FileStreamingManager.h, hardware.h
src/chompfe.cpp the C API: init, process, note on/off, params, tables,
sequencer, MIDI-out queue
vendor/tape/ TAPE 2.0 engine sources (DSPEngine, looper, sampler, file
copier, effects), byte-identical
vendor/coreJSON/ coreJSON (FreeRTOS / Amazon, MIT), as TAPE ships it
shim-tape/ TAPE's hardware stand-ins: an in-memory FatFs "SD card"
(memfs.cpp), daisy.h; override/ holds the one portability
fix (Warble.h, a wasm32 overload ambiguity)
src/tape.cpp TAPE's C API: init, process, card files, boot scan, keys,
engine setters and getters
web/
chompfe.wasm built WAVE engine (no imports, ~40 KB)
tape.wasm built TAPE engine (~90 KB)
samples/tape/ factory TAPE sounds, FLAC, + index.json
js/worklet.js AudioWorkletProcessor that hosts both engines
js/engine.js WAVE wasm wrapper (shared by the worklet and the Node test)
js/tape-engine.js TAPE wasm wrapper (same)
js/cardstore.js your TAPE card changes, kept in the browser (IndexedDB)
js/synth.js AudioContext graph, table loading, messaging
js/params.js parameter names, ranges, value readouts
js/wavetable.js WAV parser, table shaping, recording -> table, export
js/tablestore.js custom tables saved in the browser (IndexedDB)
js/ui/importer.js import dialog
js/patch.js presets, share links, session restore
js/ui/knob.js knob control
js/ui/seqgrid.js 32-step grid
js/app.js UI wiring, keyboards, transport, controller API
js/panel/ the instrument: firmware-ui.js (WAVE's control logic,
ported), tape-ui.js (TAPE's NormalPage / MenuPage, ported),
panel.js (DOM, LEDs, display), ledmatrix.js (display)
js/midi/manager.js Web MIDI, device detection by port name
js/midi/push1.js Push 1 profile
js/midi/minilab2.js MiniLab mkII profile
js/midi/generic.js notes, bend, sustain, firmware CC map
js/midi/learn.js MIDI learn
js/scales.js scales + pad layouts
wavetables/ the 7 factory tables (Serum format)
tools/render-test.mjs offline render + checks
subtractiveEngine.h, WavetableManager.h, the
filter, reverb, delay, limiter, sequencer and clock are compiled as shipped.
Only hardware.h, the SD-card loader, the LED/page UI and the libDaisy
platform layer are replaced (see engine/shim/).System::GetNow() millisecond clock is derived
from the number of samples rendered, so the sequencer is locked to the audio.
The engine runs in 32-sample sub-blocks (the hardware used about 24), because
it starts one queued note per block and a 128-sample block would smear chords.For TAPE:
See LICENSE for the full notices.