>From owner-bode Thu May 18 19:21:36 1995 Received: (from daemon@localhost) by veda.is (8.6.8/8.6.6) id TAA14938 for bode-outgoing; Thu, 18 May 1995 19:21:36 GMT Received: from netcom13.netcom.com (till@netcom13.netcom.com [192.100.81.125]) by veda.is (8.6.8/8.6.6) with ESMTP id TAA14933 for ; Thu, 18 May 1995 19:20:53 GMT Received: by netcom13.netcom.com (8.6.12/Netcom) id MAA07592; Thu, 18 May 1995 12:16:07 -0700 Date: Thu, 18 May 1995 12:16:07 -0700 Message-Id: <199505181916.MAA07592@netcom13.netcom.com> To: HJ2743@denbgm3xm.scnn1.msmgate.m30x.nbg.scn.de CC: analogue@hyperreal.com, bode@veda.is In-reply-to: <2FBB8815@MSMGATE.M30X.NBG.SCN.DE> (message from Haible_Juergen#Tel2743 on Thu, 18 May 95 10:41:00 PDT) Subject: Re: Through Zero FM (was: VCO #76) Reply-to: don@till.com From: Don Tillman Organization: Don's house, Palo Alto, California Sender: owner-bode@veda.is Precedence: bulk From: Haible_Juergen Date: Thu, 18 May 95 10:41:00 PDT Can anybody direct me to the paper where the FM implementation of the DX-7 is layed down? There are so many "basic indroductions" int FM that I have seen, but I really would like to know how it is done in those FM chips. Unfortunately I don't know of any references, and I don't have any actual inside information on Yamaha's FM implementation... But, if you sit back with a martini, put an engineering hat on and think about the issues and the available technologies, it's possible to come up with a compltely reasonable implementation that's very likely to be exactly how they did it. The technology is all digital; multiplies in 1981 (or thereabouts) were prohibitively expensive and/or slow to use at the audio sampling rate. Adds, subtracts, rom lookups, register transfer operations are all relatively cheap and fast. No Pentiums. A DX-7 Operator consists of a sine-wave "VCO", an envelope generator, and a "VCA". The "VCO" can be implemented by simply repeatedly adding a number proportional to F to a register and ignoring any overflow. This gives you a numerical ramp which can't be used directly for aliasing reasons, so this goes to a rom lookup table for the sine wave. Since roms were inexpensive but not free back then, I'm guessing they implemented just one quadrant of sine lookup in rom and used xor gates on the input and output to get the other quadrants. The envelope generator doesn't have to run at the audio sampling rate, so it goes into software. LFOs too. A generalized "VCA" would certainly need a multiplication operation. But, and here's the clever part, we know that the input to the "VCA" is always going to be a sine wave, and thus the "VCA" can be implemented by adding two sine waves of different phases. As those phases approach 180-degrees, the sum goes toward zero. So the "VCA" gets built by summing two rom lookups, and adding and subtracting a phase angle from the rom input of each. Simple. So simple they could easily fit 6 operators times 16-note polyphony into the unit, which was pretty amazing at the time. How about those FZ-16X-whateverthehelltheyrecalled boxes that offer more "VCO" waveforms than a simple sine wave? I'm guessing they just frob some of the bits at the input to the rom to get those waveforms, and the bits are frobbed in such a way that you can still pull off the VCA hack. As I said this is all a guess, but I have a feeling it's right. It also explains a lot of the limitations, quirks, and features of the DX-7. -- Don >From owner-bode Fri May 19 08:25:52 1995 Received: (from daemon@localhost) by veda.is (8.6.8/8.6.9) id IAA12709 for bode-outgoing; Fri, 19 May 1995 08:25:52 GMT Received: from proxy.scn.de ([194.112.84.1]) by veda.is (8.6.8/8.6.9) with ESMTP id IAA12704 for ; Fri, 19 May 1995 08:25:38 GMT Received: from marina.scn.de (marina.scn.de [192.129.41.2]) by proxy.scn.de (8.6.11/8.6.11) with ESMTP id KAA04963; Fri, 19 May 1995 10:19:32 +0200 Received: from r316.m30x.nbg.scn.de (r316.m30x.nbg.scn.de [142.120.5.16]) by marina.scn.de (8.6.11/8.6.11) with SMTP id KAA26453; Fri, 19 May 1995 10:19:59 +0200 Received: from msmgate.m30x.nbg.scn.de by r316.m30x.nbg.scn.de id aa15454; 19 May 95 10:19 MESZ Received: by MSMGATE.M30X.NBG.SCN.DE with Microsoft Mail id <2FBCD33E@MSMGATE.M30X.NBG.SCN.DE>; Fri, 19 May 95 10:19:58 PDT From: Haible_Juergen#Tel2743 To: till Cc: analogue , bode Subject: AW: Re: Through Zero FM (was: VCO #76) Date: Fri, 19 May 95 10:20:00 PDT Message-ID: <2FBCD33E@MSMGATE.M30X.NBG.SCN.DE> Encoding: 25 TEXT X-Mailer: Microsoft Mail V3.0 Sender: owner-bode@veda.is Precedence: bulk > Unfortunately I don't know of any references, and I don't have any > actual inside information on Yamaha's FM implementation... But, if > you sit back with a martini, put an engineering hat on and think about > the issues and the available technologies, it's possible to come up > with a compltely reasonable implementation that's very likely to be > exactly how they did it. [...] Don, thank You for those good hints. Reading thinks like that, it seems very reasonable, but I wouldn't have thought of that myself. (I remember the trick of the Roland LA filters, just triggering a stored step response with the square wave ... it also astonished me, when I first read it in the manual, but it is dead simple!) I always wondered about the 4-op-FM waveforms (odd shapes, but "same harmonical contents as ..." ). Yours was the first explanation I heared about that! Unfortunately, You didn't say anything about the actual FM. Would that be just adding the current value of the modulator to the increment for the carier's lookup table? Well, I think I really learned something today! JH. >From owner-bode Fri May 19 20:49:21 1995 Received: (from daemon@localhost) by veda.is (8.6.8/8.6.9) id UAA01384 for bode-outgoing; Fri, 19 May 1995 20:49:21 GMT Received: from isgate.is (isgate.is [130.208.165.63]) by veda.is (8.6.8/8.6.9) with ESMTP id UAA01355 for ; Fri, 19 May 1995 20:49:09 GMT Received: from netcom13.netcom.com by isgate.is (8.6.10/ISnet/14-10-91); Fri, 19 May 1995 18:25:36 GMT Received: by netcom13.netcom.com (8.6.12/Netcom) id LAA15791; Fri, 19 May 1995 11:19:57 -0700 Date: Fri, 19 May 1995 11:19:57 -0700 Message-Id: <199505191819.LAA15791@netcom13.netcom.com> To: HJ2743@denbgm3xm.scnn1.msmgate.m30x.nbg.scn.de CC: analogue@hyperreal.com, bode@veda.is In-reply-to: <2FBCD33E@MSMGATE.M30X.NBG.SCN.DE> (message from Haible_Juergen#Tel2743 on Fri, 19 May 95 10:20:00 PDT) Subject: Re: AW: Re: Through Zero FM (was: VCO #76) Reply-to: don@till.com From: Don Tillman Organization: Don's house, Palo Alto, California Sender: owner-bode@veda.is Precedence: bulk From: Haible_Juergen#Tel2743 Date: Fri, 19 May 95 10:20:00 PDT Unfortunately, You didn't say anything about the actual FM. Would that be just adding the current value of the modulator to the increment for the carier's lookup table? Yeah. The "VCO" register increment is directly proportional to frequency, so it needs an adder to sum the register outputs of one or two other operators and the register from software (note frequency plus any lfo or envelope modulation). (Or heck, maybe it just uses the one "VCO" adder and does two or three increments. Whatever.) So what I've described is one Operator circuit, laid out flat. It gets multiplexed to do the job of 96 Operators (16 note polyphony times 6 operators) for each sample period. That means it's got to do it's work in roughly 400 nSec. All references to registers need to be cycled through these 96, and software running on the microprocessor gets to update all the register parameter values, including which Operator modulates which Operator. Date: Fri, 19 May 1995 01:39:16 -0700 From: void@slip.net (M Stevens) OK, so if the increment on the lookup table for the carrier is incremented by the current value of the modulator, wouldn't this be amplitude modulation? Perhaps I'm confused about what you mean by "current value"... No, the amplitude of the ramp is fixed because it's simply the wraparound due to register width. The increment determines the frequency. (Umm, I didn't use the phrase "current value".) -- Don