एक स्थिर स्वर उत्पन्न करने के लिए एक विधि डायरेक्ट डिजिटल सिंथेसिस है। आपको एक डीएसी, या तो एक समर्पित चिप या एक प्रतिरोधी सीढ़ी की आवश्यकता होगी।
आप आवृत्ति आप उत्पन्न करना चाहते हैं पर अतिप्रवाह के लिए एक काउंटर की स्थापना की, और काउंटर से प्रत्येक टिक पर आप सूचकांक एक wavetable के लिए इसका इस्तेमाल करने और अपने डीएसी के लिए एक निर्गम मूल्य मिलता है।
मैंने यहां Arduino के लिए New Noises From MidiVox पर दो अलग-अलग स्वर उत्पादन तकनीकों को लिखा है। डीएसी अद्यतन कोड मिडीवॉक्स (और एडफ्रूट वेवशील्ड) एमसीपी 4 9 2121 के लिए विशिष्ट है, लेकिन साइन लहर उत्पादन आम तौर पर लागू होना चाहिए।मैं कोड ज्यादातर ATmegas को सामान्य बनाने का प्रयास किया है, लेकिन वहाँ है कि में crept Arduino-वाद के एक जोड़े हैं।
कि पद से चिपकाया गया है, यहाँ एक MCP4921 साथ एक Arduino पर एक 440Hz स्वर खेलने के लिए कुछ कोड है एसपीआई बस में:
uint16_t sample = 0;
/* incr = freq * (2^16/15625)
* So for 440Hz, incr = 1845 */
uint16_t incr = 1845;
/* oscillator position */
uint16_t pos = 0;
const uint8_t sine[] = {
0x80, 0x83, 0x86, 0x89, 0x8C, 0x8F, 0x92, 0x95, 0x98, 0x9B, 0x9E, 0xA2,
0xA5, 0xA7, 0xAA, 0xAD, 0xB0, 0xB3, 0xB6, 0xB9, 0xBC, 0xBE, 0xC1, 0xC4,
0xC6, 0xC9, 0xCB, 0xCE, 0xD0, 0xD3, 0xD5, 0xD7, 0xDA, 0xDC, 0xDE, 0xE0,
0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEE, 0xF0, 0xF1, 0xF3, 0xF4,
0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE,
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF5, 0xF4, 0xF3, 0xF1,
0xF0, 0xEE, 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
0xDA, 0xD7, 0xD5, 0xD3, 0xD0, 0xCE, 0xCB, 0xC9, 0xC6, 0xC4, 0xC1, 0xBE,
0xBC, 0xB9, 0xB6, 0xB3, 0xB0, 0xAD, 0xAA, 0xA7, 0xA5, 0xA2, 0x9E, 0x9B,
0x98, 0x95, 0x92, 0x8F, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x77,
0x74, 0x71, 0x6E, 0x6B, 0x68, 0x65, 0x62, 0x5E, 0x5B, 0x59, 0x56, 0x53,
0x50, 0x4D, 0x4A, 0x47, 0x44, 0x42, 0x3F, 0x3C, 0x3A, 0x37, 0x35, 0x32,
0x30, 0x2D, 0x2B, 0x29, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
0x16, 0x15, 0x13, 0x12, 0x10, 0x0F, 0x0D, 0x0C, 0x0B, 0x0A, 0x08, 0x07,
0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06,
0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x12, 0x13, 0x15,
0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x29, 0x2B, 0x2D,
0x30, 0x32, 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x42, 0x44, 0x47, 0x4A, 0x4D,
0x50, 0x53, 0x56, 0x59, 0x5B, 0x5E, 0x62, 0x65, 0x68, 0x6B, 0x6E, 0x71,
0x74, 0x77, 0x7A, 0x7D
};
void setup() {
cli();
/* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
this gives a timer interrupt at 15625Hz. */
TIMSK2 = (1 << OCIE2A);
OCR2A = 127;
/* clear/reset timer on match */
TCCR2A = 1<<WGM21 | 0<<WGM20; /* CTC mode, reset on match */
TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20; /* clk, /8 prescaler */
SPCR = 0x50;
SPSR = 0x01;
DDRB |= 0x2E;
PORTB |= (1<<1);
sei();
}
ISR(TIMER2_COMPA_vect) {
/* OCR2A has been cleared, per TCCR2A above */
OCR2A = 127;
pos += incr;
/* shift left a couple of bits for more volume */
sample = sine[highByte(pos)] << 2;
PORTB &= ~(1<<1);
/* buffered, 1x gain, active mode */
SPDR = highByte(sample) | 0x70;
while (!(SPSR & (1<<SPIF)));
SPDR = lowByte(sample);
while (!(SPSR & (1<<SPIF)));
PORTB |= (1<<1);
}
void loop() {
}
प्रत्यक्ष डिजिटल संश्लेषण के बारे में गंधा बात यह है कि यह कई टन एक साथ (इसके अलावा द्वारा) खेल सकते हैं या (जोड़ने से पहले मात्रा से गुणा) वांछित मात्रा में उन्हें मिश्रण के लिए बेहद आसान है।
मुझे पता चला है कि एक Arduino इस विधि का उपयोग कर लगभग 30 टन खेल सकता है। मेरा विशेष आवेदन Hammond organ simulation के लिए है, और यह भी उपयोगी पढ़ने को साबित कर सकता है।
दिलचस्प परियोजना है, लेकिन unluckyly वह "outsorced" ध्वनि एक तीसरी पार्टी चिप को हिस्सा डिकोडिंग:। "बोर्ड पर अन्य चिप वीएलएसआई, फिनलैंड से एक VS1011 है यह एक एमपी 3 और wav विकोडक चिप, एक डीएसी, और एक हेडफोन एम्पलीफायर सभी 28 पिन पैकेज में " मैं सीखने के लिए बस इसे स्वयं करने के बाद हूं :) – palako