HISE Logo Forum
    • Categories
    • Register
    • Login
    1. HISE
    2. Morphoice
    3. Best
    • Profile
    • Following 5
    • Followers 1
    • Topics 146
    • Posts 836
    • Groups 0

    Posts

    Recent Best Controversial
    • Isn't she a beauty! Thank you guys!

      Screenshot 2024-10-20 at 11.15.45.png

      This is to say thank you to everyone who helped and engaged so awesomely in this forum, especially @Christoph-Hart, @d-healey, @dannytaurus, @HISEnberg and many more! To get this level of help and devotion in an internet forum is not common, especially not in 2024 where people usually are "go away noob!" or "use the damn search" ;-))) Therefor I thank you, the things I have learned over the past days are incredible, given I started from zero.

      Today I finally managed to have a first usable prototype of the synth I have envisioned with beautiful waveforms and sounding exactly the way I wanted, and I ended up not using wavetables at all. Take a listen here if you want to:
      https://www.dropbox.com/scl/fi/h211eql2t99ntdbltrbuo/IMG_8250.MOV?rlkey=a0n81idbt7oaldbkqpz16x9nr&dl=0

      Here are the raw OSC waveforms, I shaped them using polyshaperfx

      IMG_8246.jpeg

      IMG_8247.jpeg

      We solved the pops and clicks, the filters behave and sing like a diva, the analog vibe is all there and I'm thoroughly amazed. There is lots to tweak and add, but I got the basics and I'm confident I'm on the right track to continue with HISE as the best choice I could have made.

      Thank you again, I can't state this often enough and sorry for the million more questions I will all bother you with in the future ;-) Love you guys!!! You made my week and enabled me to finally concoct a thing that has been brewing in my head for so many years. That's beyond awesome!

      posted in General Questions
      MorphoiceM
      Morphoice
    • Sounds like Vangelis?

      This isn't an ad or a post to brag but I wanted to show you what I achieved using HISE and FAUST in a few weeks with the help of this awesome community!

      So this is to say thanks to all who supported me in learning HISE in a ridiculously short time. This would never have been possible without HISE and all of you. I started with simple FX plugins like reverbs and delays, which are now included in this synthesizer. So all the sound you hear is 100% HISE/FAUST.

      The Audio:
      https://www.instagram.com/p/DFDtqa2s5Sp/

      Unstable GUI.jpg

      From the bottom of my heart, you guys are my heroes!!
      @Christoph-Hart @d-healey @aaronventure @HISEnberg @griffinboy @Mighty23 @sletz
      and many many more <3

      posted in General Questions
      MorphoiceM
      Morphoice
    • Waveform Icons

      I made these little waveform icons, if anyone has use for them please feel free!
      Couldn't find ones that aesthetically pleased me anywhere online so I drew them myself in Illustrator.

      Screenshot 2025-01-13 at 01.37.40.jpg

      Here's the source code to save you the conversion hassle.
      you'll need to put a correspondingly named panel for each icon onto your UI

      const var labelSine = Content.getComponent("labelSine");
      const var labelSaw1 = Content.getComponent("labelSaw1");
      const var labelSaw2 = Content.getComponent("labelSaw2");
      const var labelSquare = Content.getComponent("labelSquare");
      const var labelNoise = Content.getComponent("labelNoise");
      
      
      const var svg_sine = Content.createSVG("418.nT6K8CVaATLC.XwmXQBHMZa.yhzBWkPkzQoPI.XRHHfRltcFhHhxLSR+8ffD.fD.frPX.7D.CAvSTCNZz7jbrqXcge2s1E0hJ4HgjBp3.BkkzCJQLJkZYdDgjyUdkJUXXD.hISbH4DEA5AIVRKCQ3XhEHjbZ.Y4AknlGBRt7fDTH47HBjFRXDwwRRcM4DQBjnHbPYA5AIHnIJcem0Y+dagO9rM6uKt12R9Mzsu0bwWwE+Uy8cMWuuRFs12Fcpqq8gjSikTxIJZADiEGlr.hlmzlJSCSSECzP.B.AAoAJzLBhweb.Mwjnl39iS8a5VWS705aEYq2Pl+pXacEcuuv0cMYv5UM70m2yXz0tRYFUXycFCU3xN6g5dEis2apZfacWmr85Jer2a532bF..OOnDwz77fo4gIs.+Vt38cEa14Vttig5Yrjo5ycq8GCa5cKT0qMxtaWrc+0XumWXyes399hQEpp6TG6cis58JY1UFeQABP.BhsK2YKDfvQaW6pYBGsn686WbjTEfTvBH0gKeBlyD..lyqiJhJFXZcpv.EDISfT.");
      
      const var svg_saw1 = Content.createSVG("375.nT6K8CVEAz1B.X31PQBLswI.CsFJ3O.5GCwxB3EEF4vydsdXQ1atkojr+KbRCJnfT9PU.jD.6.Pqe2rhpnpFIfTvDHGRTTQRlVTU4knHfb1jOYxjkEAfHRDGTMSOjdPBEE2PDPSr.AUCCGJQRlXbHPAWGjfBplnGNX.44AjhR+pZd.wwTDPRTjdPBBXBoaOmw3ea5hmy8wMY8YXx6U1Z.7cL62M9AUCCEkpYZZgzihCQV.AiihW6ByBSECzH.AjjbzfhcMI8bGHoIhLw3L0.hAiipc3tJs5lQ2UNi70Vx5tSX+9xR9vjgm2G2Y1Bq0TTe6R8geuiRZruapoS+K0LtmkO14r4uIbuKeeoa1ru39sM.3DIYZgwIZgwYQwfqOuqW7wUCWt2Yqkuasu2zq6p4uaxr2Vw9568i5.T+x9lP8O3a8r1425jwucaFg20xm6AO.v.3CTYNiL1ylW6BDBPsGnkSga24PuIMLJhKSfgubpQCnlbjKfT");
      
      const var svg_saw2 = Content.createSVG("378.nT6K8CVGAT3B.XCGRQBHMhZ.yhzhqRAcwYTVLf3CSHkhpX+vcuyMkYaOOJtX.BBv3QvU.nD.7.fpJs9cuJLE15ABHELQpgDk0jjpEFisKSO.47jOYxjkEAbHRjFVOUOnb.gxZY3AoHTbv5YQCkIIUNPDrdoAHjv5Y5QiEPhdHorXWWOOfzn5AIIJTNff.m.e1C0uplMWeW0zcMa7eY2bM224Lp2qnieSacrdVnrVOUUJnhTZHhBGbfVapKNKNSL.i.DfhpACIzrhJ5PRTQDoxAphgzBGnk19Kn8YNaMusJp7YRWe1gO1SkuhL6Iy6HC412qJ1XmoX+FYl2nycW+UQll2jMeG9bmooxbcuKatyMn1mY2zE..zjjpEGnoEGnk0B5YZ9z6xV+KY3u4aeKYQsBYV03qJ1vdi8dGxhXZuwHg6qb1Mx74Me52F1M64E08sN48sSwfC..BAbOfZYfVwSwEfTlV37hetr1pypn.ErAO9xoFMfZxRt.RA");
      
      const var svg_square = Content.createSVG("411.nT6K8CFaAzHC.XG2SQBLKZU.CGtRigPYNnpFCf0Hyo3vp4saQtBoHIYp8GrsbFQDAn1U.vD..A.b0KM2ct0BuvJmJQJfRjioEUioICy7hogjHmQ4TnPggQ.GlLoAkyDhziJKpECRhdPABJmENVZLMadHPE2CRPAkSCHNVDABRzhheqbfDwwTRzzhziJDzDvgch25PEJuStRs7LbRx2oM16dY0s9agjq2Zc8Va8P4rXQoblSERPKMLQgCMOp01LMLMQL.i.DPRxACH5cJA8mHoGlLadlLhVz7nfrGr2pqOSYnH+XbJ9dSat2RI35rUhcmt0eJCsf2IipSkq2FzmoQ1iaTdW+255uR9rEp42RDVO34dWLC9113+VFJ1AvSioISySCllGF0BKCwd2sRzc6tM1N2Zq8MFuCBJebcuG6Vhweew27Wn6J2vCUFel1huoN4as+Ra1iJ6clF6+zUZfBXhRxQ2AhhqpDiCjDvKwqYkShE.l.HgPohgR.+f3zisKPwXZu.E7AT0C3ONmS+oAnymBxXvi0MwfhHgVjB");
      
      const var svg_noise = Content.createSVG("900.nT6K8CVaET8F.Xfr+IBPuIM.e9TDsLtc69FBdU.6hdLcoZYKqHhT11W9KhGGEUWLWBPZ.fF.nZOa8Sa2q1JOZ75m0f7WnU8bwGVXXd77vfSyxDJXPB6Z3ngiLFvg.DvwghCXb1iSygDw4BJdb.4wgHM3.BCpWwagSWs3RZIw7vhHJnRDJUrvzHkRXCISDwyJuRkJMZHfDTPwDlGOPrvfKLQjKX3.lGMPYQREONfP.yxL.gDXdHABJMDQCDQVXR+Xd.QDTdlHREKNOXAANprb02QzVo2WaNHDeuWaK0urd8TsFEZ78DhNGDlYtdaKttkhSqIY0MkehH0c0bVHV6CSH7199cssV5sl0tq+hx9m4nbanUeFyq18059oyVEqtxTplFw6n05WEsNHDRyinkw549qoxaWREnz2lBWXlt0K8MoILx7pY7WZMZY+khndGk5cu850b84Ty5QmC4C0L+6P8dDuBwoqHzhWUdDoa+8PMdu6CVbyJhaBwEmX05bdomLBUM2IDe0Z561DVW9qg596tzTUwCopNu27o2WpyF2O..QREOMb.QRCFETYdzXMeyRcE2N8w8USOSUWeEOD25YjhMn5Jz5VWmSIlVqmo26wzyy4J8caV9ah18thF1bpstYwOgS85Kzk3o5mYZNY9koHlcd8KZUbeuMHkuRsNVd18Uy6WqhV2xHdzQYpE.HznFHNujUC.RBA.EAA.Y.yX00AP5c.IPbF7x5.YmS4bta1qNmyKQbTfDYpQ2NCQNjaMsAbtozqaGP7fbVrrAiQXFKAiOj0wIxXlWH4VtDpxcZfvpLfd63EJeTuejUlp5C+8vQxdIEJG.AqM.LwgQDCaD7txZ7SXLqtJLe0TG1I.7ZQmLvdOJBsxceFm8ujzMtB56bQJB.p8WC5wxGYBWfM9QupFrg0UBNklYHWEIZ2sqRiIBeWz8AyipcpkV0SL3XJWSM.HO1QmBBny79HHCDIbx8o.NfuyMUMwGavh+e5RiB5ZGLFTsln490Dh.crvp3dI96hiENh6hXKYpGgwUKJv7tEStIll4RIgac0qg1Z.ABDjPeHWE.GgZ9sZVNMF2QthzVrEbU5PoRug0ElbGze218nYtForGfxR4FSg3b95HLP9bu4DSURVp8DMkGoel25vVXL+lltYVeicArLaiD.S.HMhWHGEXF.5Ay2wuC1CkK6kMbLGd1A");
      
      
      labelSine.setPaintRoutine(function(g)
      {	
      	g.drawSVG(svg_sine, this.getLocalBounds(0), 1);
      });
      labelSaw1.setPaintRoutine(function(g)
      {	
      	g.drawSVG(svg_saw1, this.getLocalBounds(0), 1);
      });
      labelSaw2.setPaintRoutine(function(g)
      {	
      	g.drawSVG(svg_saw2, this.getLocalBounds(0), 1);
      });
      labelSquare.setPaintRoutine(function(g)
      {	
      	g.drawSVG(svg_square, this.getLocalBounds(0), 1);
      });
      labelNoise.setPaintRoutine(function(g)
      {	
      	g.drawSVG(svg_noise, this.getLocalBounds(0), 1);
      });
      
      posted in Presets / Scripts / Ideas
      MorphoiceM
      Morphoice
    • Retro 80s Tape Wow & Flutter with faust

      I made a quite good sounding wow and flutter plugin using faust
      and thought I'd share it, as probably some could use it

      import ("stdfaust.lib");
      
      wow = os.lf_trianglepos(hslider("wow",0.5,0,2,0.01)) : si.smooth(0.9999) * 1000.;
      wow_intensity = hslider("wow_intensity",0.3,0,1,0.01):si.smooth(0.9999);
      flutter = os.lf_trianglepos(hslider("flutter",8,2,20,0.01)) : si.smooth(0.9999) * 1000.;
      flutter_intensity = hslider("flutter_intensity",0.1,0,1,0.01):si.smooth(0.9999);
      hiss = hslider("hiss",0.1,0,1,0.01);
      
      drive = hslider("drive",0,0,1,0.001) ;
      
      tanh(x) = x * (27 + x * x) / (27 + 9 * x * x);
      saturator = ef.dryWetMixerConstantPower(drive,tanh * drive * 20 : co.limiter_1176_R4_mono: tanh );
      
      tapenoise = no.pink_noise*0.6 + no.sparse_noise(10)*0.2 : fi.bandpass(1,600,20600)/5 + os.triangle(60)*0.05 + os.oscsin(528)*0.003 + os.oscsin(110)*0.002;
      
      wowflutter = de.fdelay1(ma.SR, 100. + wow*(wow_intensity)  + flutter*(flutter_intensity/5)) <: saturator : fi.lowpass(2,8000) + tapenoise * hiss;
      
      
      
      process =  wowflutter, wowflutter;
      

      this sounds quite awesome on synths if you are looking for the retro 80s synthwave vibe, the saturation circuit is a bit fishy but it sounds good. if anyone has some improvements let me know.

      I'm aiming to simulate real magnetic saturation with hysteresis once I can wrap my head around it

      posted in Presets / Scripts / Ideas
      MorphoiceM
      Morphoice
    • LinnDrum clone: great success, thanks guys!

      In roughly two days, thanks to you all, I managed to make a working software clone from my LinnDrum. You can see it in action here! While you watch repeat after me: HISE IS AWESOME! And its community even more so! :-)

      Screenshot 2024-11-30 at 22.32.48.png

      posted in General Questions
      MorphoiceM
      Morphoice
    • Saturation Models (Neve, Tweaker, Oxford Inflator) in FAUST

      Here's my attempt at different saturation models in faust. Have fun!

      I'm hoping WAVES, KUSH and UAD won't have me whacked for sharing these.
      Feel free to add gain correction

      import("stdfaust.lib");
      
      drive_twk = hslider("TWK",0,0,1,0.001);
      drive_neve = hslider("Neve",0,0,1,0.001);
      inflate = hslider("Inflate",0,0,1,0.001);
      gain = hslider("Gain",1,0,2,0.001);
      
      // Neve
      neve(x) =x + 0.04 * ma.tanh(x*40); 
      
      // Tweaker
      twk(x) = x*2/(1+abs(x*2));             
      
      // Oxford Inflator
      oxford(x) = sin(ma.PI/2*sin(ma.PI * 2 * x)) * inflate + sin(ma.PI * 2 * x) * (1 - inflate);
      
      
      saturator = ef.dryWetMixerConstantPower(drive_twk,twk) :
                  ef.dryWetMixerConstantPower(drive_neve,neve) : 
                  ef.dryWetMixerConstantPower(inflate,oxford) * gain;
      
      process = saturator,saturator;
      
      posted in ScriptNode
      MorphoiceM
      Morphoice
    • Optimize your faust

      Just a reminder for everyone just getting started with faust to read this

      Link Preview Image
      Optimizing the Code - Faust Documentation

      favicon

      (faustdoc.grame.fr)

      and avoid unnecessary cpu calculations. Really makes a huge difference!.

      posted in Faust Development
      MorphoiceM
      Morphoice
    • RE: Saturation Models (Neve, Tweaker, Oxford Inflator) in FAUST

      @clevername27 they're not measured, someone on reddit reverse enginered them so they are somewhat common knowledge among the DSP community, I'm not claiming any of those is a copy of something, it's just knowledge I gathered off the web. This is an old post though, I'm making my own functions for saturation now, and I'm using desmos to create them, closely matching stuff I can indeed measure from real hardware and then bring them over in faust. Unfortunately it's all done by hand, I have no Idea on how to "automatically" transfer measurements into transfer functions. It's a lot of guesswork until the curve looks somewhat similar

      Those are the two waveshaper curves I find most pleasing, sonically, anything in between those is great and much faster calculated than the popular tanh for saturation

      Screenshot 2025-01-30 at 14.08.55.png

      posted in ScriptNode
      MorphoiceM
      Morphoice
    • Emulating vintage DACs with bitcrusher & μ-law compression

      following up on yesterday's thread I wanted to post the results here, so anyone can find them should they need them. Those are great to emulate a vintage DAC of old drum machines and 8 bit samplers, just the way Tal DAC or Decimort would do it.

      Why prefer this over regular bitcrusher? μ-law has a higher dynamic range and much better SNR (signal to noise ratio) which means more values are spread among quieter levels, and less values among peak values. This massively improves artifacting while still giving the nice retro 8-bit crunch and sizzle we love.

      This is the c++ code:

      void process(float* samples, int numSamples)
         {
             for (int i = 0; i < numSamples; ++i)
             {
                 float val = samples[i];
                 int max = 255;
      
                 // μ-law compression
                 float valmu  = sgn(val) * log( 1.0f + max * abs(val) ) / log( 1.0f + max);
                 // bit reduction
                 float valmu8 = valmu - fmodf(valmu, 1.0f / max);
                 // μ-law expansion
                 float valex = sgn(valmu8) * (1.0f / max) * ( pow(max + 1.0f, abs(valmu8)) - 1.0f );       
             }
          }
      

      there is also a faust version Stephane Letz over at faust Discord made

      import("stdfaust.lib");
      
      mulaw_bitcrusher(mu,nbits,x) =  x : muLawCompress(mu) : ba.bitcrusher(nbits) : muLawExpand(mu)
      with {
          // μ-law compression
          muLawCompress(mu, x) = ma.signum(x) * log(1 + mu * abs(x)) / log(1 + mu);
      
          // μ-law expansion (decompression)
          muLawExpand(mu, x) = ma.signum(x) * (pow(1 + mu, abs(x)) - 1) / mu;
      };
      
      process = mulaw_bitcrusher(255,8),mulaw_bitcrusher(255,8);
      

      this has also been added to basics.lib so in the future you will simply be able to use ba.mulaw_bitcrusher

      The same expansion formula/technique can be used to read μ-law compressed wav files or eprom binaries made using μ-law, which are probably most of them if not all.

      posted in ScriptNode
      MorphoiceM
      Morphoice
    • RE: template or tutorial for custom c++ scriptnode?

      @HISEnberg I did it, based on @griffinboy's template, yeeha!

      This has a simple 8-bit bitcrusher and the right left gain from the demo like so:

      void process(float* samples, int numSamples)
                  {
                      for (int i = 0; i < numSamples; ++i)
                      {
                          // Reduce bit depth
                          float max = 255;
                          float val = samples[i];
                          float rem = fmodf(val,1/max);
                          
                          // Quantize
                          samples[i] = val - rem;
                          
                          // Apply Demo Gain
                          samples[i] *= smoothGain.advance();
                      }
                  }
      

      Screenshot 2024-12-09 at 16.06.06.png

      now I have to figure out how to make it μ-law instead of linear 8 bit.
      I'm afraid the code won't be that simple. If anyone has tried this before I'd appreciate any input.

      posted in ScriptNode
      MorphoiceM
      Morphoice
    • RE: Polyphonic Aftertouch?

      @ulrik HEUREKA. Got it to work, there was a Message.ignoreEvent(true) somewhere else in the script apparently creating havoc. I removed it and there it went

      posted in General Questions
      MorphoiceM
      Morphoice
    • RE: Custom Envelope?

      @Straticah I agree. the workaround is just a workaround, however ingenious and well done. But that does not compete with other plugins - usability is key in a world this short-lived... we should aim to get the best possible user experience, hence a good stylable and draggable envelope should be a priority feature

      posted in General Questions
      MorphoiceM
      Morphoice
    • RE: How do I access a SilentSynth HardcodedFX parameter from code?

      @d-healey I'll be your guy one day then and repay all the favours ;)

      posted in Scripting
      MorphoiceM
      Morphoice
    • Scriptnode Synth LFO done in FAUST

      I've added an LFO with variable waveforms in my faust oscillator,
      in case anyone wants to see how it can be done. This is also a good example of what we collaboratively came up with to make a simple Scriptnode synthesizer using FAUST and the Silent Synth node. So far in testing this plays rock solid.

      Though you can get the pitch modulation in Scriptnode using core.pitch_mod this approach allows for much faster LFO times able to give an FM Synthesis feel to the sound.

      HiseSnippet 3674.3oc2a08aabbD+njV8AircRcRyKsnGDPAnbno3wuYLLLs9JVHV1xhxJIHsv4zcKEO3i2c4tiRhNH.4gBz9Vds4khfh9GPA5Ks.EMF4w7TQ6+.I+EjTf9bUm8i63dGORQIK+UXhr3s6ry7amY1YmY2S3i7wV5X8G3YY33f8kjRM4Vt1ZXOOaWoTo2omCVJ07nl8r7auRaUCKoMVUJ0kP22xyWcOS7t1FZXok64n54g0kRkZx2gPTp4lRh94GtwxplpV.MgMIIQGzsM5X32u0sZ7tFllqqpi2wni.0kZrgls0J1l1cA.MIJujip1CU2GeGUBYSfjtkpWaoTWAoVrndqJUpUWWqTYk5sTqpqsWw5kw5EJUDWGqqWsn9dsZIkZ50zM7sca5q5i8jRM0x158Z119PKl.10vy.lZjGTjZBRl0751l5joHoUoUZaXpGpo7.8FRPuMISu85nMMzMBauu96UocH2eDhJvTSDEdSFAdJhvKu.7R.RoDfzTLH8ZnlZtFN986gfmWAsgkO1skZLaIiVoTeEZEaf.K+bcTeHdcW3gvAjoR97YKlO+hWqUWKMeCaKYaq6X6iuqUlES+IomK8mlVNdWsZkXeDo3ZaZhcSrahmg6nFXFqtc1C6lU9.Uyt3PBgYeTUJZ3pTQKtFaRKPns0FVF920AaML+.ItlBT+SyQEPpOU4eQtxuoogN1Ux.zwyfdWK68Tjn.Nvqewe02eCowdvEhNXxZtwevEiL3u8d+0+voXvkhK4u8TL3xOIvtRjA+kuy28M2P59arppuJwsmaB.yhC102fXwSsJ9.HnCaQvbnUwdOz21gZi53XaQLXol+DsRGEh1Ga1nWen+AM7wGAb.gZpdnzgF59sC67yTazFareagXcazvIviYCf6Si1ck6p.w0bgPZvpJRaLN0wVG.zOEcGa2NplFOBquE1UC.KD+SxqaqVFGQ7C+kRcLz0MwaY6YPVPDyfDNAm6D8j5OAktSRSvYQM+3tpt3yk4XHyNMXrnHF6kDFmATWFdmOPLfWmFDVZnZQcNBu.ZqtldX42ihvyCbNOiiLFdZ.a4g5SqG5Su06s44jOMgSmFzUYnFa8PicSGLrY04iwlwKoA21D1v1VuqopezcwI45v6frrSbqSx9iVvxwdhA3N21Zebg3qg1xvWqcxXbhDvHD97oAF4IDcAzZsZg076CvoPq+9OCx94mDHeXqgCrM6RUED4+FhsHuM9.rKDmWDPq51KZJsRRuG1Wnou7K9hq93aCn0RKhhbiNNj0j2FasufqI3Evw0FVNc8Ea+9d3kgba220tqk9Nscwp5QGFVGapFQF2xXEAd769sMVUsiig097lZTrnxiWe8c3a6wG1q2XcCSd9yKiVZWX12A6szpjovRqBaZtm8QKcqMZt1RAY4uDetrM1CV55AD60E9ketCUO.16AzDnTDN2Q8HxW+8fjLssc.anqePejFVyROn+TSN11YkQ6lssMX7r1eSUeWx1gn6zsSSnXAML3kYYgMI46kZBRlYrmyGfnlPoOzGNF9v6Tg7bJdmJAcJ5JeoH0D8Nfwxg5IMOMhhLqggTPzm06x+ywsfHmwtfn0rH1n02Tjiqn55Z.g0fh6DBg9CeUXLhA549VFd1V1TnbyNfKXTeSVuqh86ZE.lO5y+5+SPGMch6tRPeSL.UcJK8hDGbxQUAlxYrBrYdZUA1TiWLnQCuWB1UI0DC5mOC5l2Z0layK6m5hul0AXSH05HHaSvIvosskglna31XXQ496CapKf2DmD2z2Gh8sRW2ChrxXUrlZuAZkQrXDMVK2FheaFI9HXRFfc8a3CazrKDgKZz8swlXUu9x6q+SMVSydSZp3mIk9nieE4fCFkiwEPrIoLMdvo1q3YpS7ECvJyh7hMXmGQcKdYPudID2g8kBE6EQ70RunnZmgA1zncg.XZDoKDVKrsSDmPhZ6nRAhP1dPPQWeb7nMF6gMiF53TkgsxS+p.l7kgp.dlGOfjliLz2IUuzy8PWrDudAApyFXfaBEXX4SyPlhSd41OSSK9oSRlS8i9jLeAzM+b3XLN2w6y6iz.sC+ry1x1rG67y.4R..BVr0LBBfRhgR98wtdgk2xuYmeAJoqQQ3lSPmW6UEduHR2A6ens6CoSH92gslYH+.MOoaZZZeHYVETOAUP.3oGs8Ln74f+iQE4rDM3tDv7j8XPg+AUwxp9+Vpd6nZXRbXfbnbfx6uqEMLEIlCwHcG51zyrtpFLe6skJ4PadMD4Nf.KK1MmVnElAy9JXxLlcbJrdH5msBNYQOF9IbOH5D63G.v1gdJnSf.RH8SzHSxfwzrqkqCD+fI2Hv5MDfUeRRBPhrXbgPJAHLMc7Qk9EoRG7SnxNQwxG1IIQgang4bSdBVFOASzzDm1kcQOuBZcW7G2kdHaRBJWIo9QE1Q0ceruG+JfrvZL+BpkkcgCsTgzmU5Od1QA2B3bLlNRjMOZCucI8poZFfOvGSPscAzgtpNLooHMTWJOGSXusHqTopunC+znEkBLhSHflYQTGfQ.j3NPA.IbjOQVxQnuh6xGZhh.04An5hyQ6JQ+svgcpv4Dwv4bnULAVCNEbPdAT2f2yAHhpTLxuD4nFE7Z3ChF+SzYJ0rgOAwW1zvhS3rnqVHOIT1lpGwaZFDqkl9XmlFOhd4evy4qy9TsZkR0JTtVAdRU6AQwBDKhPHTxAnHL8iz1M65a2Q0msYoTxXYFzUUJDAJSiJTJBRPHE3Yt+jspqG97QzfZPY.0fxoQMzB7geBvxz8wBLoihjYQkyGCJuNvM.dzOJkpmWQohR.PHARhJavhVHlzo4Vjr7YHsu3Y573pg.oWpZo5UKUlI8zHyV1qhcf0K6Fb23Ge7w8969+kaDERCQWN1Pp7PbKnHnYaUGbeDDj9XRFjg3ODWfCaMw.ZglODeHKrAiIkDPE8h8BQ0+63Ee+OB+yZ7DfpjsLI5flF4ANnz5c3Cl3BM.owAix.9rMOjjEb3tb7Mblgsjz6fVO.79hD27UgkFzz9xw6M4XmACUH22SJNJISKS7QAuwEAYWF9U3K7aXXJX4cr3gSOlK9liX4Y1dASKQ4UnP854KUtRgBEKUqZsx72ho9oHv4vkQJEJlqRYvAA7PTJUobwX54YIgZha2E.0kAoUjuXWodg70KTW.gWFUOWMpcrhRsxEyWnZwAwZkRUUpVSoZw7UJqTqBEqShtmnyPwR4qTpR85kJTtRkZkS1YPDgnngtqEKzMsAVLIQ+tKiJlqPsh0pVNeP.LoSZMvIGcJ17sHrxjnwpWuFrvLuB21zrisseaxcSN5vPmuwpF1VXQStDgJLjMMNiwo6Kn4PrqmSXeZkDjEy9FOQtvjv2efR.dEVJQ6mbda7QbBqhmHh.irDcxjiBF9t17XgUog0b2e9Gbw3+saH5cPa8w6+meiFC5ZR66Od7wu4iipZ5ycoQCIIoAfTiOuwXAoO5xq9uuwP7R6e9RIiqRMjd5qplGsM1CyE8.75jUXw7mlAkPMkiS4.AC7oX0.wJCaHy.DpUK+n3+BHUKUyddPYBs7GRw4jdNk6rspATjlZuk61pEeCtHsLp84jF9xqoD8YXKFZRRh8jhvHZi+uGe72eijhiDy2pw28neyf9VrC0SnN4SaYyBY0HM3rYYRkICtXvHgECFMh1vi+W+imeyJdMUCLilEsBqjmAmSYRXNUqwIrJMw4DE8m+yovx0RvNsdTutQEz5Cham95mq1IZQemoyoYYa6G1Qkd.jmoWZ3mIuwQ+XQFcT0bse.+.CoGFBsEHPqEMn7bnMIOKqD+0AWh7RMa7.MsnrZfAV3rNvhm0AV5rNvxm0AV4rNvpm0AV6jGH4ts30mRVwB4es0ZzESoREjxKj3fDtydXcntR1MNPVyE1hE9HxahH8n3fBUw7ewPxaxV2uT+Sf6t4z8bB9ixPZhxHzRKoi0LUcwx1NznHxK7gDX911V+5EtVZiNN1t9YVvyWmxqblF6svhWK8Cw8jutbaO5qablEfGWHawJYymUoP0rJ.AdpGR1XSjHdSKjUgPWVXyYBgz2Jx3jF1XRDSeEsGfZZqK.DVl+S85jQkuLLLKxafdbYD1HLHQY3o520kZPhB9fViSN4bQhPIoABPTn+TJOEFTzeXmHv9vNw3EaSFQZXsPH6pJExVnDU2RhaKRD4YFI4AlkOe.6HmkVD5fmWHagB4yB+Oo9UB.A5H6WKRG4YJ+JjmPZH+VZoVAmN.PNwKgJgqHqP5K74qKumJ8dM.uhBseTF3WvfSKNV93.5H+oXTfpXyPlFKJmdN3y.8QfzhBc4g6Xv6hohHRHMwqC3dFaubN1l8.WdmG.MkITzKJeUYnSaOMHyKwluhb9bEJS9M2KEXWHKn9WTpyJq20GH+5xVpFGfe.LiawXY.wYtWVYu1Fs7w5KJ+Vw6wosJ.0zGZ.NveRZY3CsEfeDBguZ6lQIKU8.SHR+bdQz2p4Z4ppkgMh2hgDFQBf45xEfIQlfgcUtHYzcu.U+RDt0b6qk9Sg4IgQPGBqstJUEBZoLTmYt5oDHTxuHOB9tDMD8uACPgCVFEhrFTiQ0ub01UT.5B4siX+kJyDRwECIIjYvVqpV6ahiauJQnk5vbE49QQ.XQWYSrQ14Xe8Jx8i.PFYUhyB.g4l65D6Mvg2hwA52nzBe6ZvOo4+IOPsPZYI+y0jjFiHsMiFo8mO4YMRaPIBxyIFig2XrviBgtlabhcwi2L2biUDmHjMxXNQobTQchP4vh6jN3X4iLqBZbAJYASK5.BNt53z2jGZNaH6CImbl6CPNoQF4kyF.DJj4qNBX4hYogsjIsa1hFxoeWQ5g9Wq0gpGf6S.q+2lyAZrMSHEdqLEyFfgmlgOUHwKHyK5+R0nmXfVO1FPIrNVoVdZPTt+o35Lnoguh5+CrIK0r.
      
      posted in Faust Development
      MorphoiceM
      Morphoice
    • My take on super clean analog oscillators

      Here's my attempt at super clean "analog style" oscillators using polybleps in FAUST
      based on the Yamaha CS-80 with SAW and PWM. These have no visible artifacts in the spectrograph and sound absolutely fire with a good filter.

      Please mind, the filter in my snippet is still incomplete, improvement ideas are welcome, I am still struggling with scriptnode and finding the right nodes to modify my control values, still no clue how to implement an initial value for the filter and an intensity/filter depth slider

      The SNIPPET:

      HiseSnippet 4371.3oc67rraajbsMkTIZww1SFLdlrLDFH.xdjo6GraxNFCrr0iwBikkFSONIHHPnE6hlcbyt4zcSKoIH.Yw8C3tM.AAYUVdWeypLqyp7ILYUVlr3t8BmSUU+n5G7M0iYhofjXW0op5TmScdVUW3SCvNlXyi7cr52GGHHTZ4C8bai88c8DJU4Em0GKT55nVm4DzcqtFVNB6ssPo2G8kN9AFGaieoqUarviOquguO1TnTok+LBPkVaEA5m+0CergsgC.SbQBBzF8TqdVAIkd3letks8tFl3WX0iC55atWaWmsbscG.HzxHQg9FseswqvOyf.1RHgmX32UnzcQFJJlczzZpa1ttpjdGiFlsOVQWEaJWWAqiMManXdbmNBkVcGSq.WuVAFAXegRq7XWyyZ008DG1.7RKeKXpQdPRnELxrh2001jLEIkJrUWKayXJkOP2PbzskYzsag12xzJt7D52OfVQ0jVvS.KsTZza4TnmDO5IxgdEfRk3PoUXnzGfZ01ypePRMD748P64Df85XjgWxfUnzeAskK.fSPsdFuFuqG7PbCVWSTbCEQw67fNCbZGX45T004YtA3CbV+NU90UVqxuoR0rU0oSg0QFEOWaarWgUSVY3MpFttyfdGi81n5aLrGfiADl8oIongSR443sYSZN.cc1ywJ3f9XmgsNPHjRAj+UCwJ.z.Jw+lgD+V1VlXOAKfFWF84NtGKIPQXdwFgItwxySiUR03u8K9e+CSQiqmcj+1onwpyCZqkpw+wO6u+WenvWt21FAFjk8gr.fszG6EXQ33k1F+FPoCSHXMz1X+WG31mxi5020gvvJc8wxkNMFa+F6MOKA0+4aFfOE5ADpkwIBmXYFzMtxeqwlcwVupKmtt81rezJl8fdeUzK25.IPulGnRCjpHkw5odtl.B8wnm450yv15qwlGh8ZCHKn+SvePmNVmRVG9iE5YYZZiOz02hHPjggDOAWarqjRlfBOqnI30Ps9pAFd3ExbLtylFbTgGGOqHbrLPtr7WLnXTeMMXX8gREMCwvafNbfsOt5OkhgKB775rdj0gSCxpNz0zlwqoO7mt+BZMMomlFrSanLayXlcq9XvX0hgYy5Kg7lMAC1tlCrMBRaEm3qSXEDwNdSmD6iNf33Y7J3VXl1mTT7CPGZEztaw33REfif5yyCbLzgnaf1oSGb6fDDbEzt+rK.uePrwuB5QNF1m4iib6I5QoT3viAMqXuVf91DBy2r4gdfID7IglPBK9ZaVZ4IFgkFM854tCBrbd09FAdD85nmMnWKvq21Xfb43fsINtTZIhKFrmEIOSPhVfO7zGdK7IrRIxykBqTJpRddx6mx49OyycPeJU45TQiprBV.d12eh8reGGRHE6tOeOtkgmmEHeBQovoK3e8WhWrmqluzwx20wkhJOpm6.m.djNr1swACbRg5gUzpuG1vjuEDruEFPUSZW5mRfd4QEJgzLFJQ4qbgR7c.UhkVJ+Z6xnG8jsa87vXVoKq2w4MXavuvTX19.iueWWGq17qHdNFDDe0q.kEb3agShGED.Akt0.u2jZI0131FmkqTFv4K4oX.y3K9IvpjbcWbAxeylsF.AgyKSRvYargex386+SatSa28o9QNSD8QqyJUTuiZgwMPrIYUpNfqdFJuYD9w3BW8Pvqinr+qpzu2GEtX7JKA7lnPYiKSRX4H+PdInDpMYDIn1GE+X0XDWZ7X3W5iegAEERj+2CTu4Efyp2v5XrcZk.SkidRm+Nit72qcFcZjxINlPVGLNW0uTTBwbO5RD8VKh4EFxHw2UJtEFQ2vcX8us3cXMJ+naflljQt54gOiq9NeFujBid4+iKL5ahNz09L1heXbIH.Bj91MEF.Qutqkc.1yONRzPokeTgRKbBHnEkgo3bwK7LbvItdulNgB+NXMNAyejss6IjYUTX.zABPdZ5TKiDqA+vfhj+JqvkAv7j8XTL5QAbxBT+IF9uvvxlngDbOpODI9ANs.foJg.lTomQsIWdWi1v78rCMH4v5CPj8c.3rXuZsi4vYIvjYLaKvX0PnOGFkMKeF9S58H0UrLE.HaOZl2VBAfPpmPQVlgFqRFmxH+91f1vghRrpKBQhZ5jNrKkZXYS0wPIJdXY0MayVitl9doG1e.BGFjXMVsEMp2D8jC2MIZxwL3Ht8hfIRQdBTXrDy4YPXgi48R1davVCIz5DhtmWX38Jb.krwWP31c3fohS9oeLjDyx2Y+dFRBGlNemrARXjcHMes13Si1bkss.trwYrbj4mqDxThkQlUP2SRXGvDnIX2h1ZBoPfadB5KieBPm8sbhl4D4Mg8MNM740PRhvGnrVA39rDycK.FZovGo55hRRZf1fWiOgwKCAPugVCIslRZ0kUUjUnhRWKLVOvw3NFCrCBGjUgAgHiOHvsmQProVNLDkFCk3vPDRBZKejtr3fRODLnFwHbgQCVEQytPpwJK4PlT3kB1UlEraFLpLRQb53PhExgVKJV0bbGwZpWI3NqEEqZw7j4k.DsDkkZpvpIHSSQwFJZ555pRRMjZ1nPBzTMbITijg+8PIYVKUim6ddUvUx.blNMwqsXcnBbl.tFyDfzLYC3oeWxFvMPsIoK3H5A24clBdmof2YJ3clBJxT.q5+CP2OD5.Pay39+0Q.AsaMVMCIfCZciQe+RoTuUha9sxjvYhTImgJwYCIk9SgQZc45n87eIo11F1Q8HXYIkYPZTTRyRDXwscJi7qLafoQMJMKQblzVtjiMKgeVA0y0rfHPuEGZDCAOlHEhIbcvrPDtIuo4LjhOhhCdt103MeWD438Qc624Hq3zQMETkUJPRYJBkrBZePUgUe6yx4j.cKJ7i+1HcJ3GijqWK8m2b.7mNehySdw1MN6y+UuP7fL9MLyBV4TcxKZws1Hb9lhmbiXdBTWg7hvVMtECSNYGVq+lNGg+pzD92CsqG9qFfcZeVF5xxSkBUNSQKijGFcBTYTbu9CQp0TgfFjTkjUjjUazTAeOoFER+4VqLktDsxzMfh0TBSc1iLMGM6dwpIMjQkIfhNrrgVKr1hSk2SNb2wtlIi.VTVVi+J7EdQrzKKVkidtZB8LzcBduXji7hIiaJxx55h0U0jkUp2rQS0P65IqCSyUuF0cnQyX4PjOjv1BcTRRWVTWVmCq9Pjdsl5jOZRMUUDkanjG+zp2PpQSoFJhZpRM0n32xnuXNVsUFniMSQdfHDZx43An1endyr5zH7cK5zWRjPBz0aVWugnTHAtUOW2ftVNuJZn9HRuIIpIKon0TrtrjplT8LyxOl.inN6SiFZ0aJq1Tdxwu5C0aK51IOFGFW.t0sFhcpvLSOVSn3aAd3HOGd3HOVYyoV2AcmKJxkj2K1iB4YzmD9dXVbJIc9BlQeRxzImKdjrFpmkSOiSGV9sOW7Hg7UcK0i25mcd3QBwR6PVGmLayXfIhkvptPtQRaWjNlXaXRN21SniIqtvbXqPUKivRFi5AfZ0aPOgzvONkWk4GAkgZqLVC1pTkyozsS5z5QHgwo7HQROTjQpgLSKLoBoLQUn46l5hDy.0UaJIUWSNTcNALggNpSDeB5DX5ufCquBYulM7HgybgEIb354g3+VXsE6+1Suz7eS8c9u8cL+2JJUqSf+ZSnrXZ+ytr7EadkKmHO6VKLhKoYHjqj1t3Dao9zcQG0Ur3pVQFRhkhu3Ea4rVoo.yBY8l5JZhxManOMV6lBY3JH0ZhpxJMTW.wjLiB2WTAdoboF3UABgxygPn72SDBKijkupJCVWVSRtgZScY05PmHcNIC9gvJScIslp0qqKK0rQcc8u+KLJekIKHkpvOjrrfRxs33F7Q3ZBCfrG0fkKLlvnyUWpPBS1rUgIdiEX4tsX3yroIEG6OOKlQIAxvQOemVByifWbUZ0Z.5Cza.K.gfoDkKVbZrxoS1A3n3s.fHeKjma+zImaSEkpqppqzrgrXCQRB0mHl+vPyvSTyv3944IOcQxSx2vyUdRQY+nPdxJn8d5TwRz.bWjXyPugFXzYRXIoBTfMnOJ6fJMbo9hXxKM4R3oOvKBSwpiLsjOwKLaXORXRNwEwqAj0zpQWCnnqozPrYyhWCLmGPi4fTEexilFpTRixSf1d5HP5JxTBjjRSvSllCSw0kGAJ5f+LMzm31jm777og77AfGf5JT0HJDkHZW0HNImJHgoREbbqxplfcCPwN1.SrOBEp+YFBxeVt4dlzWcmqg14z.OCoqfuUQgnl7EIpcQbGSLou0MGLyu0MDvlm26lklt26lCF56cyAy06cC+lssJpmkoU5XmuI2V5.0U7wLg0ro37OMRIzzQzbcD41Z6Yz2iwBOLcCwonaR7j+nAN9fbNfViwy7b6SK8PcIOGGHL4uybHvJwM9YnZovgOl+.Gk.SwmJ8Tfr31nuxHvFneP1.zdMdtN5QiXG9RYzc36228jR0skQRxMxeVixT6Tj0ibiPBhyBOcjAMegbrMOeOTCEsXcNdg8XJNmsAksBLy40ssqGtFqlhOutr5lJEiKkgUrFZKanm2KlaeCzfn6.0sNHlONlWmi7Ikr7jkCpnksEkbHlHX1iGth1L+9Ej081gj9LleiNjKHu76fVQhAC8jDtnvk9jKAOdbg32stJC1lp0kUjGxlNLonlJGpQ6bclW+5pJZMpqHmCSqyvzlPHV0kj0kBuGE5mbc8w2arbZzTWrNLyzTG2akv4AUDg5eRuTaZCaJ.juFRvjr4kAqcMjuwI4XrYgbpXrWKAwnGjtb8VJguLmtigfpYOsGpBQuR03jT2BwdqWajXdggSldhj4EB6bbiVm+cpc3aBCa8F4lNctWk7xzWlrByQ9KKzOmjUf4ReY78X5BcR7+8129Oe3BdRvqgL2zH5tNcQMKl78PXplAI1axkkmT2BpISijKCWtT9PJ62dq+m+4CSlNzx17u+0AOjGn++291+wCGWBj4BUe1maorJjaxwt8TmvbyL5UP4mx+WObgOaX1QxMMhtjUyvd9u+c+t+bV1C8N8MGPyyD5ammITjZ7YR63iccecOCZpPlszccQj3lKhwnmQaO2iBClkP.uFsDv+TmviBv9jmql6JQWfbIWacT61o6pbMTdVanxr1v5yZCUm0FpMqMrwr1vliugj6TpPmTHRSBB6e3NrCQconMutTokEvgmuZ1sADQdHtDG7o6ZEdzr6XQOY1j+wvjeHSl79bQcUyzuezkzuvR2eEz8uuItsMXJtpaepDd0a+KHn4Ow04Wd6GTwpWeWuf0usefIsupYac7suyCp.gOU8Sq10md8Su9sgGu8FJZaHtADy0FR..UBs8yCUXQ2dCIBfaPNsu.jw1W4AMtvh.lptOGzzRuM.nZ3u55jVIpBMK1BHeqhKDZD+X3aDLvixQRi7QklEbhJtTPRJffHRzeA2Riw9S5kBsOoWl9hP463g+J.piMnovDnrxc+50g+AU2I5Ty.0GC5cqJwH2Pgq65Wquq8Y.yt+QPQqG2h6T8dUgJc8a6a4vW7cqJVSVk7+P1CzYwcAkvRgdiplCB.v+zpNFVuAeDL3cXcYDvq+EaT0uqUGve66T8SxVS+tF936TA7Aua0eckpvGZIP+Q.D9pq25RaTkLTvDkTeXeQlpF053YzdcVK9DFlv.hCY9zpxvjX8nlcuvgjA2W.USoV2mzasd9Cp7af4IoifJ3VTcOJIDnRqS4hgjm5vfR9G4QfoQnPzaidffWYs0jHiUdJFk9FR1tqD.Wbe2mu95prAQ4NwfD2YfQECmWYiyxupSf8NUg+b2pIhO.ZQWRS3Qt0Xe8tUSV5SZYC.nJ.Jr1ZeJgeC8vmv5A52nvBe6AvuUBu72obn1aP9yCDD92futY7n
      

      IMG_4327.JPG

      IMG_4328.JPG

      The FAUST:

      //declare options "[midi:on]";
      import("stdfaust.lib");
      key = hslider("key",36,0,127,1);
      
      sawGain = hslider("sawGain",1,0,1,0.01);
      pulseGain = hslider("pulseGain",1,0,1,0.01);
      pulseWidth = hslider("pulseWidth",0.5,0.5,0.99,0.005);
      noiseGain = hslider("noiseGain",0,0,1,0.01);
      saturation = hslider("saturation",0,0,1,0.01);
      speed = hslider("speed",0.1,0.1,100,0.01);
      pwm = hslider("pwm",0,0,1,0.01);
      midifreq = ba.midikey2hz(key);
      frequency = midifreq * 1;
      
      saw = (os.polyblep_saw(frequency) - os.oscsin(frequency) * 0.25) * sawGain;
      
      polyblep_pulse(freq, duty) = naive_diff - os.polyblep(Q, shifted) + os.polyblep(Q, phase)
      with {
          phase = os.phasor(1, freq);
          shifted = ma.frac(phase + duty);
          naive_diff = 2 * (shifted - phase);
          Q = freq / ma.SR;
      };
      
      duty = pulseWidth - (os.osc(speed) * 0.24 + 0.24) * pwm;
      
      pulse = (
      		1 - polyblep_pulse(frequency, duty)*1
      		- (os.oscp(frequency, 45) * 0.3)
      		- (os.polyblep_triangle(frequency) * 0.4)
      		) 
      		* pulseGain ;
      
      noise = no.noise * noiseGain * 0.7;
      
      
      osc		= saw
      		+ pulse
      		+ noise
      		;
      		
      process = osc, osc;
      
      posted in Faust Development
      MorphoiceM
      Morphoice
    • RE: LAF for a good lookin LED?

      @d-healey god, laf is so nice. I'm in love with it!
      eightysix-screenshot.png

      posted in General Questions
      MorphoiceM
      Morphoice
    • Instagram anyone?

      Upon showing off my latest achievements in making a Yamaha CS-80 emulation to my hood, I realise I know none of you outside this forum, and we can't share audio or video here so if anyone want's to connect just the same handle as here. Also @Christoph-Hart the ability to post audio would be a blast on a forum about audio development ;))))

      Link Preview Image
      MORPHOICE on Instagram: "Sounds like Vangelis yet? If this isn’t starting to sound like the real deal then what is. After another day of tweaking my oscillators and implementing more festures into Unstable I’m getting more and more confident this will pay proper homage to the Yamaha CS-80 although not even intended to be an accurate emulation but more of an inspiration."

      87 likes, 9 comments - morphoice on January 13, 2025: "Sounds like Vangelis yet? If this isn’t starting to sound like the real deal then what is. After another day of tweaking my oscillators and implementing more festures into Unstable I’m getting more and more confident this will pay proper homage to the Yamaha CS-80 although not even intended to be an accurate emulation but more of an inspiration.".

      favicon

      Instagram (www.instagram.com)

      posted in General Questions
      MorphoiceM
      Morphoice
    • RE: Drum synthesis?

      @griffinboy I love Stanford papers :)

      posted in General Questions
      MorphoiceM
      Morphoice
    • processorID sort alphabetically HISE

      Ahoi, is there a way to sort these alphabetically? it's really tedious to find the correct one if there are a lot of;)

      Screenshot 2024-11-29 at 17.33.48.jpg

      posted in General Questions
      MorphoiceM
      Morphoice
    • Design guideline to units/measures

      I*m just dropping this here as a guide because I just researched it, as I tend to make the mistake myself when designing my knobs and buttons. All units are preceded by a space, so it's 10 Hz not 10Hz etc. Keep it in mind when designing your plugins and button values/labels etc ;)

      The International Bureau of Weights and Measures takes a no-nonsense approach: ‘The numerical value always precedes the unit, and a space is always used to separate the unit from the number,’ it says.

      The only exceptions it makes are for the unit symbols for degree, minute, and second – °, ‘ and ” respectively – which don’t need a space.

      posted in General Questions
      MorphoiceM
      Morphoice