Paste a channel-data .s file (the kind included from soundChannelData.s) to get its assembled byte count — for the "Bytes" column on the Custom_Music wiki table. Everything runs in your browser; nothing is uploaded.

Total bytes (decimal)
0
Total bytes (hex)
0x0
Parse log
Limitations
  • Byte costs are derived from include/musicMacros.s's macro definitions (note, beat, rest, sust/rest2/release, vol, env, cmdf0, cmdf2-cmdf5, duty, pitchSlide, vibrato, pitchOffset, goto, cmdff, octave/octaved/octaveu/inline ou/od, tempo) — it does not run a real assembler, so a typo'd or unsupported macro is skipped and flagged in the parse log rather than silently guessed.
  • .macro NAME ... .endm is understood, including \1-\9 WLA-DX argument placeholders (mml2wla's own repeat-block/pattern-macro output, this project's own hand-written convention, e.g. horseRace.s's m_HorseRaceBanjoBeat1, and any other macro defined directly in the file): a macro's body costs nothing on its own — it's stored as-is, then re-evaluated fresh for every call, substituting that call's own arguments into \1-\9 first. This means a .rept \N count or a note/beat pitch-vs-r distinction driven by an argument comes out right per call, even when two calls to the same macro pass different arguments. .rept N ... .endr is understood the same way, nestable, whether at file scope or inside a macro body; its body is counted once and multiplied by its count. An unclosed block at end of file is flagged rather than silently dropped.
  • .if/.ifdef/.ifndef/.else/.endif/.fail are not evaluated — everything inside is counted as if the condition were true (matching that .fail itself never emits bytes). If a file has real conditional variation, check the log.
  • /* ... */ block comments are stripped before parsing (in addition to ; line comments), including ones spanning multiple lines.
  • NOTE_END_WAIT is tracked starting at 0 and updated on any .redefine NOTE_END_WAIT n line encountered, matching the beat macro's own behavior of shortening notes and inserting a rest once it's nonzero. Any other .define/.redefine (e.g. a noise/wave alias's own .redefine NAME $XX) costs 0 bytes, matching that it's assemble-time-only.
  • Raw .db/.dw/.dsb/.dsw lines are counted directly (1, 2, N, or N×2 bytes respectively) for files that write bytes by hand instead of via macros.
  • Per-channel totals are attributed to the most recent label ending in ChannelN — other labels (loop targets, local @-labels, etc.) don't start a new section.