Hey Martin, thanks for your nice help. The last couple of days I spend some time with [midifile] and your information and now I found a way to record midifiles with [midifile] in a way that ableton understands them correctly. These are the steps that I have to do:
remember my time interval between one quarter note (eg. 500 ms) that my patch uses for [metro] to play melodies. This equals to eg. 60/(500 ms) = 120 bpm.
send meta information to [midifile] for setting time signature and tempo. Setting the tempo causes ableton to change its tempo when the midifile is pasted into a newly opened ableton session. For the time signature "4/4 36 clocks per tick 8 32nd notes per quarter note" I send a [255 88 4 4 2 36 8( to [midifile]. For the tempo of 120 bpm I need to set 500000 microseconds, so I send a [255 81 3 7 161 32( to [midifile]. For setting the tempo there is some math needed. If I want to set 500000 microseconds, first I convert 500000 to hex. This is 0x7A120. Now I need to convert this back to three seperate 8 bit decimal numbers because [midifile] expects it like that (and the midi-standard). So I do: 0x7 = 7, 0xA1 = 161 and 0x20 = 32 and send this to [midifile]. I will need to build a subpatch that does this calculation generically, because in my patch the tempo will vary. I have not thought about it more deeply, but maybe there is a more efficient way of calculating these three numbers.
set [metro 2] to [metro 1] and change set the fps-number that I send to [midifile] equally to my quarter-note-time-interval. With this I get an accurate timing in ableton. Eg for 120 bpm:
[metro 1] | [write myfile.mid 500( |/ [midifile]
Best regards, Jakob
Gesendet: Dienstag, 07. April 2020 um 17:25 Uhr Von: "Martin Peach" chakekatzil@gmail.com An: "Jakob Laue" jakkesprinter@web.de Cc: "Pd-List" pd-list@lists.iem.at Betreff: Re: Re: Re: Re: Re: [PD] including bpm info to midi-recording On Mon, Apr 6, 2020 at 3:27 AM Jakob Laue jakkesprinter@web.de wrote:
Hey Martin, thanks for your hints!
I created a midi file in ableton, exported it and then read it with the midifile-read-help-patch. This is what I get after reading:
midifile: opened /Users/wbjc/Desktop/ableton.mid midifile: Header chunk type: MThd midifile: Header chunk length: 6 midifile: Header chunk format: 0 (Single multichannel track) midifile: Header chunk ntrks: 1 midifile: Header chunk division: 0x60: 96 ticks per quarter note midifile: Track chunk 0 type: MTrk, length 81
And this is what I get after the |dump 0( message:
midifile: Parsing track[0]... midifile: tick 0 delta 0 status FF Meta 0x03 length 1 Sequence/Track Name midifile: tick 0 delta 0 status FF Meta 0x58 length 4 Time Signature 4/4 36 clocks per tick, 8 32nd notes per quarter note midifile: tick 0 delta 0 status FF Meta 0x58 length 4 Time Signature 4/4 36 clocks per tick, 8 32nd notes per quarter note midifile: tick 0 delta 0 status 90 MIDI 0x90 42 64 : channel 1 Note 66 On velocity 100 midifile: tick 24 delta 24 status 80 MIDI 0x80 42 40 : channel 1 Note 66 Off velocity 64 midifile: tick 72 delta 48 status 90 MIDI 0x90 41 64 : channel 1 Note 65 On velocity 100 midifile: tick 96 delta 24 status 80 MIDI 0x80 41 40 : channel 1 Note 65 Off velocity 64 midifile: tick 120 delta 24 status 90 MIDI 0x90 46 64 : channel 1 Note 70 On velocity 100 midifile: tick 144 delta 24 status 80 MIDI 0x80 46 40 : channel 1 Note 70 Off velocity 64 midifile: tick 168 delta 24 status 90 MIDI 0x90 41 64 : channel 1 Note 65 On velocity 100 midifile: tick 192 delta 24 status 80 MIDI 0x80 41 40 : channel 1 Note 65 Off velocity 64 midifile: tick 216 delta 24 status 90 MIDI 0x90 40 64 : channel 1 Note 64 On velocity 100 midifile: tick 240 delta 24 status 80 MIDI 0x80 40 40 : channel 1 Note 64 Off velocity 64 midifile: tick 264 delta 24 status 90 MIDI 0x90 45 64 : channel 1 Note 69 On velocity 100 midifile: tick 288 delta 24 status 80 MIDI 0x80 45 40 : channel 1 Note 69 Off velocity 64 midifile: tick 312 delta 24 status 90 MIDI 0x90 41 64 : channel 1 Note 65 On velocity 100 midifile: tick 336 delta 24 status 80 MIDI 0x80 41 40 : channel 1 Note 65 Off velocity 64 midifile: tick 336 delta 0 status FF Meta 0x2F length 0 ========End of Track 0==========
The differences that I noticed:
In the ableton-file the "header chunk division" is given as "ticks per quarter note", whereas in the midifile-file it is given in "frames per second and ticks per frame".
midifile: Header chunk division: "0x60: 96 ticks per quarter note" midifile: Header chunk division: "0xE714: 25 frames per second, 20 ticks per frame"
In the ableton-file there is an info given about the time signature: "Time Signature 4/4 36 clocks per tick, 8 32nd notes per quarter note"
This info is not present after loading the file that i recorded with [midifile].
You have to add it yourself, since [midifile] has no idea what time signature or tempo you are using (when writing, the ticks don't have to be in real time). With the latest version of [midifile] there is a [meta( message for this. With earlier versions you can write the meta tags directly, for example to get the time signature, Time Signature 4/4 36 clocks per tick, 8 32nd notes per quarter note you can send [255 88 4 4 36 8{ and the tempo [255 81 500000( sets 500000 microseconds per quarter note.
You can find more info here: http://www.music.mcgill.ca/~ich/classes/mumt306/StandardMIDIfileformat.html
Martin
Furthermore, looking at the first lines of the dump-info of the ableton-exported-file, we can see that there is also one note being played at tick 0, but I did not actually put a note there. The same applies for the [midifile]-recorded file. I did not play notes directly after hitting the record-[bang]. I don't know how these notes on the first tick (0) have gotten there.
As a side-note the help-patches that I am using are from 2010 (write-help-patch) and 2011 (read-help-patch). These were included in the mrpeach_v0-0-extended package that I downloaded via deken.
Best, Jakob