Midi Player?
-
@ulrik thanks for that! I saw in the API that it recommended not hot swapping tracks. Maybe there's a similar call for sequence?
-
Now there is :)
-
@Christoph-Hart I'm thinking that I'll need some playhead info to create a midi sequencer...
When I remove these comments, HISE wont compilevoid MainController::storePlayheadIntoDynamicObject(AudioPlayHead::CurrentPositionInfo &/*newPosition*/) { //static const Identifier bpmId("bpm"); //static const Identifier timeSigNumerator("timeSigNumerator"); //static const Identifier timeSigDenominator("timeSigDenominator"); //static const Identifier timeInSamples("timeInSamples"); //static const Identifier timeInSeconds("timeInSeconds"); //static const Identifier editOriginTime("editOriginTime"); //static const Identifier ppqPosition("ppqPosition"); //static const Identifier ppqPositionOfLastBarStart("ppqPositionOfLastBarStart"); //static const Identifier frameRate("frameRate"); //static const Identifier isPlaying("isPlaying"); //static const Identifier isRecording("isRecording"); //static const Identifier ppqLoopStart("ppqLoopStart"); //static const Identifier ppqLoopEnd("ppqLoopEnd"); //static const Identifier isLooping("isLooping"); //ScopedLock sl(getLock()); //hostInfo->setProperty(bpmId, newPosition.bpm); //hostInfo->setProperty(timeSigNumerator, newPosition.timeSigNumerator); //hostInfo->setProperty(timeSigDenominator, newPosition.timeSigDenominator); //hostInfo->setProperty(timeInSamples, newPosition.timeInSamples); //hostInfo->setProperty(timeInSeconds, newPosition.timeInSeconds); //hostInfo->setProperty(editOriginTime, newPosition.editOriginTime); //hostInfo->setProperty(ppqPosition, newPosition.ppqPosition); //hostInfo->setProperty(ppqPositionOfLastBarStart, newPosition.ppqPositionOfLastBarStart); //hostInfo->setProperty(frameRate, newPosition.frameRate); //hostInfo->setProperty(isPlaying, newPosition.isPlaying); //hostInfo->setProperty(isRecording, newPosition.isRecording); //hostInfo->setProperty(ppqLoopStart, newPosition.ppqLoopStart); //hostInfo->setProperty(ppqLoopEnd, newPosition.ppqLoopEnd); //hostInfo->setProperty(isLooping, newPosition.isLooping); }
-
Wanna dig up this old thread. Having some fun with the Midi Player but need some help regarding playback position.
I'm using a midi note to trigger a midi file. All works well, but the playback always begins at the beginning of the file. How are you guys setting playback to start relative to the DAW transport?I see we have
.setPlaybackPosition(var newPosition)
what function do we call to get a position I can pass into here?
-
Did some more tinkering.
I've enabled:const Identifier ppqPosition("ppqPosition"); const Identifier ppqPositionOfLastBarStart("ppqPositionOfLastBarStart");
Using the ppqPosition, I'm able to get a value starting at 0 and increasing by 1 per quarter note. So bar 1 starts at 0, bar 2 starts at 4, bar 3 starts at 8, etc...
The midi player playback position is expecting a value between 0 and 1, so I enabled ppqPositionOfLastBarStart, and with that I'm able to create a formula that gives me a range of 0-1 per bar.// get position on timeline var position = Engine.getPlayHead().ppqPosition; // get last bar value var last = Engine.getPlayHead().ppqPositionOfLastBarStart; // calculate position per bar var currentpostition = (position - last)/4;
Once I have that value, I'm using this code to set the position and sync playback
var timeStamp = Message.getTimestamp(); MidiPlayer.setPlaybackPosition(currentpostition); MidiPlayer.play(timeStamp);
but... the midi file it still starting playback from the beginning of the file, no matter where the playback head is in the DAW.
On another note, I started this script in HISE standalone. All worked well, but I couldn't properly use ppqPosition and ppqPositionOfLastBarStart. Since there was no transport to get info from, I'd always get a value of 0.
So I built up the plugin version so I can run the script inside a host and get real time values (which worked) but when I trigger playback of the midiplayer, I get this error pointing to the line of code I'm using for ppq Engine.getPlayHead().ppqPosition:Illegal operation in audio thread: HeapBlock allocation
-
@dustbro Very interesting tinkering ;)
I have no idea how the midiPlayer works, but maybe defering your script will remove the error... -
What if you call
Engine.getPlayhead()
in the onInit callback and then just use the updated properties in other callback? It throws this error because you're creating an object with this method in a realtime context. -
@Christoph-Hart Gonna give this a go today.
-
@dustbro said in Midi Player?:
HiseSnippet 2221.3oc4Y8+aaabEmzNLqVcNHcqXX+3sfAL5EMFIam3.DTTKKamnkXGUK2jfVTjcl7nDSHui83IqpEDf9mv9Sa+oz+C1du632jsrqfZ1FVqhCr36du68488im6KE9rrLgzxdsSmlxrr+0NClxUi5NhFws5suk8sbNhloXRhgzdSSoYYr.Ka6UeLRvdsaXo+7Ce9dzXJ2mUQxx5EhHe1yhRhTUT6u6SihiOjFvNMJoF2auaOeAuqHVLFvypNsrRo9ukNjcLEYaEGK6adPPjRHGnnJVlk8M1SDLcvHwDtg+WDkEcVLCens0.XiLjOTDGfHFoZ0cTTbP+B6Nyxx1oekWXUiW3ScNJJHpjdk2315EHURT2eXux0Au1+3vq07f2p0f2MKBRZ3ESmxjEAod62iXnzdFP0crTx3pArucL6BAm7kNUBt45wwmIDoGvo.TCpS1d0YMuUWLy6xljEh9CihYn4YW7.vMZJPXdephZYm47vM83m9fm9vtmbRudddG8EG7Uuoimm2q775302KI5jAm1ayuBn3M0y6M6rylC857jmCO9l6tylggc1R+8NOLILz6U88dB+u1+3+Nq6dGF1sSXX6N8N4t9Oou2n88714tO0yyBwQU1lMleNHZHmpFKAZNGONYOJXA0bJGKRhf00UP4Du8t6y3yiL5WAmmTUOHXb1y3nspEwugIh+INC7kQoppUPe0uMmZU93rwdypVqHcbVuA9uvwbeUjfSnAAGKTL23nLUSh+HJmyhaR3.M93jyXxljyYwB+H0zljTQVDJUSRLiOTMZiFuqAA9bNURRHeF4.9vHNyyWxfDii.b.0rOASpkta7HMmIdYLEZItIdndeNu9BHki0Z0sB.0Y3E4Pws.S0WrqA7t4FwLZDheYJZRpaNDGxTCfGgLuCExuXLDJXx8.Tm4VXiajKeoAJVHCTTZfBiAFFVekqyBEWsQHVRifb2hHUcqAi0doiyF4ljSthh.n7dSNx8tG4zQQYjIPSZxHvJIP+XclAIKuIhWCzyDCdlu9adTCThNAADJ4LH8ZDQDp4NqQYRVSR6ljGzB90l6zjf+FT2EVcq7Ugu2x69Wd86Wrt28QN15xbrSNGa509J1jc1LmkszPnzdeLSAnWxBYRz7HJAQMhQz8TS08T8Z.ilxT5LBjbdmVvCnGWhwjpVxt2od236rgwE0K7haJIPvx3+IEYD8bFgxmR.k.YGJRr.lNFzjLggRxYr.DSl7O.orjT0zxnAILRloZDE5VCYdQYGfb4tQQ0JrQcMaffyHmAFxjH0Hx12aahBRwHYEM5zbWeqL50c6ljsMgt2qMniES..RdyXvuf8bzlGlRMG+GXcAPNohDoxMCbGnjToHkYbo0rGoHAXzqQcPDFC4o40dOCThaLF.KanI3l9Jtn4tFfPxEWJLbtq0Eb4RQbLVKOmkwpO40InaY+RZ7XVIiPm6YmV1XwlVlmATiQAuGOR87TV4yFKsfRKqRCrNoJ6pNUs4LG1pHMmw0cMXB91W1SOaFlsjSquN9ohPKzde14vo8LCrVyYeV1aUhTqEdZ1G6zC1SYHENkx7lhk33jqUuD5aYGJgGJkv8Asf9J2uUKSYcU0ZeJzOEKTKjEJU6JRRgh.tx8NlkuCJ0OkJbSqjYJZDPibe0oBsFbM5AYrNSP68SXovgKUOm2Ou4MNJXHyUIgrI89ZDE4sOx4IhwJXLfaQpn6PcR2PuPngcm3XWyIny7NSB4P3VrF7itgMVa9YyTZOzLa5D.ofViMUVecKcSZELE.Y3kQApQtaTQ3IrngiTta7MEaN7SnvLZiDw05Yi00sQdm4W48eLLjo60lqPXSoPKAAbRzLHlDjgMOnlFBH6yHO1DADOymFa5HhcYRQ2SFI.xr4Yf+HyqRlYjNjwhgdKLc+cesWVaRvPtIrygtPSEiAr+VVsMXnd3r1gV5WmLJRoCMULgtdHtvgl1ktRs6.mW0pNu5u7dsOKGVOVROSaHbgLgB9NvzvllmAmJu7nWqWddDfxkig8y4uHGxcCxe9hwubPTp2.IchVuxwPSBC4gdH0mgoWfdzm7Cmj15xw9bCqw6g+OS4FfjqtXCV7JJ0tTcVQqgqnTKhGCnrd+Xjihdx9E5rns75MdGJ0ZEpCCqcTJYzYigIasKX6QWIKfK3OTxy60f35rQSZiFLcowwXrwcFHVXG++y.LmOTCvttIL1qjiJfUkdVwsxmUr2XkRvshfQB2zAcjVZ7B3x17xrKhbCvAR4xU68sVlwZvaVWDzsr+UFctdwbMrkjVkejio6s02Uovl6Ns5gg6NAKOKI72lr6HcIVIku+06BYPhI6KoCgy+ODPzJV0zsyOlepR0e+Kqo5+wzckzfHwikhwoy3NVvMW6LqYWhZad5Ut4W9z.214HQv3X7skqeQK3sKku.juNyIBvo9Pud0zYtdhE+1WZsvWNzhB2Owoejxez7w6JyAuXp9+gwa9cYstyAggvPoJvdCmCe0xdwUKGTtkAJery.nostOuFH+N8yjWhu9yiYblDcpsul6X7etn2wX5BeGiOGFWeN6TIkCm+HalMd.KI5TnPHqNwuLCN4I6aOAixybYZBpbtK8Ce9gfQNWYFfuukNcoSBb5gYtWnKdaaeXtLwa7+f657Ce01O8lCqtXvcNdP69W5NyuMjFi2GyAb79o.JHF+MvjhP53XUA0YyqORvEoiD7H+5A8SXv4MFNjIqi84ZPvISl4Va+zcOgEyn0Sf+i6hGjiJA+DaI8EsWbew0Eu98NF3RvhQxOOZpu5uLapad6ygGQgD0uybk3Cfdo9r7avDOnHb9DTT8ysJNf1.FOP+v+B9juXa7Y67EaWr3+UzQB0WJdsu4PiXt7Goo.1MWe++q4bD9Loc4wLcf2CxJA5H9Zeezc+W.+y7kYykPlsVBY1dIj49KgLOXIjYmkPlGdsxfCi5LVIRLkh.g9GX9KEYW9GqxdUq+Md7mAJ.
Hey @dustbro @ulrik , finally decided to dive into making use of the midi player but it seems a bit glitchy and unpredictable.
Simply trying to put together an interface that will control the Stop, Play & Record buttons of the midi player alongside a panel to allow drag and dropping of midi files.
I see that you kind of attempted it with Play & Stop a while back with the snippet you posted above but it wasn't quite there with unresolved issues and it doesn't play back the loaded midi file.
Any thoughts, suggestions or snippets welcome.
If anybody else has any ideas please chime in
Cheers and have a good day!
-
Managed to figure this out in the end.
Still haven't found a way to use a floating (or anything else) to be able drag midi into a DAW though...
Anybody managed to do this with the midi player?