Bit Multiplexing, integer vs float
Moderator: herw
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
Leute, Leute, Stop!
Der eigentliche Multiplexer fehlt da noch.
Den hab ich erstmal rausgelöscht um nicht unnötig zu verwirren.
Na das ist mir ja richtig gut gelungen...
In dem Beispiel geht´s erstmal nur drum zu zeigen, wie der Umweg über Float eine Integer Zahl verfälscht!
Aktiviert doch mal für die gesendete Integer die Bits ab #23 und seht selbst was hinten wieder raus kommt (untere Anzeige).
Die Iteration habe ich hier nur zum Auslesen für die bitweise Anzeige benötigt. Für den eigentlichen BitMux-Bus ist keine Iteration oder sonstige hilfe aus Primary nötig.
Das Macro "Build Int" zeigt aber in der Tat schon das Grundprinzip des Mixens einzelner Bits zu einer Zahl.
Der eigentliche Multiplexer fehlt da noch.
Den hab ich erstmal rausgelöscht um nicht unnötig zu verwirren.
Na das ist mir ja richtig gut gelungen...
In dem Beispiel geht´s erstmal nur drum zu zeigen, wie der Umweg über Float eine Integer Zahl verfälscht!
Aktiviert doch mal für die gesendete Integer die Bits ab #23 und seht selbst was hinten wieder raus kommt (untere Anzeige).
Die Iteration habe ich hier nur zum Auslesen für die bitweise Anzeige benötigt. Für den eigentlichen BitMux-Bus ist keine Iteration oder sonstige hilfe aus Primary nötig.
Das Macro "Build Int" zeigt aber in der Tat schon das Grundprinzip des Mixens einzelner Bits zu einer Zahl.
-
- meister
- Beiträge: 149
- Registriert: 1. Oktober 2015, 14:36
Re: Bit Multiplexing, integer vs float
das hab ich heut morgen beim wach werden schon nach 2 klicks bemerkt. habs als gegeben angenommen und gedacht, na dann pfeiffen wir halt auf die oberen bitsQuietschboy hat geschrieben: In dem Beispiel geht´s erstmal nur drum zu zeigen, wie der Umweg über Float eine Integer Zahl verfälscht!
Aktiviert doch mal für die gesendete Integer die Bits ab #23 und seht selbst was hinten wieder raus kommt (untere Anzeige).
mein ziel ist es ja die niederen bits zu beeinflussen und die oberen wieder unverändert ins paket zu tun.
@herw ich hab halt anscheined mit ein paar fragen ein altes thema wachgerüttelt, welches sich hier überschneidet.
grob gesagt waren diese fragen:
kann man in core multiplexen?
kann ich eine float zahl aus dem audiostream auspacken, die niedrigsten bits randomisieren, alles wieder zusammen packen und als normalen audiostream weiterschicken?
wozu ja quasi mux und demux von float hinzugehört.
machts nun sinn?
Zuletzt geändert von Thala am 23. Februar 2019, 21:23, insgesamt 1-mal geändert.
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
So,die Kiddies sind im Bett, jetzt habe ich wieder etwas Ruhe...
...Und Thala auch...
Yeah, nur genau das wollte ich erst mal zeigen. Du bist im Kopf auch schon wieder meilenweit vorraus, oder?herw hat geschrieben: Ich muss ehrlich sagen, dass ich die Problematik nicht erkenne: Solange ich nur die unteren 24 Bit benutze, kann die zugehörige Ganzzahl als Gleitkommazahl in primary übertragen werden. In der zweiten Corecell kann ich sie ohne weiteres wieder als Ganzzahl bitweise auslesen.
Will man auch die oberen 8 Bits auch übertragen, dann muss man diese extra übertragen. Das geht also insgesamt mit einer zweistelligen Nachricht.
...Und Thala auch...
-
- meister
- Beiträge: 149
- Registriert: 1. Oktober 2015, 14:36
Re: Bit Multiplexing, integer vs float
wieder zu schnell, sorry hab editiert anstatt 2. post zu machen
-
- meister
- Beiträge: 149
- Registriert: 1. Oktober 2015, 14:36
Re: Bit Multiplexing, integer vs float
aber wie ich selbst grad bemerke:
die bits floaten ja... je nach kommastelle. dh randomisieren der letzten bits hätte mal 1,25% oder auch mal 2,5% oder auch mal 5% effekt auf das audiosignal, je nachdem wie laut es grad ist.
und ich bin schon gespannt ob dafür eine lösung kommt, aber glaube es nicht.
moment mal, man weiss ja wo die kommastelle grad steht und könnte randomisieren, nur wenn es im richtigen bereich ist !?!
normalerweise wird wohl minimal rauschen dem signal hinzugefügt um den dither effekt zu erzeugen.
ich hingegen würde gern mehr grit und drift in den karplus strong circuit bringen. und wenn man kontinuierlich auch kleinste mengen rauschen diesem feedbackloop hinzufügt, können sich einige bits ganz schön addieren und hörbar werden. deshalb würde ich gern plain die letzten bits randomisieren anstatt rauschen hinzuzufügen, um für den effekt eine natürliche limitierung zu bekommen
es rauscht x amount im feedback loop. immer. leichtes rauschen belebt den karplus strong circuit extrem und macht die saite viel lebendiger.
die bits floaten ja... je nach kommastelle. dh randomisieren der letzten bits hätte mal 1,25% oder auch mal 2,5% oder auch mal 5% effekt auf das audiosignal, je nachdem wie laut es grad ist.
und ich bin schon gespannt ob dafür eine lösung kommt, aber glaube es nicht.
moment mal, man weiss ja wo die kommastelle grad steht und könnte randomisieren, nur wenn es im richtigen bereich ist !?!
normalerweise wird wohl minimal rauschen dem signal hinzugefügt um den dither effekt zu erzeugen.
ich hingegen würde gern mehr grit und drift in den karplus strong circuit bringen. und wenn man kontinuierlich auch kleinste mengen rauschen diesem feedbackloop hinzufügt, können sich einige bits ganz schön addieren und hörbar werden. deshalb würde ich gern plain die letzten bits randomisieren anstatt rauschen hinzuzufügen, um für den effekt eine natürliche limitierung zu bekommen
es rauscht x amount im feedback loop. immer. leichtes rauschen belebt den karplus strong circuit extrem und macht die saite viel lebendiger.
-
- meister
- Beiträge: 149
- Registriert: 1. Oktober 2015, 14:36
Re: Bit Multiplexing, integer vs float
du bist mein mann!!! zieh herw, zieh!herw hat geschrieben:Jetzt kann ich schon 28 Bit direkt übertragen. Drei schaffe ich auch noch.
und ich denke, wenn ihr es habt, kommt mir auch grad die letzte fehlende idee
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
er die nachricht gelöscht..
NEIIIIIN
zu früh gefreut?
-
- meister
- Beiträge: 149
- Registriert: 1. Oktober 2015, 14:36
Re: Bit Multiplexing, integer vs float
was ist passiert? wurd der teilnehmer wegen unlauterem wettbewerb entfernt?Quietschboy hat geschrieben:
er die nachricht gelöscht..
NEIIIIIN
zu früh gefreut?
- herw
- moderator
- Beiträge: 3123
- Registriert: 13. März 2006, 18:28
- Wohnort: Dortmund
Re: Bit Multiplexing, integer vs float
Nun ich hatte alle 32 Bit benutzt und mir nach der Übertragung als Gleitkommazahl und dem bitweisen Auslesen in der zweiten Corecell plötzlich 28 Bits, die ich an-und ausschalten und auslesen konnte. Leider verhalten sich die Bits 24-31 sehr eigentümlich.Thala hat geschrieben:was ist passiert? wurd der teilnehmer wegen unlauterem wettbewerb entfernt?Quietschboy hat geschrieben:
er die nachricht gelöscht..
NEIIIIIN
zu früh gefreut?
Da war ich an einer Stelle hereingefallen. Also muss man doch wohl die Bits 0-23 und die Bits 24-31 jeweils zu zwei Ganzzahlen zusammenfassen und in einer Nachricht übertragen.
Naja, besser als jedes Biot einzeln.
Wenn nur 24 Bits gebraucht werden, geht es direkt. Das Aussenden und Empfangen ist ziemlich einfach. Falls das genügt, kann ich ein Testenemsble morgen hier hochladen.
Das ist aber auch nur der allererste Einstieg in das multiplexing von Binärnachrichten.
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
Uff, ich dachte auch schon sie hätten dich wegen Fake News direkt eingebuchtet
Ich frag mal das:
Wie willst du zwei Zahlen weiter in eine Nachricht ohne Delay zusammenfassen?
No-Delay ist in diesem Zusammenhang schließlich bindend, ansonsten kannste ja auch jedes andere geclockte Multiplexing verwenden.
Die 24 Bit müssen also reichen. Für den seltenen Anwendungsfall sollte es ja i.d.R. auch absolut ausreichend sein.
Damit kann man also z.B. 24 einzelne 0-1 Werte (On/Off) oder auch z.B. 4x 0-127 (6 bit) übertragen. Oder einmal 0-16777215 (24bit), was nicht ganz so viel Sinn macht.
- Also eher kleine einzelne Wertebereiche sind es, für die sich das Bit-Multiplexing lohnt.
Edit:
Was mir selbst die Tage noch als "seltener Anwendungsfall" kam, ist die manchmal wirklich lästige Tatsache, dass der Standard Primary Bus, ob nun der von Partial Framework oder der Basic [],$ Bus, keine Init Values sofort übertragen kann. Stichwort Order 2!
Mit einem Bit-Multiplexing System wär das kein Problem, das überträgt Initwerte noch sofort während der Initialisierung.
Ich frag mal das:
Wie willst du zwei Zahlen weiter in eine Nachricht ohne Delay zusammenfassen?
No-Delay ist in diesem Zusammenhang schließlich bindend, ansonsten kannste ja auch jedes andere geclockte Multiplexing verwenden.
Die 24 Bit müssen also reichen. Für den seltenen Anwendungsfall sollte es ja i.d.R. auch absolut ausreichend sein.
Damit kann man also z.B. 24 einzelne 0-1 Werte (On/Off) oder auch z.B. 4x 0-127 (6 bit) übertragen. Oder einmal 0-16777215 (24bit), was nicht ganz so viel Sinn macht.
- Also eher kleine einzelne Wertebereiche sind es, für die sich das Bit-Multiplexing lohnt.
Edit:
Was mir selbst die Tage noch als "seltener Anwendungsfall" kam, ist die manchmal wirklich lästige Tatsache, dass der Standard Primary Bus, ob nun der von Partial Framework oder der Basic [],$ Bus, keine Init Values sofort übertragen kann. Stichwort Order 2!
Mit einem Bit-Multiplexing System wär das kein Problem, das überträgt Initwerte noch sofort während der Initialisierung.
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
Weiter im Programm:
5. Das Mischen mehrerer kleiner Integer zu einer großen Integer
Das Bitmultiplexing hat einen Nachteil gegenüber anderen Multiplexverfahren:
Man muss selbst mitdenken und Hand anlegen, denn für jeden Inport muss die Auflösung (Range) in Bits angegeben werden. Zudem muss die maximale Summe aller Inports im Hinterkopf behalten werden (24Bits). Die aktuell reservierte Anzahl an Bits kann aber auch nach Primary ausgegeben werden um dort (auf dem Panel) Alarm zu schlagen, falls die 24 erlaubten Bits überschritten werden.
Hier im Beispiel werden für Port 1 4Bit, Port 2+3 jew. 3Bit reserviert.
Die Inports 4-8 bleiben mit jew. 0Bit unberücksichtigt:
(Das Multiplexer-Macro habe ich momentan in einer verkettbarer Variante mit 8 Inports gestaltet)
Lästigerweise muss man dieselben Werte auch händisch dem Demultiplexer mitteilen: (Den Demuxer habe ich erstmal nur in einer Single-Variante für die vollen 24 möglichen "Kanäle" gebaut) Es müssen also die Zahlen in die Constant Modules eingetippt werden, oder man copy/pastet die Constants komplett von einer Seite zur anderen - inkl. Neuverkabelung versteht sich.
Alternativ könnte man natürlich auch Core Tables verwenden, die sich Schnell kopieren und einbinden lassen, jedoch fallen einem dabei die Werte für jeden Port nicht sofort ins Auge, wenn man ein Muxer Macro öffnet. Man muss zusätzlich noch den Table Editor öffnen. Sind die Bit Ranges der Ports im Muxer und Demuxer aber erstmal korrekt gesetzt, dann kann es auch schon losgehen.
5. Das Mischen mehrerer kleiner Integer zu einer großen Integer
Das Bitmultiplexing hat einen Nachteil gegenüber anderen Multiplexverfahren:
Man muss selbst mitdenken und Hand anlegen, denn für jeden Inport muss die Auflösung (Range) in Bits angegeben werden. Zudem muss die maximale Summe aller Inports im Hinterkopf behalten werden (24Bits). Die aktuell reservierte Anzahl an Bits kann aber auch nach Primary ausgegeben werden um dort (auf dem Panel) Alarm zu schlagen, falls die 24 erlaubten Bits überschritten werden.
Hier im Beispiel werden für Port 1 4Bit, Port 2+3 jew. 3Bit reserviert.
Die Inports 4-8 bleiben mit jew. 0Bit unberücksichtigt:
(Das Multiplexer-Macro habe ich momentan in einer verkettbarer Variante mit 8 Inports gestaltet)
Lästigerweise muss man dieselben Werte auch händisch dem Demultiplexer mitteilen: (Den Demuxer habe ich erstmal nur in einer Single-Variante für die vollen 24 möglichen "Kanäle" gebaut) Es müssen also die Zahlen in die Constant Modules eingetippt werden, oder man copy/pastet die Constants komplett von einer Seite zur anderen - inkl. Neuverkabelung versteht sich.
Alternativ könnte man natürlich auch Core Tables verwenden, die sich Schnell kopieren und einbinden lassen, jedoch fallen einem dabei die Werte für jeden Port nicht sofort ins Auge, wenn man ein Muxer Macro öffnet. Man muss zusätzlich noch den Table Editor öffnen. Sind die Bit Ranges der Ports im Muxer und Demuxer aber erstmal korrekt gesetzt, dann kann es auch schon losgehen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Quietschboy am 24. Februar 2019, 02:37, insgesamt 1-mal geändert.
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
Mit den Bit-Ranges pro Inport haben wir nun auch schon alle Parameter die wir brauchen.
Und wie die mitlesende Gemeinschaft bestimmt auch schon festgestellt hat, werden Bits von rechts nach links geschrieben/gelesen.
Das ist wichtig um die Funktion des BIT SHIFT zu verstehen.
Die erste Integer, also die Zahl vom ersten Inport, die in die auszugebende Integer integriert werden soll, wird also an die rechteste Stelle der gemultiplexten Integer gesetzt.
Die Stelle, oder das Startbit, ist Bit 0. Man fängt bei Null an zu zählen.
Die Bit-Nummerierung entspricht übrigens auch dem binären Exponent:
Bit 0 ist 2 hoch 0 = 1,
Bit 1 ist 2 hoch 1 = 2,
Bit 2 ist 2 hoch 2 = 4,
Bit 3 ist 2 hoch 3 = 8, usw.
Da im Beispiel für die erste Integer die Range =4bit festgelegt wird, muss die zweite Integer (Inport 2) bei Bit 4 anfangen. Das heißt für sie: das Startbit ist Bit 4. Für die dritte Integer vom dritten Inport ist das Startbit 7 (4bit + 3 bit).
Das heisst also, jede Integer der Inports muss per BIT SHIFT LEFT (SHIFT<<) an die richtige Position der auszugebenden Integer gerückt werden.
In Reaktor Core umgesetzt sieht das also so aus: Die Eingangsinteger $ wird um ihr individuelles Offset (Startbit) nach links verschoben und zur Multiplexinteger hinzugemischt. Das hinzumischen geschieht mittels des nachfolgenden BIT OR (|). Das Ergebnis wird an den nächsten Inport-Muxer weitergegeben.
Das Startbit wird in diesem Macro um die definierte Range der Integer erweitert und auch der nächsten Instanz weitergegeben.
Und wie die mitlesende Gemeinschaft bestimmt auch schon festgestellt hat, werden Bits von rechts nach links geschrieben/gelesen.
Das ist wichtig um die Funktion des BIT SHIFT zu verstehen.
Die erste Integer, also die Zahl vom ersten Inport, die in die auszugebende Integer integriert werden soll, wird also an die rechteste Stelle der gemultiplexten Integer gesetzt.
Die Stelle, oder das Startbit, ist Bit 0. Man fängt bei Null an zu zählen.
Die Bit-Nummerierung entspricht übrigens auch dem binären Exponent:
Bit 0 ist 2 hoch 0 = 1,
Bit 1 ist 2 hoch 1 = 2,
Bit 2 ist 2 hoch 2 = 4,
Bit 3 ist 2 hoch 3 = 8, usw.
Da im Beispiel für die erste Integer die Range =4bit festgelegt wird, muss die zweite Integer (Inport 2) bei Bit 4 anfangen. Das heißt für sie: das Startbit ist Bit 4. Für die dritte Integer vom dritten Inport ist das Startbit 7 (4bit + 3 bit).
Das heisst also, jede Integer der Inports muss per BIT SHIFT LEFT (SHIFT<<) an die richtige Position der auszugebenden Integer gerückt werden.
In Reaktor Core umgesetzt sieht das also so aus: Die Eingangsinteger $ wird um ihr individuelles Offset (Startbit) nach links verschoben und zur Multiplexinteger hinzugemischt. Das hinzumischen geschieht mittels des nachfolgenden BIT OR (|). Das Ergebnis wird an den nächsten Inport-Muxer weitergegeben.
Das Startbit wird in diesem Macro um die definierte Range der Integer erweitert und auch der nächsten Instanz weitergegeben.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
-
- meister
- Beiträge: 149
- Registriert: 1. Oktober 2015, 14:36
Re: Bit Multiplexing, integer vs float
müssen es konstanten innerhalb des cores sein (zum setzen der ranges), oder würde auch eine GUI funktionieren (knöppgens oder multidisplay/mousearea). die gui elemente könnte man nach erledigter eingabe per macro visibility schnell ausschalten.
so wirklich viele unterschiedliche und sinnvolle möglichkeiten der bitverteilung gibts ja eh nicht. weshalb so eine tablevariante mit "presets", schnell umschaltbar...
und mit einer gui könnte man mux und demux in einem rutsch editieren?
so wirklich viele unterschiedliche und sinnvolle möglichkeiten der bitverteilung gibts ja eh nicht. weshalb so eine tablevariante mit "presets", schnell umschaltbar...
und mit einer gui könnte man mux und demux in einem rutsch editieren?
Zuletzt geändert von Thala am 24. Februar 2019, 02:38, insgesamt 1-mal geändert.
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
Und damit´s nicht langweilig wird, hier mein komplettes Test-Ens. (Musste nur zwei ACEWs löschen, wegen Dateigrößeneinschränkung hier im Forum)
Auf die Flags und den Demultiplexer gehe ich dann die Tage noch ein.
Auf die Flags und den Demultiplexer gehe ich dann die Tage noch ein.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
-
- synth doctor
- Beiträge: 218
- Registriert: 6. April 2011, 20:31
- Wohnort: Wiesbaden
Re: Bit Multiplexing, integer vs float
Ich sach mal so:Thala hat geschrieben:müssen es konstanten innerhalb des cores sein (zum setzen der ranges), oder würde auch eine GUI funktionieren (knöppgens oder multidisplay/mousearea). die gui elemente könnte man nach erledigter eingabe per macro visibility schnell ausschalten.
so wirklich viele unterschiedliche und sinnvolle möglichkeiten der bitverteilung gibts ja eh nicht. weshalb so eine tablevariante mit "presets", schnell umschaltbar...
und mit einer gui könnte man mux und demux in einem rutsch editieren?
Dem persönlichen Geschmack sind ja keine Grenzen gesetzt. Es gibt außerdem noch mindestens ein oder zwei andere Punkte in dem Plex-System, wo der eigene Geschmack auch eine eigene Umsetzung erfordert. Ich würde mich eher schwer tun hier ein "That´s it" Framework rauszuhauen.
Ich mache den Erklärbär hier ja auch für die nachfolgenden Neulinge, so dass das Prinzip hoffentlich nachvollzogen und eben die individuelle Umsetzung machbar ist.
Ich bin mir selbst ja auch noch nicht ganz sicher, wie ich es haben möchte, bzw. unglücklich über das ein oder andere Detail. Insofern bin ich über kreativen Input auch happy.
Die optionale GUI Editierung der Ranges finde ich persönlich eigentlich gar nicht so schlecht. Wichtig wäre mir hauptsächlich, dass die Ranges nur einmal editiert werden müssen. Das dürften zur Not auch Primary Constants sein. Hauptsache sie sind zu Init an Ort und Stelle (in den Mux-Macros)!