[sdiy] Prom generating TOS like MK50240 bits..

Veronica Merryfield veronica at merryfield.ca
Sat Apr 21 21:24:19 CEST 2012


FYI, it should just fit in an Altera 5M40Z - it has 24 10bit logic blocks so it will be tight and will need an external clock. $0.96 at DigiKey. I don't have the Altera tools so haven't tried it out. 

On 2012-04-20, at 1:15 PM, Harry Bissell wrote:

> doesn't this just scream "FPGA" ?   :^)
> 
> H^) harry
> 
> ----- Original Message -----
> From: nvawter at media.mit.edu
> To: synth-diy at dropmix.xs4all.nl
> Sent: Fri, 20 Apr 2012 15:22:34 -0400 (EDT)
> Subject: Re: [sdiy] Prom generating TOS like MK50240 bits..
> 
> Quoting Tom Wiltshire <tom at electricdruid.net>:
> 
>> 
>> On 19 Apr 2012, at 18:15, nvawter at media.mit.edu wrote:
>> 
>>> Quoting Tom Wiltshire <tom at electricdruid.net>:
>>> 
>>>> Thinking about it more, though, it's the least common *multiple*  
>>>> which is crucial, not the factors.
>>>> Multiply all these, Least Common Multiple = 1.4163158499841E+22
>>>> 
>>>> Still very big, but we're under a yottabyte this time!
>>> 
>>> 
>>> Ah yes!  Glad you reminded me it's least common multiple...  that
>>> reduces my implementation to:
>>> 32*27*25*7*17*19*23 = 1123264800
>>> l(.)/l(2)
>>> 30.06505092474673512219, e.g. 2^30.065
>>> 
>>> So, that's just a little over 1 Gig addresses!
>>> 
>>> Shockingly enough, you can by 1Gb flash mems for ~$6 now.
>>> Since you'd need 11-12 of them (one for each note), that's about $66....
>>> or, just use a single 16Gb flash chip for $11.73!!!
>>> 
>>> If you were to clock it at e.g. 14080 kHz, the /32 output would  
>>> result in A440 and the chip would only repeat every 19 hours!
>>> 
>>> 
>>> With some interesting features... for instance, you could scramble,  
>>> randomize, wow, flutter, and otherwise perturb the outrageously  
>>> long word inside the memory to get variations and reduce  
>>> phase-locking...
>>> 
>> 
>> One thing I don't understand; are you using more than one bit for  
>> each output? if so, why? The point is that if we had a 16-bit  
>> memory, we could store the next state for all 13 outputs and have 3  
>> bits left over. In which case we need only one large 16-bit memory,  
>> not 12.
> 
> oops yeah I could have been clearer about that.  for now, I'm only  
> considering one-bit output per note... so when I said 1Gb chips for a  
> single voice, I meant literally 1 Gb of storage, which in practical  
> reality means 128Mb of addr and 8b of data, so you'd have to have a  
> demux in there to get the full 1G of data for the single voice.   
> That's obnoxious :)  So 1G of addr by 16b of data chip would be much  
> smarter.   And yeah I'm saying that the output would only require 12  
> (11) of those 16 bits.  The other 4-5 would be wasted, or alternates...
> 
> 
>> However, since the problem gets worse the more outputs you try and  
>> combine onto a single chip, perhaps it's worth looking at the  
>> problem in pieces.
> 
> oh mi god!  you just burst the problem space wide open again, just  
> when it was getting tractable :)  Seriously, not a bad idea to group  
> the outputs into more manageable sizes.  I'm not smart enough to  
> partition that without going through all possible combinations.
> 
> I think, using my product of 7 factors approach (32*27*25*7*17*19*23),  
> it would be possible to loop through all 128(64) combinations of  
> putting each factor into one or the other chip, and choose the  
> combination that results in the lowest common multiple.  e.g.
> 
> 32*27*25*7*17*19 in one chip,   23 in the other
> 32*27*25*7*17     in one chip, 19*23 in the other
> 32*27*25*7*17*23  in one chip,  19 in the other
> 32*27*25*7*19*23  in one chip, 17 in the other
> 
> ok I'm silly, I just wrote the program that does it (see source and  
> output at  
> https://docs.google.com/document/d/1qLgSr9A_BqfQit-rcODdxahpwE4Qw0nuAJLp2-n10VU/edit).  The optimal way seems to be a combination  
> of:
> 52003 in one chip and 21600 in the other chip.  Note that these are  
> below 64k!!!
> 
> 32*27*25 = 21600
> 7*17*19*23 = 52003
> 
> 
> although -- it's note quite valid for the problem b/c those values  
> aren't the actual values needed to make sounds...   I would shift it  
> around and stuff those "ugly" (prime) dividers together on the same  
> chip.  That would fit on an 8k chip and a 256k chip :)
> 
> 17*19*23 = 7429
> 32*27*25*7 = 151200
> 
> 
>> Say we broke it into 4. Which outputs would you put on each chip to  
>> get the smallest possible memory size? (e.g. which ratios combine to  
>> give the smallest least common multiple?).
>> This would reduce the problem enormously, although it would require  
>> 4 sets of address counters. For example 478x358x239 = 40,898,636 -  
>> only 27 bits required for the address!
>> 
>> To be honest, I still don't think this is a viable way to go. I've  
>> thought quite a lot about this problem on and off over the last few  
>> years. It's a classic "can it be done on a $1 PIC?" problem, which  
>> is why it appeals to me - I don't actually need or really see the  
>> point of a top octave generator chip.
> 
> I agree that as a final, shipping, production solution TOGs are  
> probably not sensible.  However, for exploring and experimenting, it's  
> very convenient to have simultaneous access to all 12 outputs.  I'm a  
> programmer so I see things different from the rest of the crew I work  
> with...  they like things at the chip-level, having come from the  
> circuit-bending direction, so they're fond of making tangible  
> connections.  I think it's got something to do with constructive anger  
> which doesn't translate well into virtual activities :)
> 
> One other consideration when comparing e.g. CPLDs to uControllers  
> would be the maximum clocking frequency.  a CPLD might be able to  
> reach 200MHz or so, while a uController might be hard-pressed to work  
> function at 1 MHz, unless code was 100% optimized.  So, part of the  
> decision depends on how fast your source frequency is.
> 
> And I guess the other part is complexity/number of chips/board space.   
> The whole reason I decided to use a CPLD in the first place is because  
> when I tried it with discrete logic, it was too big to fit on a PCB of  
> the eval version of Eagle :)
> 
> BTW, w/r/t to reducing phase locking, it might be possible to  
> introduce noise into the clock.  For example, in my CPLD "Divider  
> Party," every divider is clocked by one input...  but why not use  
> separate clocks into the chip and physically interfere with them?    I  
> like your idea of using the thermally-influenced internal oscillators  
> even better :)
> 
> 
>> Anyway, my best guess for a solution would be to use 12 super-small,  
>> super-simple chips to simply output the states for *one* note. This  
>> requires a maximum of 478 different outputs, and perhaps twice that  
>> for ROM if it takes you two instructions to output a literal to a  
>> pin. So you'd take 12 of these:
>> 
>> http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en019863
>> 
>> (6-pin, SOT-23, costs $0.30 - total under $4)
>> These all have their own internal 4MHz RC clock, so you won't get  
>> phase locking, and you will get some temp drift - hey, it's almost  
>> an *analog* solution! Alternatively, find a similar chip that  
>> accepts an external clock and clock all 12 uPs from one master  
>> clock, locking the phases and making it sound like a cheap Italian  
>> organ from the 70s.
>> Currently, that's the best way I can see - but I don't use  
>> CPLD/FPGAs, which probably offer another route.
> 
> 
> yeah, that's actually a really good an interesting solution, too!
> 
> 
> 
>> Regards,
>> Tom
> 
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at dropmix.xs4all.nl
> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
> 
> -- 
> Harry Bissell & Nora Abdullah 4eva
> _______________________________________________
> 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