Ornament-8. Analog Functional Behavior Generator
In 2019, I embarked on the path of developing electronics. My first device is Ornament-8. Don't judge me too harshly.
– Ornament-8 is a device capable of implementing complex finite state machines.
– The transition of a finite state machine from one state to another is determined by a patch, a connection of the inputs and outputs of the Ornament cells.
– Each of the 8 cells of the Ornament is a monovibrator.
– If the monostable multivibrator is started, it will hold the high state for the period of time set by the TIME potentiometer.
– At the moment of transition of the monovibrator (hereinafter referred to as the cell) from a high state to a low state, a trigger is generated.
– This trigger can launch any other Ornament cell except itself. To do this, you need to connect the trigger output to the trigger input.
– If the trigger comes to the input of an already active cell, it is not absorbed, but goes to the trigger output PASS>. This output implements the logic: if the cell is active -> let the trigger activate other cells.
– In addition to the trigger inputs and outputs, each cell has an analog output, the signal on which is proportional to the cell activation time from 0 to 1 depending on the TIME parameter. If the monovibrator is compared to a filling vessel, the analog output (CV>) shows the liquid level in this vessel.
– Each cell has an input for a control voltage (>CV). The voltage applied to this input controls the coefficient that increases the value of the TIME parameter set by the potentiometer. Applying the control voltage to >CV can be thought of as time dilation in the cell's coordinate system.
![Ornament-8 Ornament-8](https://habrastorage.org/getpro/habr/upload_files/5a8/9c0/cbc/5a89c0cbc63f4bdc7338d19de930184a.png)
It seems that Ornament-8 is some strange artifact that fell from space. What is it for? What to do with it? Who and why came up with such a strange system of rules?
In this article I want to show how a chain of small and justified design decisions can lead to the creation of a device that opened up a completely new paradigm for creating sequences.
Background
At the beginning of 2019, I got acquainted with the domestic analog synthesizer Lyra-8. Lyra is a synthesizer with a very wide palette of sounds. It can sound gentle and soft, or it can produce noises, screams and sounds of the post-apocalypse. The synthesizer is quite slow, meditative, it is often used in noise, ambient and drone music.
![Lyra-8 Lyra-8](https://habrastorage.org/getpro/habr/upload_files/86b/411/644/86b4116449d7f439f76f2741c85a2de0.png)
In the first approximation, the Lyre has 8 strings (or voices). You control the frequency of the voice by rotating the potentiometer. The volume envelope is triggered by closing the upper and lower metal contacts (or sensors). Moreover, the parameters of the envelope depend macroscopically on the conductivity of the closing object.
What makes the Lyra special is its organismic philosophy. The complexity of the sound is born from the interaction of a small number of modules, which are entangled in complex feedback. I have already written a text about feedback, but in the Lyra this concept is taken to a completely different level. Feedback can be so complex and confusing that it is almost impossible for the performer to accurately predict the behavior, one can only intuitively try to control it.
The interaction of voices is realized with the help of frequency modulation (Frequency Modulation = FM). 8 independent voices of the Lyre can modulate each other's frequencies. Roughly speaking, when you pluck one string on the guitar, you hear sound1 (some spectrum evolving in time). When you pluck another string on the guitar, you hear sound2 (let's agree that the strings are tuned to different frequencies). If you pluck both strings at the same time, you hear the sum of sound1 and sound2. You hear all the same evolutions, but simultaneously. Sounds can influence each other, but not as significantly as what happens in FM synthesis.
If sound1 modulates the frequency of sound2, then activating only sound1 will produce sound2, activating sound2 will produce only sound2, but simultaneously activating both sounds will produce sound3. This sound3 (its harmonic composition will not be equal to the sum of the harmonics of the original sounds) will depend on the modulation scheme and will have a completely different evolution of the spectrum, as well as harmonic composition. If there are only 2 sound sources, then 3 modulation schemes are possible:
In all three schemes the sound (spectrum evolving in time) will be different. Moreover, it will also change with the change in the modulator frequency.
If there are more sound sources, then there will also be more modulation schemes (combinatorial theory to the rescue).
This article is not about sound synthesis, so I don't want to delve into the subtleties of the differences between sound, timbre, and note. I also don't want to delve into comparing the Lyra-8 with classic FM synthesizers. And this is definitely not the place to explain FM synthesis for generating complex spectra. For all this, I plan to write good, focused articles.
At this stage it is enough to understand that 8 voices of Lyra allow to synthesize more than 8 different sounds with the same settings. The scheme of FM synthesis and the sequence of voice activation determine the evolution of the final timbre in time.
The sound of the Lyra is like a tangled labyrinth in which you act intuitively and carefully. You either twist the sound by holding several sensors, or you play a certain pattern on the sensors. Doing both at the same time is almost impossible.
I wanted to launch the lyre's voices using some kind of machine. While the machine was sorting through the lyre's voices, the musician could change the instrument's parameters to transform the sound and explore soundscapes.
Ornament-8 was created precisely for this purpose.
Step 0
When I first met Lyra, I was amazed by the possibilities that were still hidden in this synthesizer. I really wanted to discover them.
I had no experience in electronics development or software programming. Of course, I knew that there was such a thing as a computer and that you could write programs on it. But I had no serious projects under my belt.
It's funny, but at that moment I thought that making an analog device would be easier than learning to program some Arduino. If I hadn't taken the difficult path then, some completely obvious, simple and utilitarian user action memorizer would have been born on Arduino. This is neither good nor bad, it's a different reality.
Step 1
I started studying Platt's book “Electronics for Beginners”. There he shows how to assemble a shift register on 555 timers, along which a light will run.
I thought: “That's it! Instead of turning on a light bulb, you can close the contacts of the Lyra. The plan is simple, and therefore beautiful – that's what I understood at the Phystech.”
Each bit of this shift register was implemented on a monostable multivibrator, made on a 555 timer. Time can be controlled while the monostable multivibrator is in a high state via the resistance in the capacitor charging circuit.
This “shift register” is the basis of almost all classic sequencers. There is a shift register with steps where
. But a classic sequencer usually controls only one sound source (monophonic mode), and each step is responsible for controlling a note (the main frequency of the oscillator) or other parameters (for example, volume or the degree of opening/closing of the filter). In fact, the step number is a discrete time that determines the value of some parameter at a given moment in time.
An example of a classic sequencer on video. In addition to changing the frequency of the sound, the volume envelope is also launched and other parameters are changed.
This implementation is not suitable for my case. We can only launch the voices of Lyra, but we have no way to control the frequencies of the voices from the outside (only with the TUNE potentiometer). Lyra has 8 independent voices, and “running” through them with a cyclic shift register means reducing the polyphony of the synthesizer from eight to one. And in general, the final goal is not to run and launch them in turn, but to launch several voices simultaneously in some interesting way.
Already at this step it was intuitively clear to me that only a sequencer capable of creating complex behavior can give an interesting musical result. And behavior is always a finite state machine. Let's see how I tried to achieve this.
Step 2
We needed to come up with a way to run multiple voices at once. Alternatively, we could simply create multiple loops of different lengths. The “lights” would run at different speeds along these loops and create interesting interactions between Lyra's voices. But what length loops?
A loop of length 1 makes no sense, as it means the voice will sound infinitely. Instead, I added a toggle switch that inverts the state of the output. When the cell is active, the output does not close, but on the contrary opens the contacts of the Lyra, and at other times keeps them closed.
Loops of length 2, 3, 4, 5, 6, 7 and 8 make sense. I thought that it was necessary to implement a system of switches on the sequencer panel that would close some particularly successful configurations. For example, loops (2, 3, 3), (4, 4), (2,2,3), and others. There are many options, it was necessary to find the best ones from a musical point of view.
The surest way to find the best options from the many is to simply play with the system. So I built the first prototype on a breadboard.
The prototype consisted of several cells that had a trigger input, a trigger output, and an output for closing the Lyra contacts. Initially, the cells were not connected to each other, since my goal was to find the most successful connections.
After about 15 minutes of playing with the prototype, I realized that the “few interesting loops” concept was breaking down.
Why does a monostable have to fire only one cell? The answer is obvious. The cognitive distortion “functional fixedness” is to blame – objects can only work in a certain, permitted way. This is such a fundamental thing in the world of development that it deserves a separate article.
In my case, on the contrary, I wanted to learn how to generate many events that would interact in interesting ways. Therefore, connecting one cell to several (which also have different TIME parameters) turned out to be a useful method for filling the system with triggers.
The number of interesting connections grew factorially, no switches could cope with it. I realized almost immediately that in this sequencer I would have to patch the cells manually.
And in general, it is much more interesting not to choose one of several topologies provided by the developers, but to create your own. Each sequencer topology is like a separate journey. This should have become the essence of the creative process of this device.
I also tried to launch several triggers into one loop at once. For example, in a loop of length 4, launch 2 triggers through 1. But then I immediately discovered a mechanism for absorbing these triggers, which I could not predict without a prototype.
If the cell durations are almost the same, then there can be several active cells in the loop at once. But if you increase the TIME of one of the cells, it will immediately start absorbing triggers from faster cells. They will simply crash into it. An explanatory video is needed here.
If a cell is already active, then attempting to reactivate it will do nothing. The incoming trigger will simply be absorbed, and only one outgoing trigger will be generated when the cell is deactivated. This is a significant limitation that needed to be addressed.
This is how the PASS> output appeared. It allowed to forward an incoming trigger in case the cell was already active to some other cell. This added the ability to create logical constructions. And also not to waste triggers in vain.
Ornament-8 (the name I gave the sequencer) allowed me to generate soft, floating rhythms that suited the character of the Lyra well. This is roughly what my experiments looked like at this stage of the design:
Step 3
Then I showed the prototype to Vlad Kreymer (the creator of SOMA, who is the author of Lyra). He liked the concept. Like in Lyra, Ornament has several identical modules, and complex behavior is born through their interaction. There are few modules, but many options for their interaction, hence the complexity.
Together we have already added the ability to modulate the duration of the TIME parameter of the cell with a control signal. It turns out to be something like frequency modulation, but for the cell period.
We also added the ability for the cell itself to generate control voltage via the filling level of the timer capacitor.
What is the purpose of squeezing and stretching the TIME parameter of a cell on the fly? Actually, we added this function to see what would happen. We liked what we saw, so we left this function. It's a kind of daring way to loosen up an already not very smooth rhythm to a state of chaos (not to be confused with randomness).
But it is precisely this possibility that will play a key role in generating smooth, but human-like rhythmic patterns. This will be written about in detail in the second part of the article, describing Ornament as a functional general-purpose sequencer. But we did not know this yet.
We added trigger converters to the device, which generated a short trigger based on the growing activation boundary of the cell output. This allowed us to play not only on the Lira-8, but also to launch envelopes of any other devices that are sensitive to such signals. For example, the Pulsar-23 drum machine from SOMA, which was released at that time, as well as Eurorack modules.
Step 4
Since I had minimal experience in electronics, Vlad helped me develop the final product based on SOMA Lab and launch it into production. I started creating a manual and shooting a demo video for the release.
During the filming, I learned to play this instrument. And at the same time, I rethought the usual ideas about the role of a musician and his musical instrument.
We are used to the idea that playing an instrument is about timbre and timing. From the point of view of computer science, a musician generates a stream of sounds, events in silence, where each has
beginning in time
end in time (can be infinite if you really want it to be)
spectrum evolving in time. Moreover, the musician is able to control this evolution. A simple example is the bright or dull sound of a guitar string. A complex example is an electronic synthesizer, which is essentially a functional generator. Based on a vector of parameters, it synthesizes a signal of a complex shape.
Ornament, if you look at it this way, is also an instrument that synthesizes not sound, but a flow of events that can launch sounds. The musician must also be able to operate Ornament in order to manipulate the properties of this flow.
The concept of a functional rhythm generator was just beginning to take shape in my mind. It fully matured later. This will be the second part of the article about Ornament.
I suggest clicking on a demo video with examples of compositions created using Oranment. I programmed all visualizations on processing.
Step 5
After the device came out, I continued to play and experiment with it. I wanted to learn how to synthesize not only smooth patterns for the Lyra, but also find ways to generate rhythms.
The main problem was that the activation time of each cell depended on the potentiometer. Setting two potentiometers to the same duration was possible only by ear through fine tuning. In practice, this was very tedious.
But one day, an important observation occurred. I tried to activate the cell that triggers the snare drum at regular intervals from the external circuit. I discovered an interesting pattern. If I increase the activation time of the snare drum cell to a time greater than the period with which the loop activates it, then the cell will only fire every other time. This observation changed everything! I discovered frequency division.
The culprit is functional fixation – the main enemy of good design, which I talked about in the part about shift-register. I was focused on making loops on the Ornament. But to generate smooth rhythms, I had to act completely differently.
In the next part, I will tell you about this method in detail. But for now, watch the example of creating an absolutely even (quantized) rhythm on Ornament.
Thank you for your attention! I wish you good luck in your research.