<- User manual
Demo circuits

With the source comes an example circuit. You can load it by pressing D0 while holding down I0. In this section, I will describe that circuit page by page.

note: There are a few ad hoc connections, meaning instances with inputs on some page and the output on another page. Obviously, using too many of those leads to virtual cable spaghetti, so I try to make them as explicit as possible. Also, the current version of the circuit editor cannot display the inputs of an instance when they are on another page, which unfortunately prevents the possibility of "full analysis" of the circuit by the user.

Page 1 contains the output multiplexer (top-right), a mixer (bottom-right) and my three bytebeat outputs (bottom-left).

The mixer (bottom-right block) consists of three vertical "channels": channel 1 for bytebeat or audio input (column P), channel 2 for the synth (column Q) and the master track (column R). The outputs of the two channels (P5/Q5) are added together to the master input (R8). The outputs of each of channel 2 and the master track (row 5) is the product of the corresponding input (row 8) with a variable volume value (row 7) controlled by two user controls (H1 and I1, row 6). Thus, the volume of the synth and the master volume are controlled by user control #3 (O0:P0) and #4 (Q0:R0). These values are zero at first, so press those controls to hear something.

Page 2 is my synthesizer. On the top-left corner, I have my two UI inputs which are mirrored and merged into a single UI signal at K3. That UI signal is sent to the two synth (bottom-right), and also to the top-right block where it is split back into the left and right visual feedbacks.

The audio output of the two synths is mixed to P1 and this is sent to the input of channel 2 on my mixer (Q8 on page 1). The UI outputs (Q2 and R2) are sent to the same coordinates on page 1.

The bottom-left block is the tuning control. On K8 and M8, you have the two remaining user control inputs (F1 and G1). These control two variables directly above (K7/M7). Then the right one is squared (with a multiplication with itself) to L7 to make it "flatter" around zero, and then negated (component C4) to L6. Finally, K7 and L7 are added to Q7 and K7 and L6 are added to R7. Thus, the two synth tuning input (Q7 and R7) have values:

Q7 = K7 + M7^2
R7 = K7 - M7^2
This allows to control the pitch of both synth with user control #1 (K0:L0) and the detune value with control #2 (M0:N0).

Page 3, 4 and 5 are three bytebeat pieces: Lost in Space by xpansive, and Xmontdaa and Joefiqrz by myself.

The left block on each of these pages is a series of 15 right bit-shift starting from the top left corner. By sending the "t" parameter to that corner, we get the sixteen signals "t", "t>>1" ... up to "t>>15".

On page 3 (Lost in Space), the middle block is the signal expression (from bottom to top):

(t>>9|t>>8)*t&46&t>>8
and the right block is:
(t&t>>13|t>>6)&255
The constants "46" and "255" come from the binary editor (page 6) through the two relays at the top. Finally, the output of the two blocks is combined with a XOR (R3) and sent to the top right corner which is then sent, through a "bytebeat renderer" (I8), to K8 on page 1.

On page 4 is Xmontdaa. The middle two blocks are

(t>>9|t>>6)*t
and
t>>9|t>>7
These are combined with a logic AND to P8 and this is then combined through a logic OR with "t>>4" (bottom-right block). This last parameter can be varied dynamically from "t>>7" to "t" to play the last part of the piece. Again, the output is sent to the top-right corner, which is in turn sent to K7 on the first page.

On page 5 is the last bytebeat piece, Joefiqrz. The middle block (the lead) is

~(t>>9)&t>>13*t&(N1)
and the right block (the bass) is
t&t>>7|t>>5&(O1)

Then those two signals are combined with a logic OR to R3, sent to the top right corner and then to K6 on the first page.

As with Lost in Space, the top block (N1:O1) relays two constants from the binary editor. The bass line sequence can be played by alternating Q6 dynamically between t>>5, t>>4 and t>>3.

On page 6 is the binary editor. The three rows with yellow outline represent three bytes which can be edited bit by bit. The initial values are 46, 255 and 0. It is constructed from a single constant (128) placed at K8 and from which the complete bottom row is built with right bit-shifts. Thus, the bottom row contains the constants 128, 64, 32, 16, 8, 4, 2 and 1. One then connects each bit with a wire to the corresponding bit in one of the three constants directly above. The top part of the circuit is, for each constant, a tree of logic ORs which produce the three final outputs in the top right corner. From there, they are relayed to the "blocks of constants" (N1:O1) of page 3 and page 5.

One last note about the bytebeat circuits: in order for time to be synchronized on the three circuits, there is a single time source (K1 on page 1) that is sent to all circuits (K1 on page 3, 4 and 5). That cell is also special in that it is where the "binary timeline" display comes from. So in order to play some bytebeat, instantiate the time there and connect the bytebeat output you want to the input of channel 1:

(B8) -> K1
(B2) K8 -> P8

Finally, page 7 is an illustration of some algebraic property on signals. It is an audio circuit with input at K1 and output at R1. That circuit starts by applying an echo to the signal (bottom block), then an "anti-echo" is applied (middle block), which reverses the effect of the echo. The output of that composition is then substracted to the original signal (top block) and then output to the top right corner.

Seemingly, the output of that circuit is always zero. Furthermore, this is still true when the order of composition is reversed (anti-echo then echo). These facts are represented in the two equations:

forall x. antiecho(echo(x))-x = 0
forall x. echo(antiecho(x))-x = 0
In other words, the "anti-echo" and "echo" circuits are inverses of each other.
© 2000-2014 Mikael Bouillot (last updated 2014-05-08)