[sdiy] Logs on a micro? Was: Reverse engineer an EPROM encoding?
rburnett at richieburnett.co.uk
rburnett at richieburnett.co.uk
Wed Nov 13 01:38:03 CET 2013
You can also do a similar range reduction trick but using a polynomial
approximation to the log function over one octave. Once you have a
simple polynomial that conforms sufficiently well for inputs over a 1:2
range, you use range reduction and binary shifts to process the values
that lie outside that range. (This is what I typically use to do LOG
and EXP functions for things like v/oct tracking or dB/lin conversions.)
But if you only need results for a handful of values then a LUT is
definitely the easiest way to do it and often also the fastest. Or a
combination of LUT and range reduction. Or use LUT with linear
interpolation. It really depends on how well endowed your processing
platform is in the ROM and number-crunching departments.
-Richie,
On 2013-11-13 00:24, Eric Brombaugh wrote:
> In general it's not too hard to do a log2() approximation using simple
> math operations without lookup tables - I do it all the time in
> hardware. The trick is to implement it as a piecewise-linear function.
>
> First you bring the input word in, then shift it upwards until there's
> a '1' in the msb. Subtract the number of shifts required for this from
> the number of bits in the input word - this is the integer portion of
> your output and is the coarse log2() result.
>
> For the piecewise linear portion, take the remaining bits below the
> '1' in the MSB and concatenate them with the integer bits from the
> shift operation.
>
> There's a reasonable description of it here:
>
> http://degiorgi.math.hr/~singer/aaa_sem/Div/97-105.pdf
>
> and many other places - this is old tech.
>
> Eric
>
>
> On 11/12/2013 05:05 PM, Tom Wiltshire wrote:
>> You're looking for an equation to get you from linear input data to
>> values you have to stick in the EEPROM, right?
>>
>> So we're looking at something like:
>>
>> (log2( Linear Data )+5) * 128 = EEPROM Data
>>
>> If you want to do such a sum on a microcontroller (Is that what you
>> meant?), you'd do best at the PICList:
>>
>> http://www.piclist.com/techref/microchip/math/power/index.htm
>>
>> As usual for this kind of craziness, Scott Dattalo is right up there.
>> Still, his solution suggests that you'll be looking at some kind of
>> approximate method - he uses a lookup with interp. I suppose the other
>> approach would be interative methods. How much time have you got?
>>
>> HTH,
>> Tom
>>
>> On 12 Nov 2013, at 23:19, MTG <grant at musictechnologiesgroup.com>
>> wrote:
>>
>>> I have made some progress in figuring out this EPROM/ASIC/DAC combo
>>> that Kawai were using in the mid-80's, but I need some help with
>>> coding suggestions. You may recall some of the details by looking
>>> back in the archives. It's a drum machine that stores the sounds in
>>> some kind of log format. The ASIC then anti-logs the data before
>>> presenting it to the DAC. The ASIC does mixing and volume control.
>>>
>>> I made an EPROM containing a 12-bit ramp and inserted it in the drum
>>> machine. Then for every friggin single step of that ramp, I recorded
>>> the output from the ASIC to the DAC. Here is the transfer function:
>>>
>>> http://musictechnologiesgroup.com/blog/wp-content/uploads/2013/11/Kawai_R100_DGU.bmp
>>>
>>> So one obvious way of pre-encoding my own sound data would be to use
>>> a look-up table for the data I've recorded. BUT I'm looking for
>>> alternatives and since there has been talk about fixed point math and
>>> the like before... I thought people here might help. In a nutshell,
>>> it looks to me like for every 80h change in input data, the output
>>> data doubles. I wonder if there is a some binary math I can do here
>>> that do the same thing?? Here are some sample values:
>>>
>>> EPROM out DAC Input
>>> (hex) (decimal)
>>> --------- ---------
>>> 000 0
>>> 080 0 (1/16)
>>> 100 0 (1/8)
>>> 180 0 (1/4)
>>> 200 0 (1/2)
>>> 280 1
>>> 300 2
>>> 380 4
>>> 400 8
>>> 480 16
>>> 500 32
>>> 580 64
>>> 600 128
>>> 680 256
>>> 700 512
>>> 780 1024
>>> 7FF 2048 (rail)
>>>
>>> I don't think it's piecewise linear either, but I've not had time to
>>> look at the in-between values.
>>>
>>> GB
>>>
>>> On 10/16/2013 12:40 PM, Scott Nordlund wrote:
>>>> Several drum machines did use Mu-law encoding (Drumulator or
>>>> something; I don't remember). And several others used floating point
>>>> DACs (various Yamaha models since they were into that sort of
>>>> thing). But you'd be able to tell this from the DAC circuits
>>>> themselves. I do think it's likely that the waveforms are stored in
>>>> logarithmic format, which is exponentiated before being sent to the
>>>> DAC, but for a different reason. Two part question: (1) Is it
>>>> possible to control the amplitudes of the individual drum sounds?
>>>> (2) Is it a multiplying DAC configuration where the sounds are
>>>> scaled by a time-multiplexed control voltage fed into the DAC's Vref
>>>> pin? If (1) is yes and (2) is no, it's most likely that the wave
>>>> data is stored in a logarithmic format for easier amplitude control.
>>>> As in the DX7, amplitude is controlled by adding the amplitude value
>>>> to the logarithmic format waveform data, then passing the result
>>>> through an exponential table. y = exp(log(a)+log(b)) is equivalent
>>>> to
>> y
>>> = a*b.
>>> It's more efficient because it requires only a lookup table rather
>>> than a multiplier.
>>>>
>>> _______________________________________________
>>> Synth-diy mailing list
>>> Synth-diy at dropmix.xs4all.nl
>>> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
>>
>> _______________________________________________
>> Synth-diy mailing list
>> Synth-diy at dropmix.xs4all.nl
>> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
>>
>
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at dropmix.xs4all.nl
> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
More information about the Synth-diy
mailing list