Magazine Archive

Home -> Magazines -> Issues -> Articles in this issue -> View

Technically Speaking

Article from Making Music, September 1987

In agonies of self recrimination, self doubt and self.. er.. well never mind. After a quick moan, Andy Honeybone presses on with part two of his DX21 Voice chart generator.

Suffer. That's what I do, suffer for my art.

Firstly, a perfectly normal jargon ridden sentence of mine ended up in the J Arthur column and then the wonderous DX21 voice chart which I submitted was veritably shredded so that no reader would know that it was a spectacular randomly-generated hollow log sound. Add to that grief my own upset at discovering that I'd unwittingly redefined an existing FORTH keyword in last month's piece and you'll appreciate my emotional crisis.

Still, the editor tells me that all the staff have been JR'd although I don't quite remember seeing an extract from his Pat Metheny review last month. Right! Enough bitching. Handkerchief away and let's get on with part two of the DX21 Voice chart generator.

The definition 'algorithm' collects the relevant data byte, increments its value by one and displays it on the output device. In 'poly/mono', 'port_mode' and 'on/off', a zero or one in the raw data is translated into the necessary text to represent the choice.

The transposition setting is handled by 'trans' and its job is to convert a number in the range 0-48 into the more musical semitone increments between C1 and C5. The remainder after dividing the transposition parameter by 12 is used to calculate an address within the array of note names ('scale'). The degree of the scale is thereby obtained and the octave number, is given from the number of times (plus one) that 12 will divide into the parameter.

On both DX7 and the four operator synths, the only parameter which may adopt a negative value is detune. The definitions 'PLUS and 'MINUS', you may remember, are aliases for the arithmetic symbols '+' and which were redefined earlier. The parameter passed to 'detune' on the stack is the operator number. The address of the beginning of the data corresponding to the given operator is then calculated by 'calc_offset' and the raw data is picked up by 'get_param'. As the displayed data range is -3 to +3 and the raw range is 0-7, it is necessary to subtract three from the raw value.

Conversion of the raw data into the frequency ratios is performed by a rather brute force method. I only discovered too late that the seemingly unrelated collection of frequency ratios are all multiples of 1.00, 1.41, 1.57 and 1.73. The array 'ratios' is created in the same way as 'scale' and the raw data value is used to calculate the address within that array at which the corresponding ratio resides. The ratio is then formatted into two digits either side of a decimal point (ASCII 46). If the leading character is found to be a zero (ASCII 48) then it is replaced by a space before the value is printed by 'TYPE'.

The operator specific amplitude modulation enable, envelope bias and key velocity values are drawn on the chart by 'm.sens' which expects the operator number to be on the stack. In order to display the LFO waveform, each of the four options are included in 'lfo_wave' and the code causes just one to be displayed given a data byte in the range 0-3. The algorithm, feedback setting, LFO waveform, speed, delay, PMD, AMD, sync, PMS and AMS are collated and displayed by 'algo_lfo' which is a conglomeration of most of the definitions previously described. Such are the ways of FORTH.

The numbers in the display boxes which correspond to the green front panel switches are generated by 'box_number'. The definition expects the first and last number required to be on the stack. Each number is formatted to two digits and, if the first is found to be a zero, it is removed and a trailing space added to ensure a constant width 'box'.

The frequency ratio, detune, envelope parameters and output level are displayed by 'o_eg_line' which expects the required operator number to be on the stack. The functions associated with the first eight boxes ie poly/mono to wheel pitch range are displayed by 'port_foot'. Pitch envelope parameters are dutifully displayed by 'pitch_env' and rate and level scaling values are presented by the aptly named 'rate_level'. The final eight function settings from wheel amplitude range to transpose are elucidated by 'breath_trans'.

All the remaining code has to do is to gather the above definitions together in the right order and draw lines between the data. This is made somewhat complex by the requirement to print out both a 16 box wide hard copy version and an 8 box wide screen display. Having run out of imagination for definition names, most of the remaining lines are numbered after a leading 'L'. The numbering roughly corresponds to a downward progression through the lines of the screen display version should you be wondering if there is any logic behind any of it.

The top block of 11 boxes works out to be 80 characters wide and a generous left hand margin is required before each line in the hard copy version only. This formatting is achieved by using the 'lm0' (left margin 0) execution vector and later assigning it to perform either 'Lc' (23 spaces) or 'null' (do nothing) as appropriate. The definitions 'print_top' and 'disc_top' are responsible for the paper and screen versions of this LFO and modulation sensitivity block.

The two highest level definitions are 'crt' and 'print' which call up the DX and display the voice chart on the chosen output device. Within 'print' can be found 'set_lm' which sets the left hand margin on the printer. The printer output is prevented from appearing on the monitor by 'lp' which suitably adjusts the output streams. Monitor output is restored by 'tty'. For the screen display, the chart is split into three parts, each held until a key is pressed.

And that's it. Perhaps you'll want to add cross-checks to prevent things like fingered portamento appearing when POLY mode is selected or there again you might just want to translate it into BASIC. Either way, I hope that it will provide a basis for your own charts and give you a better picture of the component parts of an FM voicing.

(Click image for higher resolution version)

(Click image for higher resolution version)

Erratum: Apologies all round to those who have suffered personal embarrassment resulting from the frequency ratio, detune and amplitude modulation enable parameters of operators 2 and 3 on [the] DX21 voice chart programme being transposed. Define the following —

:swap2/3 (n-n) DUP 2=IF DROP 3 ELSE DUP 3=IF DROP 2 THEN THEN;

— and add 'swap2/3' as the first statement in the definitions 'detune' and 'osc freq' and also after the 'DUP' in m.sens.

More with this topic

Browse by Topic:


Also featuring gear in this article

21 Today
(EMM Aug 85)

June Calendar
(MM Jun 86)

Yamaha DX21 Synth
(12T Aug 85)

(EMM Jun 86)

(MT Feb 87)

(MT Mar 88)

(MT Jun 88)

(MT Jul 88)

...and 4 more Patchwork articles... (Show these)

Browse category: Synthesizer > Yamaha

Featuring related gear

Previous Article in this issue

Chord of the Month

Next article in this issue


Publisher: Making Music - Track Record Publishing Ltd, Nexus Media Ltd.

The current copyright owner/s of this content may differ from the originally published copyright notice.
More details on copyright ownership...


Making Music - Sep 1987



Gear in this article:

Synthesizer > Yamaha > DX21

Gear Tags:

Digital Synth
FM Synth
FM 4-Operator

Feature by Andy Honeybone

Previous article in this issue:

> Chord of the Month

Next article in this issue:

> Demology

Help Support The Things You Love

mu:zines is the result of thousands of hours of effort, and will require many thousands more going forward to reach our goals of getting all this content online.

If you value this resource, you can support this project - it really helps!

Donations for May 2024
Issues donated this month: 0

New issues that have been donated or scanned for us this month.

Funds donated this month: £0.00

All donations and support are gratefully appreciated - thank you.

Magazines Needed - Can You Help?

Do you have any of these magazine issues?

> See all issues we need

If so, and you can donate, lend or scan them to help complete our archive, please get in touch via the Contribute page - thanks!

If you're enjoying the site, please consider supporting me to help build this archive...

...with a one time Donation, or a recurring Donation of just £2 a month. It really helps - thank you!

Small Print

Terms of usePrivacy