ArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArrayArray
BrainModularBrainModular Users Forum2016-02-08T21:56:38+02:00https://brainmodular.com/forums/app.php/feed/topic/52982016-02-08T21:56:38+02:002016-02-08T21:56:38+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34693#p34693 Mis-named my HH folders.
So yeah, 2.0 is not working well for me yet, but I'll go in and try to figure things out at some point.
Statistics: Posted by woodslanding — 08 Feb 2016, 20:56
]]>2016-02-08T21:54:51+02:002016-02-08T21:54:51+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34692#p34692 I guess I will just send keyboard 2 in on the buss. It pushes its latency up to 128, but that's better than stuck notes. And kbd1 can stay at 64.
I guess this was probably fixed in 1.2, but I'm not going to try to port to 1.2 with a looming 2.0 release.....
Thanks for the tip!!
-e
Statistics: Posted by woodslanding — 08 Feb 2016, 20:54
]]>2016-02-08T18:41:37+02:002016-02-08T18:41:37+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34691#p34691 Latency is everywhere. It's a necessary evil.
Latency even exists in analog systems. IIRC, It takes sound ~3 ms to travel one meter. In most cases, the latency we're talking about is the equivalent of taking another step or two further away from your amp - pretty much imperceptible.
Don't be afraid to increase your blocksize. As Robert Fripp says: "Honor necessity."
]]>2016-02-08T16:30:18+02:002016-02-08T16:30:18+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34690#p34690 I hope it's not a bug, as I don't expect any bug fixes will be coming on the v1.1 tree. And since the midi busses introduce latency themselves it's not really viable as a workaround. But I'll try it.
Sadly, I cannot rebuild my wkp as fast as Olivier rebuilds usine.....
-e
Statistics: Posted by woodslanding — 08 Feb 2016, 15:30
]]>2016-02-08T06:40:35+02:002016-02-08T06:40:35+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34685#p34685 I am assuming both keyboards are visible as two different midi input devices/ports.
If you open the device panel, and double-click on one of your MIDI INPUT ports, you'll see a device patchlet that routes your input signal. You should see a "From MIDI Device" module connected to a "MIDI to Usine" module.
You can edit these device patchlets to suit your needs. Instead of sending the MIDI streams to "MIDI to Usine" you can create a MIDI bus for each keyboard. Downstream, use your newly created MIDI buses instead of your normal MIDI Inputs.
This way, your two keyboards have distinct paths & you can route the signals however you wish independently of each other. They are no longer mixed together.
*** If you bypass the "MIDI to Usine" module, HH's MIDI learn functions will not work. That is the tradeoff of this technique. *** Of course, MIDI learn functions within your VST will still work.
If performance improves & you get no more stuck notes, then create a bug report. There was a very old bug where the single merged Usine MIDI stream caused stuck notes. If using MIDI buses gets rid of your stuck notes, that old bug may have resurfaced.
]]>2016-02-08T04:02:35+02:002016-02-08T04:02:35+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34684#p34684Statistics: Posted by sephult — 08 Feb 2016, 03:02
Statistics: Posted by woodslanding — 07 Feb 2016, 23:07
]]>2016-02-08T00:05:35+02:002016-02-08T00:05:35+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34682#p34682 I bypassed the script altogether and it still happens (oops!) So the whole subject of the post is a red herring.
I have midi coming in two separate interfaces. Babyface recieving on channel 1, and iConnect MIO on channel 2.
The stuck notes ONLY happen on channel 2.... BUT ONLY when I am playing channel 1 at the same time!!! I cannot get channel 2 notes to stick no matter how hard I try. I can bang the whole keyboard repeatedly with my forearm, and nothing sticks. But play a simple 8th note line on channel 2 along with a bass line on channel 1, and I get stuck notes every 5 seconds or so.
This is taking both channels directly into the vst from the input devices on the track with no processing. There is no CC data coming in whatsoever, just notes on two channels.
It would be sad if MIDI processing issues took away the latency gains I spent $1200 on a new computer specifically to get
I may try a different midi interface on ch2 and see if that helps.
Statistics: Posted by woodslanding — 07 Feb 2016, 23:05
]]>2016-02-07T19:30:15+02:002016-02-07T19:30:15+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34678#p34678 MIDI is single bytes of information, Shouldn't it be like 1000th of the bandwidth of audio?
Statistics: Posted by woodslanding — 07 Feb 2016, 18:30
]]>2016-02-07T17:41:13+02:002016-02-07T17:41:13+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34677#p34677 Increase blocksize gradually until you find a happy compromise between stability and performance.
]]>2016-02-07T17:36:30+02:002016-02-07T17:36:30+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34676#p34676Statistics: Posted by shawnb — 07 Feb 2016, 16:36
]]>2016-02-07T16:56:34+02:002016-02-07T16:56:34+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34675#p34675 I'm going to try to put 2 of these scripts in each channel, so they can both concentrate on one channel and see if that helps.
I also note that I am getting stuck notes on an older branch of my wkp which I have been using without issue for months and months. It just started giving me stuck notes under my new computer. I have been able to reduce latency from 256 to 64.... and now I'm getting stuck notes.
I guess the 64 blocksize puts greater demands on the system? So I'm a little concerned that there isn't a scripting solution?
I should also note that I am still using 1.1. I don't know if the script engine changed in 1.2, but obviously some things did, as I am having a lot of problems with my wkp. Also CPU has gone from 35% to 55%.
-e
Statistics: Posted by woodslanding — 07 Feb 2016, 15:56
]]>2016-02-07T02:38:44+02:002016-02-07T02:38:44+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34662#p34662 Just wondering if one of the script gurus can look it over, and make sure I'm putting the appropriate parts of it in process() and callback() or if there are any other red flags that would cause concern.
Thanks in advance for any thoughts.
[c]///////////////////////////////////////////////////////////////////////////// // TO DO: // Disable transpose for drum channel, but send out midi CC4 instead // We must account for two keyboards--the bass split should only affect // a keyboard that is assigned to bass. How do we do that???? // // /////////////////////////////////////////////////////////////////////////////
VAR midiIN, clearIN, midiOUT, transposeIN, bassOn1IN,bassOn2IN,orgRechIN : tParameter; var splitIN : Tparameter; var rhBassIN: Tparameter; var handsIN: Tparameter; var isBassIN : Tparameter; var isDrumIN: Tparameter;
VAR transpositions : ARRAY OF integer; VAR noteONs : ARRAY OF boolean;
VAR midi : tMidi; VAR midiCount, transpose, i , orgRech : integer; VAR clearing, newTranspose: boolean; var splitval: integer; var rhBass,hands,isBass, bassOn1, bassOn2, isDrum: boolean;
SetFormat(splitIN,'%.0f'); SetMin(splitIN,2); SetMax(splitIN,126); SetDefaultValue(splitIN,62); SetFormat(transposeIN, '%.0f'); SetMin(transposeIN, -24); SetMax(transposeIN, 24); SetMin(orgRechIN, 0); SetMax(orgRechIN, 2); SetArrayLength(transpositions, 128); SetArrayLength(noteONs, 128); for i := 0 to 127 DO BEGIN transpositions := 0; noteOns := FALSE; END; clearing := FALSE; newTranspose := FALSE; END; // Init
procedure makeHands; var note : integer; begin if hands then begin note := midi.data1; if note > 60 then midi.data1 := note - 12 else midi.data1 := note + 12; end;
end;
procedure callback(n: integer); BEGIN IF (n = clearIN) and (getValue(clearIN) > 0) THEN clearing := TRUE ELSE IF (n = transposeIN) THEN newTranspose := TRUE ELSE IF (n = handsIN) or (n = splitIN) or (n = isBassIN) or (n = bassOn1IN) or (n = bassOn2IN) or (n = isDrumIN) or (n = rhBassIN) THEN // if any of the split settings change, best clear existing notes! BEGIN splitval := round(getValue(splitIN)); rhBass := getValue(rhBassIN) > 0; hands := getValue(handsIN) > 0; isBass := getValue(isBassIN) > 0; bassOn1 := getValue(bassOn1IN) > 0; bassOn2 := getValue(bassOn2IN) > 0; isDrum := getValue(isDrumIN) > 0; orgRech := round(getValue(orgRechIN)); clearing := TRUE; END; END;
// process procedure process; var outCount,note,chan: integer; var ccTrans: integer; var newMidi: tMidi; BEGIN midiCount := GetLength(midiIN); outCount := 0; IF clearing then BEGIN
for i := 0 to 127 DO BEGIN // send note off s if noteONs := TRUE THEN BEGIN midi.channel := 1; midi.msg := 128; midi.data1 := i; midi.data2 := 0; setMidiArrayValue(midiOUT, outCount, midi); outCount := outCount + 1; noteONs := FALSE; END; END; // send sus pedal off! midi.channel := 1; midi.msg := 176; midi.data1 := 64; midi.data2 := 0; setMidiArrayValue(midiOUT, outCount, midi); outCount := outCount + 1; setLength(midiOUT, outCount); clearing := FALSE; END ELSE IF newTranspose then BEGIN if isDrum then begin transpose := round(getValue(transposeIN)); // create midi cc4 out for drum tuning ccTrans := (round((transpose * 1.76) + 64)); //strace('____________CC TRANS = ' + intToStr(ccTrans)); newMidi.msg := 176; newMidi.channel := 1; newMidi.data1 := 4; newMidi.data2 := round(ccTrans); SetMidiArrayValue(midiOUT, outCount, newMidi); outCount := 1; setLength(midiOUT, outCount); end; newTranspose := FALSE; END ELSE IF (midiCount > 0) THEN BEGIN IF isDrum then transpose := 0 else transpose := round(getValue(transposeIN)); FOR i := 0 TO (midiCount - 1) DO BEGIN GetMidiArrayValue(midiIN, i, midi); note := midi.data1; chan := midi.channel; IF ((chan = 1) and (not bassOn1)) OR ((chan = 2) and not (bassOn2)) OR //ALLOW NOTES ABOVE AND BELOW IF KEYB IS NOT SUBJECT TO BASS (((note >= splitVal) AND ((not isBass) OR (isbass AND rhBass))) //ABOVE SPLIT OUT OR ((note < splitVal)) AND ((not isBass) OR (isbass AND not rhBass))) THEN BEGIN //BELOW SPLIT OUT if (orgRech > 0) then midi.channel := orgRech; //if it's 0 leave ch unchanged IF ((midi.msg = 144) AND (midi.data2 > 0)) THEN BEGIN // NoteOn if hands then makeHands; transpositions[midi.data1] := transpose; // Store transpose value used for NoteOn noteOns[midi.data1] := TRUE; midi.data1 := midi.data1 + transpose; END ELSE IF ( (midi.msg = 128) OR ((midi.msg = 144) AND (midi.data2 = 0))) THEN BEGIN // NoteOff if hands then makeHands; if (not isDrum) then begin midi.data1 := midi.data1 + transpositions[midi.data1]; // Retrieve stored transpose and add to NoteOff noteOns[midi.data1] := FALSE; end; END; SetMidiArrayValue(midiOUT, outcount, midi); outCount := outCount + 1;
END; END; setLength(midiOUT, outCount); END ELSE BEGIN SetLength(midiOUT, 0); END; END; [/c]
Statistics: Posted by woodslanding — 07 Feb 2016, 01:38
]]>BrainModularBrainModular Users Forum2016-02-08T21:56:38+02:00https://brainmodular.com/forums/app.php/feed/topic/52982016-02-08T21:56:38+02:002016-02-08T21:56:38+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34693#p34693 Mis-named my HH folders.
So yeah, 2.0 is not working well for me yet, but I'll go in and try to figure things out at some point.
Statistics: Posted by woodslanding — 08 Feb 2016, 20:56
]]>2016-02-08T21:54:51+02:002016-02-08T21:54:51+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34692#p34692 I guess I will just send keyboard 2 in on the buss. It pushes its latency up to 128, but that's better than stuck notes. And kbd1 can stay at 64.
I guess this was probably fixed in 1.2, but I'm not going to try to port to 1.2 with a looming 2.0 release.....
Thanks for the tip!!
-e
Statistics: Posted by woodslanding — 08 Feb 2016, 20:54
]]>2016-02-08T18:41:37+02:002016-02-08T18:41:37+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34691#p34691 Latency is everywhere. It's a necessary evil.
Latency even exists in analog systems. IIRC, It takes sound ~3 ms to travel one meter. In most cases, the latency we're talking about is the equivalent of taking another step or two further away from your amp - pretty much imperceptible.
Don't be afraid to increase your blocksize. As Robert Fripp says: "Honor necessity."
]]>2016-02-08T16:30:18+02:002016-02-08T16:30:18+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34690#p34690 I hope it's not a bug, as I don't expect any bug fixes will be coming on the v1.1 tree. And since the midi busses introduce latency themselves it's not really viable as a workaround. But I'll try it.
Sadly, I cannot rebuild my wkp as fast as Olivier rebuilds usine.....
-e
Statistics: Posted by woodslanding — 08 Feb 2016, 15:30
]]>2016-02-08T06:40:35+02:002016-02-08T06:40:35+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34685#p34685 I am assuming both keyboards are visible as two different midi input devices/ports.
If you open the device panel, and double-click on one of your MIDI INPUT ports, you'll see a device patchlet that routes your input signal. You should see a "From MIDI Device" module connected to a "MIDI to Usine" module.
You can edit these device patchlets to suit your needs. Instead of sending the MIDI streams to "MIDI to Usine" you can create a MIDI bus for each keyboard. Downstream, use your newly created MIDI buses instead of your normal MIDI Inputs.
This way, your two keyboards have distinct paths & you can route the signals however you wish independently of each other. They are no longer mixed together.
*** If you bypass the "MIDI to Usine" module, HH's MIDI learn functions will not work. That is the tradeoff of this technique. *** Of course, MIDI learn functions within your VST will still work.
If performance improves & you get no more stuck notes, then create a bug report. There was a very old bug where the single merged Usine MIDI stream caused stuck notes. If using MIDI buses gets rid of your stuck notes, that old bug may have resurfaced.
]]>2016-02-08T04:02:35+02:002016-02-08T04:02:35+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34684#p34684Statistics: Posted by sephult — 08 Feb 2016, 03:02
]]>2016-02-08T00:07:26+02:002016-02-08T00:07:26+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34683#p34683 -e
Statistics: Posted by woodslanding — 07 Feb 2016, 23:07
]]>2016-02-08T00:05:35+02:002016-02-08T00:05:35+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34682#p34682 I bypassed the script altogether and it still happens (oops!) So the whole subject of the post is a red herring.
I have midi coming in two separate interfaces. Babyface recieving on channel 1, and iConnect MIO on channel 2.
The stuck notes ONLY happen on channel 2.... BUT ONLY when I am playing channel 1 at the same time!!! I cannot get channel 2 notes to stick no matter how hard I try. I can bang the whole keyboard repeatedly with my forearm, and nothing sticks. But play a simple 8th note line on channel 2 along with a bass line on channel 1, and I get stuck notes every 5 seconds or so.
This is taking both channels directly into the vst from the input devices on the track with no processing. There is no CC data coming in whatsoever, just notes on two channels.
It would be sad if MIDI processing issues took away the latency gains I spent $1200 on a new computer specifically to get
I may try a different midi interface on ch2 and see if that helps.
Statistics: Posted by woodslanding — 07 Feb 2016, 23:05
]]>2016-02-07T19:30:15+02:002016-02-07T19:30:15+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34678#p34678 MIDI is single bytes of information, Shouldn't it be like 1000th of the bandwidth of audio?
Statistics: Posted by woodslanding — 07 Feb 2016, 18:30
]]>2016-02-07T17:41:13+02:002016-02-07T17:41:13+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34677#p34677 Increase blocksize gradually until you find a happy compromise between stability and performance.
]]>2016-02-07T17:36:30+02:002016-02-07T17:36:30+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34676#p34676Statistics: Posted by shawnb — 07 Feb 2016, 16:36
]]>2016-02-07T16:56:34+02:002016-02-07T16:56:34+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34675#p34675 I'm going to try to put 2 of these scripts in each channel, so they can both concentrate on one channel and see if that helps.
I also note that I am getting stuck notes on an older branch of my wkp which I have been using without issue for months and months. It just started giving me stuck notes under my new computer. I have been able to reduce latency from 256 to 64.... and now I'm getting stuck notes.
I guess the 64 blocksize puts greater demands on the system? So I'm a little concerned that there isn't a scripting solution?
I should also note that I am still using 1.1. I don't know if the script engine changed in 1.2, but obviously some things did, as I am having a lot of problems with my wkp. Also CPU has gone from 35% to 55%.
-e
Statistics: Posted by woodslanding — 07 Feb 2016, 15:56
]]>2016-02-07T02:38:44+02:002016-02-07T02:38:44+02:00https://brainmodular.com/forums/viewtopic.php?t=5298&p=34662#p34662 Just wondering if one of the script gurus can look it over, and make sure I'm putting the appropriate parts of it in process() and callback() or if there are any other red flags that would cause concern.
Thanks in advance for any thoughts.
[c]///////////////////////////////////////////////////////////////////////////// // TO DO: // Disable transpose for drum channel, but send out midi CC4 instead // We must account for two keyboards--the bass split should only affect // a keyboard that is assigned to bass. How do we do that???? // // /////////////////////////////////////////////////////////////////////////////
VAR midiIN, clearIN, midiOUT, transposeIN, bassOn1IN,bassOn2IN,orgRechIN : tParameter; var splitIN : Tparameter; var rhBassIN: Tparameter; var handsIN: Tparameter; var isBassIN : Tparameter; var isDrumIN: Tparameter;
VAR transpositions : ARRAY OF integer; VAR noteONs : ARRAY OF boolean;
VAR midi : tMidi; VAR midiCount, transpose, i , orgRech : integer; VAR clearing, newTranspose: boolean; var splitval: integer; var rhBass,hands,isBass, bassOn1, bassOn2, isDrum: boolean;
SetFormat(splitIN,'%.0f'); SetMin(splitIN,2); SetMax(splitIN,126); SetDefaultValue(splitIN,62); SetFormat(transposeIN, '%.0f'); SetMin(transposeIN, -24); SetMax(transposeIN, 24); SetMin(orgRechIN, 0); SetMax(orgRechIN, 2); SetArrayLength(transpositions, 128); SetArrayLength(noteONs, 128); for i := 0 to 127 DO BEGIN transpositions := 0; noteOns := FALSE; END; clearing := FALSE; newTranspose := FALSE; END; // Init
procedure makeHands; var note : integer; begin if hands then begin note := midi.data1; if note > 60 then midi.data1 := note - 12 else midi.data1 := note + 12; end;
end;
procedure callback(n: integer); BEGIN IF (n = clearIN) and (getValue(clearIN) > 0) THEN clearing := TRUE ELSE IF (n = transposeIN) THEN newTranspose := TRUE ELSE IF (n = handsIN) or (n = splitIN) or (n = isBassIN) or (n = bassOn1IN) or (n = bassOn2IN) or (n = isDrumIN) or (n = rhBassIN) THEN // if any of the split settings change, best clear existing notes! BEGIN splitval := round(getValue(splitIN)); rhBass := getValue(rhBassIN) > 0; hands := getValue(handsIN) > 0; isBass := getValue(isBassIN) > 0; bassOn1 := getValue(bassOn1IN) > 0; bassOn2 := getValue(bassOn2IN) > 0; isDrum := getValue(isDrumIN) > 0; orgRech := round(getValue(orgRechIN)); clearing := TRUE; END; END;
// process procedure process; var outCount,note,chan: integer; var ccTrans: integer; var newMidi: tMidi; BEGIN midiCount := GetLength(midiIN); outCount := 0; IF clearing then BEGIN
for i := 0 to 127 DO BEGIN // send note off s if noteONs := TRUE THEN BEGIN midi.channel := 1; midi.msg := 128; midi.data1 := i; midi.data2 := 0; setMidiArrayValue(midiOUT, outCount, midi); outCount := outCount + 1; noteONs := FALSE; END; END; // send sus pedal off! midi.channel := 1; midi.msg := 176; midi.data1 := 64; midi.data2 := 0; setMidiArrayValue(midiOUT, outCount, midi); outCount := outCount + 1; setLength(midiOUT, outCount); clearing := FALSE; END ELSE IF newTranspose then BEGIN if isDrum then begin transpose := round(getValue(transposeIN)); // create midi cc4 out for drum tuning ccTrans := (round((transpose * 1.76) + 64)); //strace('____________CC TRANS = ' + intToStr(ccTrans)); newMidi.msg := 176; newMidi.channel := 1; newMidi.data1 := 4; newMidi.data2 := round(ccTrans); SetMidiArrayValue(midiOUT, outCount, newMidi); outCount := 1; setLength(midiOUT, outCount); end; newTranspose := FALSE; END ELSE IF (midiCount > 0) THEN BEGIN IF isDrum then transpose := 0 else transpose := round(getValue(transposeIN)); FOR i := 0 TO (midiCount - 1) DO BEGIN GetMidiArrayValue(midiIN, i, midi); note := midi.data1; chan := midi.channel; IF ((chan = 1) and (not bassOn1)) OR ((chan = 2) and not (bassOn2)) OR //ALLOW NOTES ABOVE AND BELOW IF KEYB IS NOT SUBJECT TO BASS (((note >= splitVal) AND ((not isBass) OR (isbass AND rhBass))) //ABOVE SPLIT OUT OR ((note < splitVal)) AND ((not isBass) OR (isbass AND not rhBass))) THEN BEGIN //BELOW SPLIT OUT if (orgRech > 0) then midi.channel := orgRech; //if it's 0 leave ch unchanged IF ((midi.msg = 144) AND (midi.data2 > 0)) THEN BEGIN // NoteOn if hands then makeHands; transpositions[midi.data1] := transpose; // Store transpose value used for NoteOn noteOns[midi.data1] := TRUE; midi.data1 := midi.data1 + transpose; END ELSE IF ( (midi.msg = 128) OR ((midi.msg = 144) AND (midi.data2 = 0))) THEN BEGIN // NoteOff if hands then makeHands; if (not isDrum) then begin midi.data1 := midi.data1 + transpositions[midi.data1]; // Retrieve stored transpose and add to NoteOff noteOns[midi.data1] := FALSE; end; END; SetMidiArrayValue(midiOUT, outcount, midi); outCount := outCount + 1;
END; END; setLength(midiOUT, outCount); END ELSE BEGIN SetLength(midiOUT, 0); END; END; [/c]
Statistics: Posted by woodslanding — 07 Feb 2016, 01:38