Read/Write buffer contents in same external?
I’ve been using an MSP based tape style looper patch for performance over the last couple of years, and it’s evolution has orignally gone from simple MSP objects, next to Gen~, and recently I’ve resorted to modifying some of the third-party externals I’m using (xsample, ipoke~) now that I’ve learned enough C to be slightly dangerous.
Since I’ve already recompiled some of this stuff with my own modifications, I’m wondering if it would be theoretically possible to combine the two processes in a single external, thus writing an input signal to a buffer~ (with interpolation) on the same cycle as reading from that same buffer~’s contents. Is this even feasible, or possibly undesirable for some reason? It seems like it would be easier to maintain offset correction this way, and perhaps write to a secondary buffer for undo capabilities.
I’d love to hear some thoughts, since I don’t really know what I’m doing yet (and less time wasted is more time playing).
It should be possible to write to and read from the buffer~ in the same signal loop, yes; just needs care that the writing & reading happens in the order you need. I wouldn’t recommend writing with interpolation for a tape looper though; better to do the interpolation at read time if possible. What problem needed an interpolating write?
It is possible to do this in gen~ too, though to obtain an explicit order of operation (e.g. write before read) it needs to use GenExpr code.
Thanks Graham :)
Interpolation was a solution for skipped frames when varispeeding > 1x., especially while overdubbing…possibly there was a better way to do things, but at the time I made that decision, [ipoke~] seemed like the most obvious solution. It also offers an internal overdub w/feedback setting which prevents the need for synchronizing offsets between [groove~] and [poke~]/[ipoke~]. I was still having problems with it smearing the entire buffer when traversing between loop end/begin points, so I added some code to deal with that. I also switched from [groove~] to [xgroove~] over the weekend, and timing seems much more precise for the patch now.
I can’t interpolate at read since there are multiple record passes being placed in the same buffer via overdub, and the buffer’s playrate isn’t necesarily moving at the same speed between each pass (which is keying the referencing index to the write process)…ipoke~ fills every frame based on (what was there * feedback ration) + what is input, filling in skipped frames. Am I perhaps missing something? Or is there a more direct approach I’m just missing that would make it immaterial? I’ve been around with this so many times at length it’s possible my eyes are a bit crossed ;)
I started doing all this in gen~ before for() loops were possible, and since [splat] doesn’t do interpolation when reading in reverse, I found other ways of dealing with it. I’d like to do something large like this in gen~ just to get a feel for it’s capabilities, but since this code-base already exists and is OS I figured it might be a good opportunity to learn some C. gen~ has been instrumental for me doing small things on a day to day basis, especially prototyping timing algorithms, but I tend to think it would take me a while to port this much code over to gen~ and have it perform right. Still, I haven’t ruled it out….it would be nice to have something that is completely cross-platform and freezable in a m4l patch, not to mention easily editable. The killjoy for me was not having for() loops (and thus being able to write a custom interpolation method that splat didn’t include), and I haven’t revisited this project since then.
I’d still recommend writing at 1x sample rate and interpolating on the read. The problem with interpolating write is that you are losing information, especially above 2x; the smearing you hear may be due to this.
I’m not sure what features you need, maybe it’s not possible, but ideally it should be. One way to do it is to use multiple buffers and ping-ponging. Overdub by mixing the current output with the current input, rather than += on the source buffer itself. I.e. when making a new take, choose a new buffer (or buffer region, or buffer channel) as destination, and write at sampling rate, mixing in the currently playing source buffer. The new loop can now play back at 1x, or shifted dynamically, but no input information was lost.
Need to run, but maybe later if I have time I’ll throw something together in gen~.
BTW peek/splat will introduce some additional overdub mixing modes in 6.1.
Hi Graham , I am somewhat disappointed , I got better results with a third object that already has quite a few years , ( iPoke~ ) with gen~ and Splat…
I would like(like many on this forum for a long, long time.), do varispeed while recording and while overdubbed .
But any solution in gen sounds crapy.
Even interpolation , sinc interpolation in "read " , etc
but I could not get anything fairly acceptable .
May be, you can a little example what you say in your comment above. (2013 ) ? varispeed record " unlimited overdub "…
It can be done — I think this is something similar to what ipoke~ was doing, but it’s probably not exactly the same (don’t have the ipoke~ code to compare to).
----------begin_max5_patcher---------- 3813.3oc6ck0baiiD9YmeEX0S1ynnP.dIkLdqY2ZeXeXeXeONkKHRHYLlhTK InOlTw+1WbPJQJwCPpCSMURUQVBmc+gFc2.Dn42+vUilG8BIYD3yfuBt5pu+ gqtRljHgqx98UiVgewK.mHK1HunUqHgrQiU4wHuvjoSCWmx.qnujmyZLy6AZ 3x6iIdLUOfrfSLFCfScE+wwP7Ih+I3aY0ILcEMLfvjcELKQpurChl+GeDYMZ aIiRY4E0HK0D1qADYoGIR3Ge3ChOFqIqERdl2I6wYAQX+UjjD.rAVyVwZ1hO bQRFC0EFyrZFCtOikkhpPrWWSTDvnQfu0CdttgS+3WaYvzzPxwVtNSr60fIz 9TNXVGi8LoMoTHx4.YrSqTZ5p4j32x6hEQgrD5eJaOnPvqV9xxPJWZ5ZJmDp DXqWJEUAigJ1qg3UJt3eDSwAUyx4MxpHeRweuu7bBcoDi1vA6IfyKQnne.iV vmRxYpuUfXVf8jkynGHZ.8IxjkXZ3FP8Ib7FtaateE8s7B38.NLjDTRBnJQo YvBPt0TIva5zEYoBJch4jDiDeOIDOWgdvJAcq1Qvsn3XAGlT.MSvOQ7uGyXw z4oLx1ukjAgYXn.kBRIQKxSNO8hjZPT3xFQxRkN4gnXVEEupxlyVFUj2JNlJ x6itaDm1IerTdvoxbogTlPfVhYFSryQlREJkWnMBwVp7khc4+oixfOyQ8EQw qdaTqSfsrkVYPJYK473pEmr2WbpFMSNYoNOcwBxVQ+0D+sSr0vDzFIpF9hTX abeMWo8TUytNUEY4dfSUQ+0bpp4vep59vb8Sn4FwNKSn0VRE1SiJvoF81nxz +RJoB+oQkpbUroUsH4EtMDoGu1FcdcKPyljjLZzmPcVSCWPZNNbY+LVvhVtj 2CMv9vsKZCYk+o1L+rty6cX8bzP1wcIcJi6.VDHMgzikOn.HmYRIF0h+5zxh b55hGNsKDLAuZc.IA7bLkwHgf0brIOMNWS3JJ7yqT.Mj3EkFxJJ+1vRrlo.I 0DJSyN.R1uCavwZr2i.3D9fpgwjl7+bpSACOSM675GQuSaxQcarCeT8s14WD Tpfvzo6qWdzgp.bqw09qFrtQc.NkE0N6aobyvp6buynig9+sNQHoQt8rc7XX AMf7DINgFEVzCvQ30qKjbYmIVg+iHYC4twLLmYTIs07cL4I5tMKuci4HEiCS owJx+koNaclPrSGwgoTYcxMgmSRaA2Le3LjShbcjRXVyJrTN9n5xfHuGI9Eo oQQqIgzv0wjDtNMLKi31jsOYANMfce0p0Km+lsLopLqT+7UiVFS8iBEDQInV jbd2wcP0Vo8qHyHKQHdcEUlKqvgkZxLgyjoIywwhQhLSqn7LYQQAkyZS8BHK XYYulx8ptLJxhVWelwzkOzPcmGwybUSssLmDt2bpbumOSjcuvC3xkCGDjM0r by+BNjtByHLpZH.YrISk6EOj3EGEDTheU47TE43yEh8HOS8YOTZC1D4vKNcc tPznMix9zkjDV4zX3kIkSYu4u7jRmmMI8dFgaJkyEkKPoG2PwYjEUhUJ8lTl UVgVLNzOZEvrXlUsPejqxmW4Bmb1aWPqU21t52LK0SUZRqFbpE+8J31etd9i LTkPB.F.H.oIVodfM1NsiUVUiUno0iUVcGqjFCGu+eOt.n3g9fWRpDAE9JUB 7JnQtH.x8DzliYlR87FYeTB9pB1KUKS2dKhhlcTEQOqvqNnK2tYOP2R0x7.T .XbghtZgspo9cEaKUKjRLtWXKb.isplWGPzdpDAlB6DHVpVlF4eVOHBqADQ0 ChFsBh4KbdypMOGy6mXqArZaHErLmY0EXsbsN.YSzk57d3DHDBawluEeodag IK6dqdD5boBSsgPFviifDzb.iPRpuEj.ZJch10UWEUF0.DvSfqzmAUYM3h8R wZeZF8bsTqSV5VsoU+mnMj0GUZS3aQNBBmV8VwqsEuYk6nZ2V9A5R1ZRqjYa KVyzx43nVx8BUu8z1VM6LiiC.coZXyXBxtMLxBU.iN.kRlWrXTaPDbF5H4G4 .FhzYyi.l.KfMvA3BlBlokwNS0ttY4XztfErFc71M.avi2dI02+d1FGx2uSC sPdj5o14Ls2ynstX2ty+9afMOXy5PIGIJodjWl8GjNtNxl83+NW3jOIfgeSK fxFV8SETaO0bmcIiTD+kD8.pLeZODjpA2MPGn9ty2Zpay6U3Qy6U6KTOObZC gfGI+NbstPQHS87w3vAnK88kIS0i0gtsLVmFczmgclohsnuhYTFxmDjkE5.2 ncn8obi12dJJDmXoZd74R1Sje0fSRTZrW9.Q9lFAJyo9jDFMbygJ4qaeL26T vGn99jvcYNeZhXWV72bMbZcnrqzbEjR0zr3wMOPnYIofzglmMrnYnNxFFCKZ VK4Y3vQdFpKMiFNzrwkGMWwTqgOMqKNKr8LPnYAkLSGUcCG0FVZhxCKPVG6I tCKRVGyItVCJRVG4BWyAEI6nCIOnnXaMnXmAEEaoigjAEEapiN4AEEOUGCeC KwBWcH4gibg1q+a3nSVWu3fCG2Kb0llGNjrilVqkvLbXPy1WdNK6ZcARylWf z7kGI6b4QxWfBFnKORFdAJY.0UOm6vYCPgWfhyPc2LwADLqqjwwxS+rGDW9E xMKrjnt.pMDSR5zEkbYPzbbP10fby0nsoaM41qV4ADpOZK1EhZO3Epto2ty5 bT.wY56zE6m7m9XultB+YwJG6rKwtc9mZeI1cbOkAjgEAQ7lskXwAWpzKJPc 2zEwNFW6wk9rX7+Z9xREcpC+etiq7aEqV829e0cPx0pyxD1SaObezTbSgiSz Ubrgmj4Vrf2m4oZLAVPZuDaW3RAUlOeXWrbpBRPhOQVkKb0Qs.QPZCyJFzz1 W5l2KId3L9YxrSSzsolY7+sOwYhdDcWxhsGP2puxosNQwdVWCuKvtFX45ELU dJVCbtJFHMs6w.IanVxyEkbMf1NH6CVN67HQEiYj2.+dxqgd.uW8ZLhJYNSc GwsQpvawrNKGYc31RJcV.6HFT93GsED3rMtoHoUVLuPcxQ6wzGK22ISnqCvu JhUaarh5EPW+.QDCLjBetMo0HOTzYlGk.r6Znnyrl.djcehQNU8Mw+8odBe2 vwutMXx3iY3c8ySv50b7ZDAYlMJ0RdHxvwzXBltX643QVjGogJdCm5SiDoTn .AQQqKeHhF4w0URBY2KByI0307ZJG1SdftHGy247IkDjFmGpP9592CV9vaVN kReNNgCJogzvk4W6yxEHJltj6Id.msWphbHYVVGwndOlT9Tb8+RwAT1qaNgo 71tbADDXBKlvYkpnFIO5EEKjr135+Nr4Zhxu98Q.opxPVy0eKL5kcVq1sD4w n3p4fb7PDWShxCTzFUSI0QlAAQOqVdPgVoIXeURgQUsVBVI4T+3zU+GtP2OE T+of56qf5lEdeBVZ67zEfRQp3p7KQYQdV1Qx2t6An+AVrqaIITi08Zlw2ls3 UqYELrwQL30syI+8uTQxMT1cfWENoTKlvQDkL2drcI9TlX7YmUmOabgO9Yne 6mg9seF52540whq5o0XYlsgZFpJ5BnSP0B14a1bMm0+i38ZviqTRTxRlqqbB eMvf51ngT2gO4xykAA55QASMtC70q13nbk0JEFP2zg6pDS4lpx0nQe5S.55n GI.tMkfD.6ABXIdMXNg8LgDB3d+R3hi7zwL.Nl.BiB+H2G2DhWJSDhvuK9tv +oJfIy8u356FEfueEY0cit4Khr9uhc5g2JLR75qgiAb75VNTxGptEVrDQb6V 9oyuVF3AJj6+luh6n3WAT+WLjI7uHb+eAO4es0MeA.3T+ZgIqnzDf5EqjLrn mHJI+a7NjWQ9mhHFO3VdQDoDh.+Bvmt5ZNAei32lxVl2VdX97REOC3d9AB4y a.BcLeVT.AMbuLoakMadsDTHoX2K32HIT5KoVU.kV1FO4OQDGkIWKntaxaAN 04GP.OGyQdbbTZn+muiI6xEfqEcE32jHvMfuK6Yvud6FF3Kfej0JKIrLjNJP Z1CH1bUrpiUazJmxgeR0heT0h4jfjpxiqy4rK0PBfTHudK3K1I9ZYcFu8GY7 f.rtldqrJeAP+MYk3e4W4iifuKJwcLgj1Fpi3ChIXevh3nUJT5ypRg4c00zb p6WTj8WT48DOON.Jp30vOhu4KaZXE0Kg8rn280OSYOjKVcipfB4bAlMF7Dmu TREiyKyXvbAvKbl416FIFJxkgywW9zMwPLWEQTrOmAxCB1h.hsZzWkBfOgiK RHYHdcPYhKY7TNfmt1mCCfn.+FE3TUVI2o3WU0EKCbN16w7dQLDwWP0iJ9ST kb9SA5bdR7.Gww2MpZN8LEteDVfZKtQkY+w3.s+X8dZ+oAHfFBLA+d1kYCj8 xrPOixpn+ikFAEBitGSHFvgRCNjA2BYRkr5HCofKjaugK3EKbg1BWR0KiZOT JdL.ryQnZ4jbMOct3Nku5d7SMu3tqHN6cycF5G8MmAyI7E1AJ9ndRgNhuwQV PH9Bea.7kCLAdS2eH8SU6ao5MQQedErL884UvRM6goxk12Tadq7sOhQ2wjrc bxwsvwWna6r6r99RsrKuQ7xdp7Go2XkhipVJs0GGMBZT38PSmPEqV1uaAEnJ rZYFiN06Cdqrb1Kyo7idv9A5p1OFaNZxyhiBQuYXI4T1Duh+2UkXFJT8g.Ft 8AYqwMMZekf6q.buwCcoG6R5l045kcRIGjFTC7rQM6LNTO3.OKjyLc.GmyF4 3LUC5wd5YazxwQC5w57QO15LdYe9jls0Z7Z1YidrzgdPFsHOuh5uNhFxRxCu 2xnBjIR8Z+xPER.QEO0vGQNvUGN3LhnHcQTC8QTjJhxaZJiHWFFa90I.PMKE eD56T3cYfoVpiZc16bUkDh7WmJVn0w.XGYAErCcjAQNjsyle8dwAvymdTsDJ Je4p5gPg0DHpheilod4todqyL6jHxfzwMiymVDzoPKRV.hTda.1pEAcZvSc7 o0w87AnZSOmGG21wlZMSnNiN8aniBmyna+SOFS.NhziyvxQa3.a9EbfM+Bp6 5P5C4n1AhcNTcBJYmCS2NGjt8ODc0e.518vyw64e7g++Re1oc -----------end_max5_patcher-----------
nice one, Graham, that is in fact very similar to ipoke~… i know it well, i put the original ipoke~ code(with mods for rodrigo’s style of interfacing) into this object:
(and ya, i saw this thread long ago, and thought to myself, "i hope we can meet even Barbara’s needs" :) …sounds like she needs more than ipoke~ though, haha… but, in any case, i should have a much nicer-sounding version of that object coming real soon… )
Forums > Dev