Forum
    • Categories
    • Register
    • Login
    1. Home
    2. Morphoice
    3. Posts
    • Profile
    • Following 5
    • Followers 2
    • Topics 158
    • Posts 892
    • Groups 0

    Posts

    Recent Best Controversial
    • RE: Dolby Atmos?

      @Christoph-Hart that's superb news! I'm so looking forward to bringing my AMS RMX16 clone to dolby atmos to have that gated reverb in my next album. It was a stupid idea to start making an album in atmos anyways but hey... why not

      posted in General Questions
      MorphoiceM
      Morphoice
    • RE: Dolby Atmos?

      bump

      posted in General Questions
      MorphoiceM
      Morphoice
    • Dolby Atmos?

      Does HISE support the creation of spacial plugins in e.g. a 7.1.4 configuration that enables me to write faust DSP that deals with all the discrete channels accordingly?

      posted in General Questions
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey no they need to ring out. i will probably limit it around 16 voice cards or something like a real synth would have

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey in the mean time i found a workaround to override the faust bug by handling the sustain logic in the keyassigner. this however breaks if more than 128 notes are played until the last pedal release. but i guess i could just reserve more slots

      const globalRouting = Engine.getGlobalRoutingManager();
      reg midiList = Engine.createMidiList();
      reg pedalDown = false;
      reg pendingReleases = [];
      pendingReleases.reserve(128);
      
      inline function setPolyAfterTouch(eventId, slotIndex, value)
      {
      	globalRouting.setEventData(eventId, slotIndex, value);
      }
      
      function onNoteOn()
      {
      	// Make the event artificial so Synth.noteOffByEventId can release it later.
      	// The HISE API only accepts artificial event ids (see ScriptingApi.cpp:5499-5510).
      	midiList.setValue(Message.getNoteNumber(), Message.makeArtificial());
      }
      
      function onNoteOff()
      {
      	local n = Message.getNoteNumber();
      	local id = midiList.getValue(n);
      
      	if (pedalDown)
      	{
      		// Defer: keep the voice alive until pedal release.
      		pendingReleases.push(id);
      		Message.ignoreEvent(true);
      	}
      	else
      	{
      		// Release the artificial voice. Let the real noteOff propagate too so
      		// the synth can match older retriggered voices by note number.
      		Synth.noteOffByEventId(id);
      	}
      }
      
      function onController()
      {
      
      	if (Message.getControllerNumber() == 64)
      	{
      		if (Message.getControllerValue() >= 64)
      		{
      			pedalDown = true;
      		}
      		else
      		{
      			pedalDown = false;
      			for (id in pendingReleases)
      				Synth.noteOffByEventId(id);
      			pendingReleases.clear();
      		}
      		Message.ignoreEvent(true);
      	}
      
      }
       function onTimer()
      {
      	
      }
       function onControl(number, value)
      {
      	
      }
       
      
      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey i think i isolated the problem and filed an issue, it's in fact three problems
      https://github.com/christophhart/HISE/issues/954

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey there is no waveform generator in a silent synth

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey there's also another bug in the hise/faust midi implementation.... if a key is held and the pedal released, the note stops. although the key is still held.... weird.

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey i believe it was this thread
      https://forum.hise.audio/topic/11793/polyphonic-aftertouch/34?_=1778856642370

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey nope, we had this discussion here a long time ago and this was the only working way

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey handle polyphonic aftertouch and pitchbend by sending their values to a knob in the faust (not present in the snippet example)

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey oh yes, the pleasures of building with faust and ending up without faust .... ;)))

      im very strongly convinced the issues is within how hise implements faust as explained in the post before, not the faust dsp itself. then again that would only explains the issue that notes are not sustained even though the pedal is pressed...

      the other problems are the orphan notes that might still be a problem of the keyassigner... some never get released when the pedal is released.... could be some sort of orphans from a tretrigger of the same note...

      my forte is coding dsp, all that stuff around that makes the world tick -- no clue

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey dead code

      is there a faust node in the polyphonic scriptfx?

      toes it have a dsp code?

      if not put this

      // Faust Source File: Test
      // Created with HISE on 2026-05-15
      import("stdfaust.lib");
      
      gate = button("[20]gate");							// note on off
      freq = hslider("[21]freq", 200, 20, 20000, 0.1);	// note frequeny
      gain = hslider("[22]gain", 0.0, 0.0, 1.0, 0.01);	// note velocity
      
      attack 			= hslider("AttackTime[style:knob]",0.2,0,6,0.001);
      attackSlope 	= hslider("AttackSlope[style:knob]",0.7,0,1,0.001);
      decay 			= hslider("DecayTime[style:knob]",0.3,0,6,0.001);
      decaySlope 		= hslider("DecaySlope[style:knob]",0.3,0,1,0.001);
      sustain 		= vslider("SustainLevel[style:knob]",0.5,0,1,0.001);
      release 		= vslider("ReleaseTime[style:knob]",1,0,6,0.001);
      releaseSlope 	= vslider("ReleaseSlope[style:knob]",0.3,0,1,0.001);
      velDepth 		= vslider("velDepth[style:knob]",1,0,1,0.001);
      legato 			= vslider("Legato[style:knob]",0,0,1,0.001);
      
      ramp   			= en.adsr(0, release * 0.15, 0, 0, 1 - gate);
      dramp   		= en.adsr(attack, decay * 0.1, 1,0, gate);
      rslope			= releaseSlope - ramp * 0.25;
      dslope			= decaySlope - dramp * 0.20;
      
      velocity 		= 1*(1-velDepth*((1-gain))); 
      
      envelope 		= en.adsr_bias(attack, decay, sustain, release, attackSlope, dslope, rslope, legato, gate) 
      				: hbargraph("CV",0,1);
      
      
      osc = os.polyblep_triangle(freq) * envelope;
      
      process = osc,osc;
      
      
      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey my guess is on something along the path from hise to faust or faust itself
      so i pointed claude to it which revealed the following, which might be the cause and is beyond my reach

      FaustUI.h:201 — each Faust voice has its own MidiZones struct containing a sustain flag:

      
      struct MidiZones {
          float* zones[(int)HardcodedMidiZones::numHardcodedMidiZones];
          bool sustain = false;     // <-- per-voice, defaults to false
      };
      

      PolyData<MidiZones, NumVoices> midiZones;
      FaustUI.h:357-365 — the reset() method only zeros the pointer array, never resets sustain:

      void reset() {
          // ... clears modoutputs, parameters
          for (auto& mz : midiZones)
              mz.reset();   // ← only memsets zones[] to 0
          anyMidiZonesActive = false;
      }
      

      The struct's mz.reset() is:

      
      void reset() {
          memset(zones, 0, sizeof(float*) * ...);   // does not touch sustain
      }
      

      FaustUI.h:330-338 — note-off behavior:

      
      else if(e.isNoteOff()) {
          auto& mz = midiZones.get();
          if(!mz.sustain)              // ← only releases if THIS voice's sustain flag is false
              if (auto gatePtr = mz.zones[(int)HardcodedMidiZones::Gate])
                  *gatePtr = 0.0f;
      }
      

      The mechanism: mz.sustain is set ONLY by the CC 64 handler (FaustUI.h:339-356) — never on voice start, never on reset. So a voice that was allocated AFTER the pedal CC came in, OR whose voice slot has never received a CC 64 during its lifetime, has mz.sustain == false — its gate gets dropped to 0 on note-off regardless of what the JUCE voice manager thinks about the pedal.

      This is independent of JUCE's voice-level sustain handling. The HISE voice manager keeps the voice ALIVE (because JUCE's sustainPedalDown is true), but the Faust envelope's gate has already gone to 0 — so the voice produces silence (release tail) and gets killed by silent_killer.

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey if the snippet correctly carries the faust code this should be a minimal example displaying the problem

      HiseSnippet 3297.3oc6azzaabbcojVGSZYG6jf1dqCzIJYJJ9gjhcbcs9z1pwxR0TQH.FBtK2cH4TsblM6LTVLAFnWJPQ+ATfbp4uQtz1qEn2xe.idnmygdO88lY4xc4GxzpxIMoYAr3tuYdeNu4Mu2aWSOUQ4dTumI4rf.pxxJyz6GJboRoHzJStC5FPsxLqcstbUqMa4v3V6rE.29i3RkScep0FcCbjRpmUlLS+.b7LYmwRe802aCGeGtKsOHKqCELW5iXsYp9P2esOj46eeGO5Ar1Il8xqsiqfuovWzAjkosKYE33drSS5icvoMks0Ccjsrxrfc8k8JSotqVttW8FUpVYkRzpMVdYZUu5qznZ4aeKG5p0KUshUlKssGSIBqobTToUlY1P30sVKwy4FFbHSxPsBdnrUMfyFv2W36gpHB0ZyVLeuXijDLY1ILYSaLYum8tLOVL79ltqqGfzGijFvLSkV7lNk3UNo3UJg3MBQJSBQZFiHcC6Ztgr.U+QP44J16vUzvFNtoWKMy0Zp+8z141T.SgqJ114X58CgGhQI+pkJUfrboRyembZejhdzFzvMc78qCqUx7pvNz4uCIWtl9h5N9jsOAHDIa1r2k7Yu3N4xoetHWnn63IMve5Qv7SAuXHURCOglubkaALBuZHBI4Yj6RJcGB6W.vget4MmO2mkKaJTeJ6HhljCCOlpUq.D8E4htZzg6pXBNQveLL28340TEl.YvgZzXjiglqPguOMbjCiN4QirdGUKQHS5fCUzsE083snsEaeZ.KradTUytzRDegKX47omP8Ac4ILdys4v8h.ZwlT0lcBCAE6Q3vHJ8wPFPodQXTCuGm9gN9cn4mmrfgfl4iyXWgWGeGv4qnjpVWoBY06nn4gk2xy+JmU4BFtEIxfEPJ7oECBYbUdMivQdwvFo77NsqSCKPNAkKznPfqkVfPNnESRbibjH+1NRk9IIQ0hRBfn.jVNbOePl5abeNS0RONrzFPAXmXlZQMUAhBTkRDvLBIt.EEsi4fj3DRIr1A9z1f4DLbLtlTB9NblhH06GhHzR4xJAd41JR7mWC1H63kqijRhzP49f.rQGkRv+.iHSOvotLexggcH0CoNGemzTX6FM.kXbDHwniA+8QOb0XPu+fow9Ef6JDyHcfH6wGHJYbRWSfhDSzX81KfxGWzSqnnKvcezNa4nbvnWQvf4EPCULTDxrE8D3rCSrrr1aQkGqDA541NPvQJjIqRO5Uihz8Hm5TeKFDO6crqQCYN9Z8w.9z3CZt7eZstwO7x+3ZOm4oZEC328qWqEk0rUhCr9kqonmpzm.UuYuyml0d4J251qb6pkqth0IICTaMbrX3TfdajRdz.d.Zz.f6bp3wXHWtjo5l7.1KryKlTQ7F16it8iVFmZDxHrX9lPFiNk8p1lMA8EvYru+G+l4H0jr+xiIunqZ.PkrOkFNtTi9aeY1WNooFELwoFkY5+OIyloFkav5gAzlMYnyZzBQRHI8QGzNM8jEY6rhak4cihkCS0D.5ZQAfLgc0QftlsQJh.oOtK4pu0DPiqZ+DLl8qMIp4y7.+QjDus8i6ztlhFDAa.hTZsIgHWwFofVVNeRw00Dn1wrwHFe88lDyAPEQn5Cock+2XQ.kAyb4C4h5CRfWNrXb8HB.G5TWrg3z3SW9jNTX+bL3WMkFgnbU68bUNmPehCuI87oMYsq0pSiF9zWCIHgI8J1aywx5NfQOq0jYLD3cRw+8grnzD48.yQa1AvYxIFXPp8W8vi5y7T6UWtHb03l3eu8lvept2EyyVSt7dHjMsKbt02Oj22w9QTdSUqIVZab7FqWr3g+psJV7iE6ew7r0js03F1vADbN0uF0GNnVLIa0GIg9o160QEzQcAQtaXu69aCmAD1ifCscasIiPuMRns4digLmQ.0Da6tj8CgygGwN9IsJ9qYCgAIqKkrl7Ax7HtPdaaHkAnJJSk3OQzQg0NcWx17lLttTxGjbjcc3PsAgXIkgzlj1vY6OhAnGifKTyfhtaDbc0p4fpDe.UQNby8V5vMqQnlRTfZnboDGETRESAYgy9Tcti4zHjENEgPwZyQeVhRnq5xTtEW3QIMNMGiC04Q6WmGV3hvu65MTzvCDcf5vzDXGOnLTegZGtG8zDkTlMkJiUtp6E.VrwYfH1SfQ2LfbYMEXyAiwtvh.VgIX9vY7Xc8f55v6YwP9Yp5lWHd5XqTVGproAyELH4mGQPW5buI.KjhPpVNiZhBNZ5dXvO5okv1aX57RfuSWTDRxFrf+nXaZdj6rZiwjnTFVwMnsQ2sMVu7w5ZbGF3wpzB4xdVJUTmbfpsSqbiQFNZ9bYAYcbBBCI4KxkEJQeTsaHtmLrFj7wRkL1YRocllOhGQFjArHo87Fv9Dgi1C5rPCq9V1IjF0NFDygcpGgUkOeARoHOTxBj7kWpbk2WapyltoKyYrHaQl6lijL2btBD8CvD54uCFtzVFr8RwFtdZI4t2kfMhKoMJ.qJ7vgU59X2SQIPHhRKVd0p2pZAhK1okPLxvsJe6JwTCAKABkOAYWTOk4IKo+sXIP4qTpTwRZBBr4DXwaXiftZUPC0TT2bJrQVqGD320Hy0obOLliiuOQHcghsvJFjv7fXXkGnIWqXjXo1bCiW4rGu1.3e6AFtx3G9EiumgitYiC2GM8D+dTib9wtj7CztjbU6ZLezYBiXqY+r13lKywV+uTWRJeN6RxLeO98+7tQP6KQkGU5iY9GlVaggr.ApiuGZxeBEBd0DxRj5oy7ngiuDamr45ay2jxOFUb7QEm5GiJ9cbTwQsc7Z1X1dlsW.eQA3mnAEzRvYtjnskCHR81N9ysGk6dBOb6K71bZ8Xp54hvi05Sz8PPdTvuj8AToxZceewywWGCKZAVScMz9JVD+ogR8LdKaHIthkrLnQiJid81hN3KzwNyT.i66xrAjf3w0XeJEGB8Pdni7.GlO5AUqiD1G5sGWebCdpAtB9XnDRP.uuC1sft66fuYmafUBqfkcZXQ23k+Hknu0FMHlO0fngPZ06zDC6Aots9MOMkMLebbi0wvTjpukcCmN.toDfYAAHjVzLxnXXOrdUbLQDDSmwwmfsPSgrNq8l9.k2wy5PSiEhTCqAlmtmv66DBbFxFW1a11YzLLw.VYxE+Db+tL9gC1whccN8vA6HitWu50LMrWta88uWsioO2XRRNynV2qTNvpL9BtsNfdp5.gljQI4ir9J1eDTodCXAzyBeClZqQsN0ePnnSf9gjBwuoQi+081hBVTe0Pvsd80ne1ZudZzrQZjN4jKBE5K97O+uOJERC25M+RzrvwStNcu3VgVqZ0uZTJjF92BqPWwnPWXKPWz5yq6BzkseDsIb56EhxnuFgxD0gx23Jy0reB0m5Ho+vwe6p8ToKJOtu32+W9y+y6M5Eou9deqrHAG+hGop+Njtn76d4XToWdgnRFXiUktjMrEh9c9VnkWaHU4O7UC5uAQ9+xyTUZDR+jKJUgs1nUE1ZV0zeUTG3D1jpzYBkDPTkObpNsU4.4VXkJWlLCjixr16HODG00wum7.4FtgPbbaGcNomuxqheYGPgrmB47fucbHaK2dIhJ6kCZzyk5kGVMHUS8CeCbEMX4dIMgCVt2f+fgGscbCEOyM56VCLzWVCARCkqSZMq8t3yjxC+hrvVP+LW2zjZHDqbdQr54EwkOuHtx4EwUOuH99mWDu0qFQrkTq2QIZaJaChdt+15MSYxX9d.z0dZQaWm54Q8LEgh64hgvomdenrK8V2FLrvxoveLRx0MUyrDV8QQOYPuFoXM0WMi8RKQtONJw3uRPx7ADbp3aSbS8KYzy7kc9vcpsMTsKoRoJqtXoUVr7J4XsCDgp7yIUdZdTzmUeNrQ+XraxcI00uj07y8zJkNBAAik0bADGe6QH8DMZjCCPByukT+R0QDJeDBatB36Y.+i9F71REKCToG93j5P4cANx3ooPkiPXygXTJ5OkitKIENI5MzkKmitNAymAcLc5W7vSkptfw4Xtn9QyUnTwJEJUXU32RH4hPVmjDYX70vGj.uOPfxwDvCyAd.lGmW7fnVMEu8hqGfLL5ij0USwZoI4AMxmzC4jYTLH5qjB8PS1ToQOQJVowtbJQOLQxkjQf+DH8f7sEM.bPSw+dPGl48wzWmltwlGinI28AXYJzxAGaFPHF7n7hNdxP7K0tmcXAzGcE8aJD84HKRPeebcJFw93Y7aJPLK+ZTAb.90CoPIZBz7JkwZQhlZHFUVAnc+okvcXQhW+YUBD8dd6ZYn7B4KuXOC0B4gGvcLyOu9+x.znux8jR6ypybjoE4BjHumX8u.IwdAXVRyugQ+ZL5QpGIGFL3CHspC4nD5DzJ+badHZu014bBoKrmVHKB2jG2pie478DLXBAlVkomiaA3e2Imk0+A.ejyFa
      
      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey i thinned the project down and stripped all the effects, gui etc... which changed nothing but the waveform generator inside the synth container words fine and doesnt show the error. ... so it must be in the way either a silentsynth behaves or the faust implementation. faust just passes the midi to the parameters gate, gain, velocity, frequency etc... im not doing anything weird with it...

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey it would take significant time to douplicate the project and strip it down to the essentials in question, also about everything that makes a noise is a hardcoded faust

      before i do that a closer observation:

      if i press the pedal and hit a note, it is not sustained, if i hit it again it is sustained. ntextr ty not sustained on the first hit, sustained on the third hit. pedal kept pressed between hits... does this help narrow it down?

      i am not sure but it might have to do with multiple instances of the same note... but just a hunch.

      posted in Scripting
      MorphoiceM
      Morphoice
    • RE: suck notes with keyassigner script in silent synth

      @David-Healey yes, KeyAssigner.js as a separate ScriptProcessor in the SynthesizerContainer which holds two silent synths. its in the container tho, not the silentsynths.

      global ControlValue = {}; is dead code from an earlier iteration.

      keysdown is i believe also never used and from an earlier iteration, i should eremove those
      reg i is leftover from the commented-out for (i in Event.noteIds...) block

      posted in Scripting
      MorphoiceM
      Morphoice
    • suck notes with keyassigner script in silent synth

      Ahoi,

      i'm having trouble with my keyassigner for a silentsynth that uses faust scriptnodes for VCO, VCF and VCA... it works just fine, but sometimes notes randomly (presumably) get stuck on sustain and need an extra pedal press/release to stop.... it took me about a year to get this far, and neither AI nor me can figure out what could be wrong... anyone any ideas?

      const globalRouting = Engine.getGlobalRoutingManager();
      reg keysdown = [];
      reg midiList = Engine.createMidiList();
      
      reg i = 0;
      
      global ControlValue 	= {};
      
      // Get VCO/VCS effects once at initialization
      const VCO1 = Synth.getEffect("VCO1");
      const VCO2 = Synth.getEffect("VCO2");
      const VCS1 = Synth.getEffect("VCS1");
      const VCS2 = Synth.getEffect("VCS2");
      
      
      //	set eventdata to the scriptnode fx
      inline function setPolyAfterTouch(eventId, slotIndex, value)
      {
      	globalRouting.setEventData(eventId, slotIndex, value);
      }
      function onNoteOn()
      {
      
      	local n = Message.getNoteNumber();
      	midiList.setValue(n, Message.makeArtificial());
      	keysdown.push(n);
      
      	//Message.ignoreEvent(true);
      	//Event.noteIds[n][0] = Synth.playNote(n, Message.getVelocity());
      
      
      }
       function onNoteOff()
      {
      	local n = Message.getNoteNumber();
      	Synth.noteOffByEventId(midiList.getValue(n));
      	keysdown.remove(n);
      
      	/*
      	Message.ignoreEvent(true);
      	for (i in Event.noteIds[Message.getNoteNumber()])
      	{
      		Synth.noteOffByEventId(i);
      	}
      	*/
      
      }function onController()
      {
      	if (Message.isPolyAftertouch())
      	{
      		local nn = Message.getPolyAfterTouchNoteNumber();
      		local value = Message.getPolyAfterTouchPressureValue();
      		setPolyAfterTouch(midiList.getValue(nn), 0, value * (1/127));
      		Console.print("EventID "+midiList.getValue(nn)+", Value "+value);
      	}
      
      	if (Message.getControllerNumber() == 128)
      	{
      		local pitchValue = Message.getControllerValue(); // 0-16383, center at 8192
      		local cents = (pitchValue - 8192) / 8192.0 * 200.0; // Convert
      		Console.print("Pitch "+cents);
      
      		// Apply pitchbend to all oscillators
      		VCO1.setAttribute(15, cents);
      		VCO2.setAttribute(15, cents);
      		VCS1.setAttribute(9, cents);
      		VCS2.setAttribute(9, cents);
      	}
      }
       function onTimer()
      {
      	
      }
       function onControl(number, value)
      {
      	
      }
       
      
      posted in Scripting
      MorphoiceM
      Morphoice