top | item 46095474

Show HN: MTXT – Music Text Format

124 points| daninet | 3 months ago |github.com

39 comments

order

gilrain|2 months ago

How does this compare to standard ABC? More capable, presumably, but a comparison would be useful.

https://en.wikipedia.org/wiki/ABC_notation https://abcnotation.com/

daninet|2 months ago

ABC notation is more oriented towards traditional sheet music, with regular note lengths, standard Western tuning and a simple, readable syntax. It isn't meant for playing back music that sounds good to the ear. It's hard to catch the nuances of a real human performance with it, but it works well as a lead sheet for musicians. Its expressive marking are relatively limited and interpreted subjectively.

MTXT focuses on editable recordings of live performances, preserving all of those tiny irregularities that make the music human. It can represent arbitrary timings, subtle expressive variations and even arbitrary tuning systems. MTXT can also capture transitions like crescendos and accelerandos exactly as they happened.

vessenes|2 months ago

Cool. My one concern with this is that it has no horizontally scannable note/chord mode. It’s super common for humans to read a sequence of notes left to right, or write it that way, but it’s also just more efficient in terms of scanning / reading.

Can I suggest a guarded mode that specifies how far apart each given note/chord is by the count, e.g.

  #1.0:verse1 
  Am - C - G - E - F F F F
  #
You could then repeat this or overlay a melody line like

  #0.25:melody1
  C4 - C4 - C4 D4 C4 - D4 - D4 - D4 E4 D4 -
  #
Etc. I think this would be easier to parse and produce for an LLM, and it’s would compile back to the original spec easily as well.

daninet|2 months ago

I considered it but decided against it in the first version, because specifying note durations is too tricky. It was more important to get the .mid -> MTXT conversion and live-performance recording working, where notes usually have irregular note lengths. Representations like "C4 0.333 D4 0.333 E4 0.25" feel too hard to read.

matheusmoreira|2 months ago

To me it seems like files could get hard to understand if events that happen simultaneously aren't horizontally lined up like this:

  2.0 voice1 | voice2 | ...
Like a text version of old school tracker interfaces:

https://youtu.be/eclMFa0mD1c

  POS | TRACK #1 | TRACK #2 | ...

HelloNurse|2 months ago

Aren't the notes adjacent enough on consecutive lines?

  2.0 note Cmaj7 ch=1 
  2.0 note D ch=1 
  2.0 note C dur=0.15 ch=2
  2.1 note C ch=2
  2.1 note Cmaj ch=1

Grom_PE|2 months ago

This made me remember old set of tools called mtx2midi and midi2mtx, I used them to edit some midi files while making sure I'm not introducing any unwanted changes. While roundtrip output was not binary identical, it still sounded the same.

Looks like MTXT tool here does not quite work for this use case, the result of the roundtrip of a midi I tried has a segment folded over, making two separate segments play at the same time while the total duration got shorter.

https://files.catbox.moe/5q44q0.zip (buggy output starts at 42 seconds)

cestith|2 months ago

It reminded me of ABC and the tools abc2midi and midi2abc.

chaosprint|2 months ago

Some simple thoughts:

I feel that one challenge of programming languages is how to remember these rules, formats, and keywords. Even if you're using familiar formats like YAML or JSON, how do you match keywords?

When developing Glicol (http://glicol.org/), I found that if it's based on an audio graph, all node inputs and outputs are all signals, which at least reduces the matching problems. The remaining challenge is ensuring that reference documentation is available at the minimal cost.

rock_artist|2 months ago

Hey, the idea is nice, It would be great to know what pushed you to start this format.

Also, any apps that uses it would benefit from being add to the repo assuring usability in addition to readibility.

daninet|2 months ago

My initial goal was to fix some mistakes in the MIDI files I recorded from my keyboard. I was also interested in making dynamic tempo and expression changes without dealing with complicated DAW GUIs.

Now I'm working on a synth that uses MTXT as its first-class recording format, and it's also pushing me to fine-tune a language model on it.

1313ed01|2 months ago

I like the idea overall. Looks like something that would be fun to combine with music programming languages (SuperCollider/Of etc).

Not so sure how human-friendly the fractional beats are? Is that something that people more into music than I am are comfortable with? I would have expected something like MIDIs "24 ticks per quarter note" instead. And a format like bar.beat.tick. Maybe just because that is what I am used to.

daninet|2 months ago

The library has MIT license, I would be more than happy to see people use it in different synths.

I'm planning to add support for math formulas in beat numbers, something like: "15+/3+/4" = 15.58333

bonzini|2 months ago

It should be fine, but fractions (or both fractions and decimals) would be preferable in order to express triplets (3 over 2, effectively a duration of 0.3333...)

intrasight|2 months ago

I think that for completeness it needs looping and conditional constructs

jasonjmcghee|2 months ago

This would lend itself well to a live-coding/live-music experience.

I played around with a similar idea on my own (very simple / poor) text music environment:

https://github.com/jasonjmcghee/vscode-extension-playground?...

in the middle of making an extension to allow making vs code extensions live because I wanted a faster development feedback loop.

usrusr|2 months ago

Count me in as another one with a longstanding mostly dream project aiming for human enjoyable notation grammar.

For me it was coming from tracker notation (buzz), where i was wildly underwhelmed by all that whitespace for timing (well, empty cells for timing) and the lack of parameterizable macros. A seriously underexplored field, perhaps because almost everybody who ever started got pulled in by the lure of textually defined synthesis.

xrd|2 months ago

I've been spending the last week casually looking at strudel.cc.

They have a notation that looks similar (basically a JavaScript port of the Haskell version).

I like this, but I'm curious why I would want to use this over strudel. Strudel blends the language with a js runtime and that's really powerful and fun.

throw7|2 months ago

It makes no sense to design for llm's. Do what makes sense for the reader and forget that llm's exist at all.

amingilani|2 months ago

What prompted this and why does it not?

giladvdn|2 months ago

Probably stating the obvious here, but this would be a good way for an LLM to attempt to write or modify music.