How I got my Casio VL-1?
At the end of year 2017 I went to a flea marked in Poznan where I live (or rather Flohmarkt, 90% of stuff there comes from Germany anyway). On one of stands I noticed a Casio VL-1 in good condition, working and with battery cover (but without protective sleeve). I asked: “How much?” The guy said: “40 zloty *, Casio calculators have always been expensive”. Thats how I owned this wonderful device, and I still got some money for one hot beer** and 0,5 kg of sauerkraut to celebrate the buy.
*around 10 euro
**seller was using a sausage container with hot water to warm up beers, very exotic scene
Lets record some stuff!
I played “Da-da-da” and “Star Wars Imperial March”, then decided to look at the ADSR feature. Casio says, 80 millions sound combinations are possible! In fact, you don’t have a big impact on sounds timbre. It reminds me popular Famicon game system clones with 4000 games, where 1000 of them are variations of Mario Bros.
To write this article I recorded more then 100 samples and entered over 200 ADSR mode codes. A lot of work, and I really want to think someone will find it helpful. I’ve covered few topics I found interesting:
- envelope type (linear vs expotential),
- decaying Sustain and surprises connected with it,
- Sustain Level impact on Release stage length,
- how vibrato works,
- ADSR sound waves with digital (unfilitered) prototypes,
- notes on “calculator-style” programming.
There are some articles and Youtube videos about VL-1 programming, so I would like not to cover basic “how-to” topic. There are way more interesting things to show then order of button pushing 🙂
ADSR mode envelope type
You may presume, as ADSR mode will use a familiar from analog synths ADSR type of envelope. In most synthesizers you can define 4 parameters: Attack time, Decay time, Sustain Level and Release time. In fact, in Casio VL-1 you can set one more – Sustain Time. So there are 5 parameters in total:
- Attack time – in official manual marked as A:
- Decay time – D,
- Sustain Time – ST,
- Sustain Level- SL,
- Release time – R.
Looks like in ADSR mode Casio uses an envelope type sometimes called ADSSR.
You have also propably look at the original ADSR programming manual. One can notice one strange thing in envelope drawing – Release Time (f) is counted into Sustain Time (e). This should mean, that Sustain Time equal to zero implies no Release stage, which is false. The envelope figure occurs twice in manual, so there must be some thought behind this (or double error). I think Casio developers just wanted to mark that decaying Sustain envelope stage can reach 0 level, as same as Release stage.
It is also funny somehow , Casio can’t decide what the envelope shape is – on one figure the Decay and Sustain are expotential, later linear (?) (or they just maybe didn’t care, it is just a calculator with keyboard). Definitely a thing I must investigate.
Envelope – linear or expotential?
In some sources you can read, that Casio VL-1 envelope is linear. This in not exactly true statement. There is limited number of amplitude steps (11 exactly) and they increase in fixed time steps, but not all amplitude steps have the same value! Thats why by definition all envelope components will not be linear (even the Sustain, for ST<9). I took some measurements of sample values in certain points of waveforms with clearly visible steps (with linear amplitude scale). I investigated 4 waveforms and the results were very similar to those presented below.
Figure above shows the example measurements for the waveform presented below. I took a maximum sample value for each step (Measurements/sample val. [-], black), then recalculated to get normalized values (Measurements/sample val. [%], red). Maximum value is equal to 100%, minimum (silence) to 0%. The linear reference is marked in blue (Reference/sample val. [%]). Difference between perfect steps amplitude should be ~9,1% (100% divided per 11 steps), Casio is far away from it.
For other investigated waveforms, slight deviations (+/- 0,4%) occured at relative amplitude below 50 %, but it doesn’t change the fact, the envelope is not linear (in fact you can state it just by looking at waveform with properly matched time scale).
As you have noticed, the envelope behaviour is not described very well in Casio user manual. In general, as you push a note button, loudness increases in time defined by Attack time value up to maximum level, then dicreases down to Sustain Level in Decay time. Unusual thing is that (for ST≠9) Sustain stage contour is also decaying! If you release the note button, before the Sustain stage reaches zero, the Decay part of envelope will be triggered. But if you hold the note button long enough, the sound countour reaches zero and the Decay stage will never be reached. Never!
The figure below shows how the played waveform contour looks depending on for how long you have pressed the note button (“note on” – button pushed, “note off” – button released). The waveform code is 09096500 (piano sound wave, maximum Attack, no Decay, maximum Sustain Level and medium Sustain Time, medium Release time, no vibrato, no tremolo). Notice, how Sustain part of envelope decays over time – the longer the Sustain, the shorter the Release (even if in theory Release time should be constant).
Sustain Time equal to 9 (f.e. 01989200) means the Sustain part of the envelope will be played as long as you hold the note button, without decaying. In this case the Release will always be triggered if set it to any value above zero. In other words: any ST number below 9 will cause the total ADSR envelope time will be finite and dependant on note button hold duration as shown before. If my explanation wasn’t clear, take a peek at the example below.
For 09949900 code, ST is set to 9, so Attack, Decay and Release stage duration times stay the same. Only Sustain time varies, like in conventional (4 parameter) ADSR envelope and depends on for how long you hold the note button. Casio missed to point this out in manual.
Sustain Level affects maximum Sustain and Decay time
Now, this is strange and makes ADSR programming really unpredictible. As I noticed before, the Casio VL-1 envelope has a vertical (amplitude) resolution of 11 steps – which means, there are 11 steps in Attack phase when the envelope reaches its maximum amplitude (I’ve counted only steps above 0 level). These steps are later distributed between Decay, decaying Sustain and Release. This simple limitation has some serious consequences, because Sustain Level value affects the Sustain stage maximum lenght, and thus the whole waveform length! In result, 00978900 code will produce a sound almost twice as long as 00948900 – and only a Sustain Level was changed (in theory it shouldn’t impact total envelope time)!
Let’s look at the figure above – the programmed envelope has decaying Sustain (ST=8) and the note button was hold till the sound silenced. If you count how many decaying steps each of these envelope has the result will always be 11. A step can be “consumed” to create Decay or Sustain stage (but the sum of steps used in D and S must be 11). For example, if you type 00978900 code, 2 steps will be consumed for Decay and 9 for decaying Sustain (waveform (a) on the figure above). As you lower the Sustain Level, more steps are getting assigned to Decay phase, and less remains for Sustain phase. Because the step length is fixed (in this case 0,08 second for Decay 0,55 second for Sustain ), the more steps the Decay uses, the shorter possible Sustain time.
Look at the 00968900 (b) and 00958900 (c) waveform code comparison (only SL was changed, 6 -> 5). First used 3 steps for D and 8 for S, which gives us D duration time of ~0,24 s (3×0,8 s) and S about ~4,4 s (8×0,55 s). In second case 5 steps for D and 6 for S, resulting ~0,4 s for Decay and ~3,3 s for Release. By changing a Sustain Level in programming code by only one (6 -> 5), you have shortened a whole note playback time by almost 1 second (from 4,64 s to 3,7 s)! Very strange indeed, but this is how it works*.
Moreover, if SL is set to zero, ST value have no impact on note length. This means, that f.e. 00909900 … 00908900 … 00904900 … 00900900 would have the same length of ~0,92 second.
*in fact, the ADSR behavior can possibly be more complex – this is only what I have noticed
Exactly the same thing happens to Release time if the Sustain Level decreases. Decay “eats” Release! At sample waveforms presented below the Sustain part is very short to show the interaction between Sustain Level and Decay time parameters.
The Sustain Level value was changed from 7 (a) to 3 (c), affecting the total sound length – the playback time was shortened from t=2,2 s to t=1,3 s (by ~0,9 s). Looks like Sustain Level parameter can mess a lot in your sound envelope, more then you can imagine. I think, to some level it would be possible to compensate this behavour by extending Release time if Sustain Level was lowered (assuming that Release time was not set to maximum at the first place). Of course you will lose some amplitude resolution in the Release stage.
There are no surprises in Release alone, but I recorded it anyway so… As you probably suspect, the longest Release time is avaliable with Sustain Level set to 9. Every step in programming code changes the Release time by ~0,25 s (it is not exactly true, as for 8 and 9 step seems to be slightly shorter). But for simplification you can assume, that Release time increses linearly with code incrementation.
Figure shows only part of Sustain stage and whole Release. The Sustain was set to “button dependant” with maximum level. The waveforms were synchronized by “note off” event.
Constatant slope vibrato & glitches
In some internet sources you can read, vibrato parameter controls only modulation speed, and not depth. It is not true – in fact vibrato controls depth, which at almost constant modulation slope* gives also frequency change. In context of digital vibrato generation it has more sense and is simpler to achieve. The deeper the vibrato goes, the more time it needs to come back to “normal” state. Check teh figure below. I used a code with maximum Sustain Level to get the clear vibrato view.
*vibrato slope is not perfectly linear, because of expotentially changing step values
If you take into account the “step consuming” idea I introduced earlier, it should be obvious something strange will happen with vibrato for lower Sustain Time settings and high vibrato settings. Look closely on the figure below: the first code (a), 10099009 represents the maximum Decay Level and maximum vibrato depth. As the Decay Level value gets lower (b), the modulation depth doesn’t change and finally reaches 0 level, then (because it can’t get any lower) stays there for a longer time (c). But it is not as bad and can always be used in creative way, like faking arrpegios or step sequencer behaviour.
You may also notice one thing – glitches! Tons of them! If Casio has to generate a fast amplitide transition, often some errors occure. I’ve marked some of them in red circles above. Similar glitches can be observed for fast attack stage.
Lets look at the basic stuff – a ADSR waveforms (or as Casio calls it – sound waves). At first I recorded them from VL-1 line output, then decided to make some measurements at digital stage output and after a filtering stage. I was curious how the digital waveforms look like before analog processing. An analog stage schematic from Clemens Valens was very helpful. I have disassembled my unit and acquired digital signal on LA6355 opamp input (pin 3) and analog filtered on 47n capacitor near BALANCE potentiometer, then used trusted Rigol oscilloscope to get the visualization.
For recording I’ve used X0099000 ADSR code, where X – sound wave number. Every waveform presented below was recorded on lowest octave setting and lowest C note. Blue is a direct digital stage output, yellow – filtered output of analog part of circuit. All of them are delievered from primitive 1-bit waveforms. Notice, not only waveform shape changes, but also frequency of the generated signal.
Lets get into details. In ADSR mode we have 10 sound waves to choose from. Some of them are very simple, just rectangular wave with fixed pulse width, some way more complex.
- Piano (0) is using ~70% pulse width rectangular wave (I will use its frequency as reference and call it f)
- Fantasy (1) – 50% rectangular wave (squarewave), very smooth and bright sounding; my personal favourite , twice base frequency – or in other words, a octave higher by default then Piano (2⋅f),
- Violin (2) – a complex shape with 5 pulses and base f frequency, the most advanced wave avaliable in VL-1,
- Flute (3) – reused squarewave, with frequency f; it is exactly the same base waveform as for Fantasy setting; in fact, you can check it for your own – Fantasy stock instrument on low OCTAVE setting will sound almost the same as Flute on middle setting,
- Guitar 1 (4) – a 2-pulse waveform (with pulses placed unequally), along with other guitar and English hornis the lowest base frequency waveform (f/2),
- Guitar 2 (5) – a 3-pulse waveform (f/2)
- English horn (6) – around 12% pulse width rectangular wave, with “nasal” character (f/2)
All “electro-sounds” are based on similar idea (reuse of already defined waveforms with squarewave pitch modulation):
- Electro-sound 1 (7) – Piano waveform (0) with pitch modulation,
- Electro-sound 2 (8) – Fantasy waveform (1) with pitch modulation,
- Electro-sound 3 (9) – Violin waveform (0) with pitch modulation.
You can control the frequency of this modulation via TEMPO UP/DOWN buttons, affecting unfortunately also rhythm speed. This let you make a nice trick: you can match vibrato/tremolo parameters with modulation speed to get more complex modulations! For example code 70099077 and tempo set to 1 (doesn’t match perfectly, but you will get what I was thinking about).
It’s a pity Casio didn’t implement PWM (even most simple, f.e. by fast and “steppy”changing between waveforms with different PW). Also basic noise generator made with LFSR (Linear Feedback Shift Register) would also be very useful, f.e. for special effects an lo-fi drums.
“Calculator style” programming
One thing was very handy while rewriting ADSR codes. You can program Casio VL-1 in a way you normally use MR, MC, M+, M- on calculator – you don’t have to type the whole code to get new sound.
If you for example want to add a tiny vibrato to your patch, just set voice to ADSR and function to CAL, then push MR (Memory Recall), the currently stored patch will be recalled (f.e. 23989200). To add vibrato, just push MC (Memory Clear), then add 30 for light vibrato (+, 3, 0 buttons) and finally press M+. You will have your old patch with vibrato added (23989230). In the same way you can change any other parameter. It gets less handy if you want to change Sound Wave type only – to change from Guitar 1 (f.e. 43989220) to Violin (23989220)) you have to substract 20000000 :/
And thats all for today! I hope you had at least as much fun as I had investigating ADSR mode secrets!