尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A browser-based music editor for the AddmusicK SPC engine
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A browser-based AddmusicK 1.0.11 music editor. It has live music previewing capabilities thanks to the in-browser SPC engine.
Installing AddmusicK is not needed, nor is a ROM. The tool is a static site and works entirely client-side in any modern-day browser.
Try it → · Porter's manual → — what it does, and every control in it.
AddmusicK is the custom music tool that SMW Central uses. Porting music with Addmusic has always been one of my favourite things to do in this hobby. What was never fun was the loop around it: to actually hear a port, you had to insert it into the ROM, open an emulator, and go to the level that plays it. When you change around notes, you have to repeat this process. Nowadays, AddmusicK has a "porter mode" that makes this process easier, but still requires switching windows.
So the idea was to make a single tool for everything custom music-related. Write it, hear it, edit it, even export it, without leaving this one window. I hope to make custom music more accessible to people, this way.
AddmusicK, in my opinion, also has room to grow past SMW: the same engine has potential for other games, and even for homebrew. A huge library of music is available at SMW Central.
#amk 1, #amk 2, #amk 4, #am4, #amm. (#amk 3 is unsupported, the same as in AddmusicK itself.)snes_spc as a WebAssembly module..brr files or whole .bnk banks, see what each sample
costs in ARAM, and mark them as important for use in global songs or sound effects.t54 as a tempo in BPM,
@2 as the sample it actually plays, $F1 as a delay in milliseconds and a buffer size in KiB,
and any other hex command as its name with its arguments decoded.$F5 are the least readable thing in
the language, so put the cursor on one and you get a frequency-response plot, named presets
(including Super Mario World's own filter, verbatim), a dark-to-bright tone control, and
FIRcon-style draw-a-curve-and-fit. It plots the echo tail repeat by repeat, since the filter is
inside the feedback loop and each pass is filtered again; it shades the region below ~2 kHz where
eight taps at 32 kHz have no real say; and it warns when the feedback and the filter together
make an echo that builds up instead of dying away. Edits go straight back into the MML, so with
Hot Reload on you hear the change on the running song..spc, or the raw song-data .bin.web/src/app/changelog/changelog-data.ts — add a block at the top when you add a feature.See the GitHub Issues for a list of ideas, planned features and known issues.
An npm workspace: four framework-free packages and the Angular editor that imports them. Every command runs from the repository root.
npm install
npm start # dev server on http://localhost:4200/
Node 24 is what CI uses.
| Command | What it does |
|---|---|
npm start | Dev server on http://localhost:4200/. |
npm run build | Production build, output in web/dist/. |
npm run watch | Dev-configuration build with --watch, no server. |
npm run lint | ESLint over every workspace. |
npm run format | Prettier over the workspace. |
npm run check | The merge gate: formatting, three typechecks, fourteen harnesses. |
npm run check is what CI runs. The fourteen harnesses pin the compiler, the scanner, SPC assembly,
the headless MML → SPC → PCM chain, the worklet, BRR decoding, the echo FIR and the envelope maths
against known-good byte output. scripts/README.md says what each one actually proves.
Three things run automatically before the commands above (via pre* npm hooks), so you never need
to invoke them yourself: the audio worklet is bundled with esbuild, the SPC package's driver and
emulator assets are mirrored into web/public/, and the current commit SHA is written to a
gitignored file that powers the top bar's commit link. The SHA is captured once when the dev server
starts, so it goes stale if you commit while npm start keeps running — restart to refresh it.
The premise the whole project rests on is that producing a playable SPC file is mostly data assembly. The driver, the SPC header and the sample set are all static bytes, already supplied by AddmusicK. The song data is the only thing that has to be compiled at runtime.
Four packages, and an editor that imports them. Each has a README.md of its own.
| Path | What lives there |
|---|---|
packages/core/ | Types, AddmusicK's constant tables, hex formatting |
packages/mml-compiler/ | The MML compiler — preprocessor, parser, linker |
packages/mml-tokens/ | The scanner behind highlighting and the command inspector |
packages/spc/ | SPC assembly, BRR, the echo FIR, the emulator host and the worklet |
web/ | The Angular editor |
Nothing in packages/ touches a framework or the DOM beyond three fetch calls, which is what lets
the same modules run in Node under the test harnesses, on the main thread, and inside an audio
worklet.
On testing: npm run check runs fourteen byte-level harnesses — see scripts/README.md. Separately,
scripts/Compare-Spc.ps1 and Compare-SongBin.ps1 diff this compiler's output against a native
AddmusicK build, byte for byte.
Contributions are very welcome, but please read this part first, because I would rather be honest than get you halfway into a pull request before you find out.
Effectively all of the code in this repository was written by AI. It works, it is tested, and I have read and steered it to the best of my abilities, but it has not had the kind of human touch that a codebase deserves before people build on it. Expect inconsistencies, over-engineering in some places and cut corners in others, and expect to spend longer than usual working out why something is the way it is.
For now, I'd rather you test the application functionally, and report bugs, submit ideas or feature requests, than try to contribute code, until the codebase is more... maintainable. I will be working on that, but it is a slow process.
Practical bits: npm run check should pass before you open a PR. If you are planning
something large, please talk to me first, partly so we do not duplicate work, and partly
because there are certain directions I want to take the project to.
This project stands on other people's work:
snes_spc, the SPC700 emulator core that makes any of this audible.MIT - see LICENSE.
The bundled third-party material keeps its own terms. The emulator core is LGPL 2.1, and
the driver bundle under packages/spc/assets/driver/ is AddmusicK output whose #default samples
originate from Super Mario World; LICENSE spells both out.
I am Ersanio - GitHub · SMW Central.
The best way to reach me is a Discord DM, I am in the SnesLab and SMW Central Discord servers. Failing that, a private message on SMW Central works too.
I might also request a project channel on the SnesLab server, if there is enough interest.