HISE Logo Forum
    • Categories
    • Register
    • Login

    Midi Player?

    Scheduled Pinned Locked Moved Documentation Discussions
    36 Posts 8 Posters 4.0k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Dan KorneffD
      Dan Korneff @Christoph Hart
      last edited by Dan Korneff

      @Christoph-Hart said in Midi Player?:

      it would require to divide the notes into multiple "clips"

      I'm thumbing thru the MidiPlayer API and found:

      getNoteRectangleList(var targetBounds)
      
      This converts the MIDI data in the current sequence to a list of rectangles for each note scaled to fill the rectangle supplied as argument.
      

      The description says

      The most simple application of this is to draw a piano-roll content into a Panel. 
      

      @Christoph-Hart Can you use a panel as a "clip" with this? I'm checking out the example code, but unsure how to properly populate "note". @Dominik-Mayer any insight on this?

          for(note in list)
          {
              // `note` is a array with 4 numbers and can be passed
              // into all Graphic API functions pretty conveniently.
              g.fillRect(note);
          }
      

      I'm also seeing

      setRepaintOnPositionChange(var shouldRepaintPanel)
      
      If true, the panel will get a repaint() call whenever the playback position changes.
      

      description:

      By default this is off, but if you need your connected Panel to repaint during playback (eg. to display a ruler that indicates the position), set this to true and it repaint() will be called periodically during playback
      

      would this Ruler be similar to the timeline ruler in the pic above?

      Dan Korneff - Producer / Mixer / Audio Nerd

      1 Reply Last reply Reply Quote 0
      • Christoph HartC
        Christoph Hart
        last edited by

        Making a ruler and showing the contents of a clip is the smallest problem (in fact these are trivial to achieve with the API calls you listed above).

        The problem which you won't be able to overcome is to combine multiple MIDI files into a timeline, and drag them around as entity.

        I've modified the example from the docs to use a panel to display the position and content of the MIDI file which should get you started on the basics:

        HiseSnippet 2049.3oc4Y8+aabaE+NaeE0JyEoaEC6GIBFvNuncQxeIN.EEwxx1wZI1VUxMMnEEAz2wSGStiTkGkc0Jx9ab+oj+C1dOxS5NYq5ooktgto3.K936Q995mGIcWkLjkmKUNtqew3gLG2ekW+wBcR6DJW3z4PG2Ow6TZtloHVRGLdHMOmE435t5yPBtquli4y6e5AzTpHjURxw4kRdH6E7LttjZ28eNOM8XZD6BdVEt2Y+NgRQaYpbDnOq50vYHM7szArynHaq3439QGEw0RUeMUyxcbW6.Yz39IxqEV9eIOmeYJCGzzoOrPVxGKSiPMFo5zNgmF0chcm63350szKrp0K7Ydmxi3SoW5MtuYBRoDU8GtqbWpWy+4pWi4odqVQ89nIAIi5kRGyTSBRcNrCwRo4LJU6QJESn6y99QrYBNu+oEScgBbyUo+Bob3QBJnpQUI6t5rl2pKl4caSxA09i4oLz7bmL.3FMEHLeHUScby8dxVAhKd7yeR6d85zIH3zu7nu4MsBBBdUPPqftAY7d8unyVeCPIXbPva1ausFDz5jyggu4g6sUbbqsMeu0SxhiCdU2fSD+4tm8WXsO3331shia1pSuGFdR2fjCCB16gOOHvA0ixrMWL+rOeffpGo.ZdmMJ6.JXAUbJmIy3v7lJnBh2e+CYh4QF8qfySoqVgXc1y3ncpDwWyFw+Tu9gJ9Pc4Lnu52TPsLeb1XucVmUjddjMpEORDp4RAgFEclTy7S4455jvDpPvRqSD.MwnrKYp5jqXoxPtdbcxPYNGkpNIkIFnS1r1OVi.ethpHYjufbjX.WvBBULHq3TPIfB1SvLZk+letgyrfblFMC+r.beOWTcBjxYlc0uTApxvKKTE+I5T0IaaUd+BiXlcDBd4ZZ1P+BUb.S2GFBocGKUe4HHNvTG.Zct+DabyB4mZfxEx.kSMPo0.iiqNycYgxeZiPtjFA4gShTUsFLVGLbTdheVA4RJRfx61nF9uG8HxEI7bx0.BMIArRB.FaxLH4EHHA0POSJ3Y91u6yqgRzJJhPIWBoWIDYrg67ZSSxpSZVm73Fvu1Zu5D72v1ciY2tXV36MB181yu6j4C1E4X6aywdEbrUPyehEYusJXYaiJL0deFSCZuhEyTn4QzRhNgQL.pCM.pA0f9R4ZSFARt.lE7.ldkXLoDO1+AUghevlVWTm3atnjHIKW7GzjD5ULBULl.aBjcnIoRn0XTcx0LTRAiEg5jM+CzTV1P83oQCRLWkqqwi8qnYA77iPt72bR0JrPssKfTvHWBFx0bcBYmGsCQCoXj7InbFtqtT180em5jcrgt2YLnyjWCJH4Mi.+BB3XLOLkZN9Ov5hfbRMgqKLCbEnjgJ4Pl0kVwdTxLfwfZUUh3THOsn16Evl3mhAvo.ZRgEWwGM20AMjbyohim6bsAWtRllh0xyYZr5ScWB5OEujlNhMkQ.1d1Vk0VrVkEY.UXTJ5H35yGxlN1ZoSnzvYpAVkTocUkpwblCakjlSu51VcB91W0wzXFZrTPqqI9o4nE5dH6J3nd1tUq6cHK+sZ4PmEtU1875.qoJlBGQYdsvZtlWwtFjQeK6XELXpD9OtAfqraiF1x5xp0tT.OEKTmHKTp1VlMDJBDZ+GXm9A2Tp+0qwQ4monQB.4g5Kjlcv2tOHaUYBf26wFBmrTetnaA3M1JX.yWqfrIypZEE4sKxYO4HMzFveRpn+.SR2ffX.vtUZpu83y4AWpfbHbIVG9w.Xi0lewLk1Cr8l5AZJrqo1JqusgAjVCcAPF9ZdjNweyRBmv3CRz9a9cSVb3mXos0FgKL6ylaXfQ9Q6uJverLjavZK1PXQo.jfDNFZNDShxQvCpEP.YeF4QPDP77PZpEQDQYFhtmbRDjYKxA+QdPoLyHcLikBXKLC9dnwKaLInI20rq.TnwxQft+VVkEXfo4rwgN0udcBWaBMkLgtdHtH.P6otRi6.6W0nJulu7NiOqPsdlhdowPDRUFE7cfogflWBGIe5Qu1X54Q.J2NF1sf+I4P9aR9i2L9UnDS22HE8Zy9pFAfDVxCBPpu.Suf8wbxOrSZiaG6KLrZuC9+ub.gu2GJP3p2m7WZ.xHuE3ev0I0lY2XBhLVL4vAK6i8r3NN+P48RNY+wkCd89WiIVvchbux0wIwjXfi9qla3eKPe3dyxnQo3MhpdYZ7EDJl.Boy.7if6PIsd7LWAcwugciE9A.VT08S85x0gIyWeWYN5KDY94VeKduhM7NJNFvdJU107N9UK6iSrbpxmXUk640GPPLMMMJxu0Ll703obeFSvTnSs4c7NR+sE8cjFtvuiz4.p7UrKTTAzlIelEtOKieATNjWk3WkCGvf888vnbU5skvs+m2Tu+oGCF4bkoOdrZS5RqLnIwL28+lunxGlGLZs+K7dVe3q192GbX0EScmiGzs6sdWz6Cow30tORfOCAPA0weM.qFSGkpmPc175SkB4vDofGVMn2ioU7ACXpp59bMnVZ8LuL2mseOVJiVMA92uO1ulp.+DaI8EMWbewcEu9cdV0kfEij+2.Te0++DT2dIiAmRgD0ev9rm8ArzPVwCUkiM5WAwCsiafisfohHyf+N7oXxl3X2hIaNYx+irGYzPk70g1yTg4xergBX2Bya7tt2o3XRSGyIGA47fi65jAHhuNLDc2+Iv+LeY1ZIjY6kPlcVBY1cIj4wKgL6sDx7j6TFrYTqQZYlsTDHz8H6eM.2o+AIbW04evx051q
        
        Dan KorneffD 1 Reply Last reply Reply Quote 1
        • Dan KorneffD
          Dan Korneff @Christoph Hart
          last edited by Dan Korneff

          @Christoph-Hart Thanks for the update!
          I'm doing a little tinkering but can't quite wrap my head around it's functionality.
          I've added a play + stop button to your example (using the property editor), but get unexpected results. Pressing play will only play 1 random note, and when I hit stop, the midi player switches to an empty sequence.
          What's the proper way to to add controls to the player?

          HiseSnippet 2167.3oc4Y8+aaabEmz1LqVcNHcqXX+3gfAL5EOFI+k3.TTDKK+MsDaqJ4lFzhtryjGkXB4crGOYEsh.r+M1+I6Oi8mR9OX68tijhxVwUUsaCqU1Fh26du6806y634NRgOKKSHsrW8hwoLK6eoSuwb0fVCnQbq1GXYeWmSoYJljXHs+3TZVFKvx1d4iQB1qthk9y6dx9zXJ2mMgjk0yEQ9rmEkDolPsydOMJN9HZ.6hnjJbu8ds8E7VhXwPvdV1otUJ0+0z9rynHaK4XYemCChTBYOEUwxrrWYeQv3dCDi3F9edTVzkwLbPCqdvBYHejHN.sXjpUqAQwAcJ76LKKamNShBKahBeryoQAQkzmDMtmdBxDIpFOrW51LuFe2lW8YYdKWw7tSQRRadwzwLYQRp8AsIFJMlxnZMTJYbUO12LjMUx4cOIepKjPXtJ8mIDoGxofoFTkr8xS6dKOet2McIKz5OJJlgtmcw.fazUfz7ATE0xNy4wa5wu3QO8ws51scaOuS+rC+xW0zyy6EddM853kD0s2Es27KAJdi87d0t6tYeulmbNL7UOX2MCCatk94lONILz6Ec7Ng+m5b1ek0Z+iBa0LLrQy1cef+Ic7Fbfm2tO3oddVncLoZyFqO6E0mSUCk.MmyFlrOE7fJAkyDIQv75cP4Du2dGv3yhLFWgfmTUcGhIXOUf1pRFeESF+ib54KiRUSlAiU+5bpSpGmN2al0ZIgiCYsZgC49pHAmPCBNSnXtwQYpMH9CnbNKdCBGnwGlbIStA4JVrvORMdCRpHKBkZCRLi2WMX8ZeaMB74JpjjP9Txg79QblmujAUEmBFArg8DrhV5t9mn4LwKioP2vMwC0647pSfTNSqU2IFPUFddto3VXSUmrkw3cychozHj7xTzjT2bSrOS0CFBkcGIje1PHOvj6CVclagOtdt7kNnXtbPQoCJLNXXX0YtMOT79cBwB5DjGTjop5MXt1KcX1.2jbxSnH.JucsZ3OO7gjKFDkQFAHzjAfWR.vXckAIKGAwqFFYhgHyW80eRMThlAADJ4Rn7Z.QDp4NqVYQ1FjFaPdTc3qM2cCB9MntqM6V4yBOW2amaN+NEy6sCxwV2jicy4XSuFumEY2MyYYKsIT5uGyTf0KYgLI5dDkfnFvHZ.0TMfpWMnuTlRWQfjygYgHftWIlSlfG6d+pPw2ecSHpc30WTRffkw+8Jx.5ULBkOl.JApNTjXAzZLXCxHFJImwBPaxT+AVJKIUMtLaPBijYpZQgtUrLunrCQtbWuX2JrPsLKffyHWBNxnH0.x1ObahBJwHYEnbZtqtTF85t8FjsMot2pcnyDi.Cj7pgPbAAbztGVRMi3G3cAPMohDoxcCbEnjToHkYBoU7GoHAXzqVUiHLFpSy268LPItwXBrDPSvM3Jtn6tJXgjqOUX3LmqEDxkh3Xbu7LlF28IuMAcKwKowCYkLBv1S2pr170pLuBnBiBdadj57TV4XimVPotUoCVkzD+pJUs6LC1lPZF8paYrI3oOustwLzXImVGc9SEgdn8Arqfi5Y5VspyArrWqDoVycqrOzoMrlxPJbDkY0BqwJN4Z0Kg9Z1QRXPoDtOpNfqrS85ls0S1s1gB3o3F0BYgspsDIovl.tx89lou+0k56+dbT9o1zH.fbe0EBsFbM5AYqJS.7dWVJbxR047N4f2Xqf9LWkDplzqpQTj2NHmcECUPa.2hRQ295ht9dg.fcy3XWywmy7tTB0P3RrJ7qFvF2a9oSs0tuo2TWvRAsFa1Y8U00fzJnK.xvWDEnF3t9DBmvh5OP4t9WWr3vugBSqMRDWqm0WSCi7sluxweLLjowZyUHrnT.RP.GCMCxIAYH3A0.HfrOk7HHBHdlOM1fHhnLoX3IiD.U17LHdj4MQlojNjwhArElFe2WGk0tDzjaD6J.EZrXHX6ulUYA5qaNqCnkw0QChT5TyDlvPOjW3.ncYnTGNv9U0qxq9g2piY4l0wR5kZGgKjITH1AtFBZdIbj7xidsV44Q.J2LG1Im+hZH20I+gqm+xMhR8FHoiz5UND.ILj66gTeFVdA5QexOrSZ8al6ycrZuE96+e.gc9wBD91PIsWJ2p.VUZ7t6li2s+PkRvsh.Xs63f4LKs8N0A+mKY6g.q4x5XqEcQflgWMr.Izx9WXz2ZEXy31Js59.GCBj0aPkcWPWiwG9GvCivRqRy+uLZuA5xiRJ+sWtGMNVL5.IsOb109fkrj0M046O9nU4etPk+cvUkzfHwwRwvTSlHsHGzN3FuDbJUBuIGzgn8jUbdUuND+lIoFwdiKGjNdue.lQu2SWw64bpHXXL9JiUusA7JVxm.p4mpyH18Cv7Tim5czm+qfn9beCIyq49QNchT9Cls8tzLrWb6x+gs27KzYMmCCCAv4IF6JNG8hE81aVLS4tFS4Cc5APr5SUnMjeidL4KvWC3XFmIwfZia4h19my6EskN2Wz14PaqqXWHobnOb1TKbOVRzEvVlrpD+7L3DXruoKlkqRukfJm4Tu6IGAN4LkoG9dG5xklIPWzotbjqekSeuuQsYdgeq7+fK76G+ca+vAGVd9L2YDAs6biKN9dPYLduDGxw6oAnf13uB51DRGFqJnNcc8oBtHcffG4WMo2kojQ86yjUs8Y5PMUpot5xOdutrXFsZA7uaO7.MTIDmXKXrnw7GKts70u0wXtDbyH4mFf5K+ySPcyag0+TJTn9Fy8B2CvR8Y42jGdXS3rNnn5w0KNnVOFOPO3eAexmrAN1NexFES9eEcjP8khW5aNzIVK+AZJfey0WB9pNmhiIMJOtoC79.VI.h3K88wv8eDhOyVlMW.Y1ZAjY6EPlcV.YdzBHytKfLO9VkAaF0bnRjX1JBD5bn4eWhc4+wF6ks92.YvWttA

          Dan Korneff - Producer / Mixer / Audio Nerd

          ulrikU 1 Reply Last reply Reply Quote 0
          • ulrikU
            ulrik @Dan Korneff
            last edited by ulrik

            @dustbro if you use the "create generic script reference" on the MidiPlayer
            and paste it in initCallback

            const var MIDIPlay = Synth.getMidiProcessor("MIDI Player1");
            

            you can use this code to enable disable the play function

            inline function onPlayControl(component, value)
            {
            	MIDIPlay.setAttribute(1, value);
            	MIDIPlay.setAttribute(0, !value);
            };
            

            Attribut 1 is Play and 0 is Stop

            However you have to disconnect the "Play" btn from "Property editor"

            this function above make only use of the Play btn value, but you've set the buttons in a radio group so the stopbtn will set the playbtn to value = 0

            Hise Develop branch
            MacOs 15.3.1, Xcode 16.2
            http://musikboden.se

            Dan KorneffD 3 Replies Last reply Reply Quote 1
            • Dan KorneffD
              Dan Korneff @ulrik
              last edited by

              @ulrik Thanks for that! What about changing the sequence? Could I make an array of sequences and push that to a combobox?

              Dan Korneff - Producer / Mixer / Audio Nerd

              1 Reply Last reply Reply Quote 0
              • Dan KorneffD
                Dan Korneff @ulrik
                last edited by Dan Korneff

                @ulrik the suggested code is two thumbs up here.
                @Christoph-Hart When the STOP command is selected, the midi player removes the sequence. Any insight on that?

                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.
                

                it also throws this in the console

                Interface:! Line 17, column 18: no iterable type

                Dan Korneff - Producer / Mixer / Audio Nerd

                1 Reply Last reply Reply Quote 0
                • Dan KorneffD
                  Dan Korneff @ulrik
                  last edited by

                  @ulrik any insight on how to script the midi player to playback different sequences?
                  Like if I drag in 5 different midi files, it creates 5 sequences.. how do you get it to play the different sequences back to back?
                  The end game is to be able to assemble an entire song and have playback follow the DAW timeline.
                  I saw @Christoph-Hart added a bunch of new midiplayer functionality the other day. Very thankful for that!

                  Dan Korneff - Producer / Mixer / Audio Nerd

                  ulrikU 1 Reply Last reply Reply Quote 0
                  • ulrikU
                    ulrik @Dan Korneff
                    last edited by ulrik

                    @dustbro I've never used multitrack but I guess you should make use of

                    MidiPlayer.setFile();
                    

                    .... for loading
                    and use

                    getPlaybackPosition()
                    

                    together with a timer to check when

                    MidiPlayer.getPlaybackPosition()
                    

                    reached -0, the file is ended and then use "

                    MidiPlay.setTrack(int trackIndex)
                    

                    to start next sequence

                    Hise Develop branch
                    MacOs 15.3.1, Xcode 16.2
                    http://musikboden.se

                    Dan KorneffD 1 Reply Last reply Reply Quote 1
                    • Dan KorneffD
                      Dan Korneff @ulrik
                      last edited by

                      @ulrik thanks for that! I saw in the API that it recommended not hot swapping tracks. Maybe there's a similar call for sequence?

                      Dan Korneff - Producer / Mixer / Audio Nerd

                      1 Reply Last reply Reply Quote 0
                      • Christoph HartC
                        Christoph Hart
                        last edited by

                        Now there is :)

                        Dan KorneffD 1 Reply Last reply Reply Quote 2
                        • Dan KorneffD
                          Dan Korneff @Christoph Hart
                          last edited by

                          @Christoph-Hart I'm thinking that I'll need some playhead info to create a midi sequencer...
                          When I remove these comments, HISE wont compile

                          void 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);
                          }
                          

                          Dan Korneff - Producer / Mixer / Audio Nerd

                          1 Reply Last reply Reply Quote 0
                          • Dan KorneffD
                            Dan Korneff
                            last edited by

                            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?

                            Dan Korneff - Producer / Mixer / Audio Nerd

                            1 Reply Last reply Reply Quote 0
                            • Dan KorneffD
                              Dan Korneff
                              last edited by

                              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

                              Dan Korneff - Producer / Mixer / Audio Nerd

                              ustkU 1 Reply Last reply Reply Quote 1
                              • ustkU
                                ustk @Dan Korneff
                                last edited by

                                @dustbro Very interesting tinkering ;)
                                I have no idea how the midiPlayer works, but maybe defering your script will remove the error...

                                Can't help pressing F5 in the forum...

                                1 Reply Last reply Reply Quote 0
                                • Christoph HartC
                                  Christoph Hart
                                  last edited by

                                  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.

                                  Dan KorneffD 1 Reply Last reply Reply Quote 0
                                  • Dan KorneffD
                                    Dan Korneff @Christoph Hart
                                    last edited by

                                    @Christoph-Hart Gonna give this a go today.

                                    Dan Korneff - Producer / Mixer / Audio Nerd

                                    1 Reply Last reply Reply Quote 0
                                    • L
                                      LeeC
                                      last edited by LeeC

                                      @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!

                                      1 Reply Last reply Reply Quote 0
                                      • L
                                        LeeC
                                        last edited by

                                        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?

                                        1 Reply Last reply Reply Quote 2
                                        • First post
                                          Last post

                                        27

                                        Online

                                        1.7k

                                        Users

                                        11.8k

                                        Topics

                                        102.7k

                                        Posts