[sdiy] Wavetable Design Update

Tom Wiltshire tom at electricdruid.net
Sat Feb 5 13:03:26 CET 2011


There's something I'm not getting here. You say there isn't enough resolution at the top end, but a quick calculation for the highest MIDI note frequency gives a reasonable result:

	division value = 20MHz / Highest MIDI freq		 (assuming prescaler is 1)
	division value = 20MHz / 12543Hz = 1595

The next division value down (1595+1) gives a frequency of 12531Hz. This is a worst-case frequency step of:

	difference in cents = 1200 * log2(freq1 / freq2);

	difference in cents = 1200 * log2(12543 / 12531) = 1.65 cents.

This is comfortably ok.

Or did I do something wrong?

Tom


On 5 Feb 2011, at 11:16, ASSI wrote:

> On Wednesday 02 February 2011, Matthew Smith wrote:
>> My problem is that given a frequency f, I have to work out timer
>> configuration values which are:
>> 
>> * The number to count up to
>> * The prescaler value, if required.
> 
> The prescaler in the ATTiny simply acts as a (binary) exponent on the count 
> number.  That means the best frequency resolution will always be achieved by 
> chosing the lowest prescaler and highest count value possible.  Assuming you 
> use CTC mode, the datasheet says:
> 
> (1+OCR1A) = f_clk / 2*N*f_out
> 
> You only have five possible values for N (1, 8, 64, 256, 1024), all powers 
> of 2, and that means you can just shift right by (0, 3, 6, 8, 10) bits after 
> figuring the ratio f_clk/2*f_out, depending on whether the result fits into 
> 16bit or not.  So your calculation in the most general case goes like this:
> 
> ratio32 = (f_clk>>1)/f_out; // to 32bit HMSB:HLSB::LMSB:LLSB
> if (HMSB != 0) {
> 	N = 1024;
> 	ratio24 >>= 10;  // if the value is still too large, tough shit
> } else {
> 	if (HLSB < 0) { // 8th bit set?
> 		N = 256;
> 		ratio24 >>= 8; // that's a copy LMSB->LLSB, HLSB->LMSB
> 	}
> 	if (HLSB == 0) // should be able to get that from the same TST
> 		N = 1;
> 	else {
> 		if (HLSB & 0x38) {
> 			ratio >>= 6;
> 			N = 6;
> 		} else {
> 			ratio >>= 3;
> 			N = 3;
> 		}
> }
> OCR1A = --ratio16;
> 
> That said, for the frequency range in question you'll end up with counts 
> from 4778 to 3, so you can skip that funky shifting completely since the 
> ratio will always fit into 16bit with room to spare when you just don't use 
> the pre-scaler at all (N==1).  Conversely this means that the resolution 
> isn't all that great at the higher octaves, the input frequency is just too 
> low for that.  You've got 100ns period resolution, but let's calculate how 
> much you really need - highest frequency 10MHz/3, desired resolution in 
> musical pitch is 10cent:
> 
> :      (120_  /  )
> : f' = (    \/ 2 ) * f_max
> :                                         (    120  /    )
> : t_res = T' - T = 1/f_max - 1/f' = 1/f * (1 -    \/ 1/2 )
> 
> ...and that calculates to 1.75ns for the period resolution or 1140MHz that 
> would be required at the input of the counter.  With the actual 20MHz input 
> you reach the desired pitch resolution 6 octaves from the top.  So you will 
> have to do some fractional counting by switching between two (or more) 
> counter values to extend the useful range of frequencies to at least the 
> middle octaves.  I don't know how fast the counter interrupts are on the 
> ATTiny, but it doesn't look too good for getting to the full MIDI range.
> 
> 
> Achim.
> -- 
> +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+
> 
> Factory and User Sound Singles for Waldorf rackAttack:
> http://Synth.Stromeko.net/Downloads.html#WaldorfSounds
> _______________________________________________
> 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