ATMEGA328を搭載した Arduino Duemilanove 互換機で音をPWM D/A変換出力するシンセサイザーライブラリです。
Rev. | Time | Author | Message RSS |
3c6fdeed | 2020-04-18 23:56:21 | ![]() | Doc/keywords update, and macro refactored |
817c85c7 | 2020-04-14 01:14:12 | ![]() | Performance dramatically revived by specifying #pragma GC... |
870b0852 | 2020-04-06 05:18:26 | ![]() | Supported the compilation on Arduino IDE on Linux - Refe... |
8fb01690 | 2019-03-31 01:36:20 | ![]() | ドキュメントの日付を最新化 |
4db8be16 | 2019-03-31 01:28:42 | ![]() | 波形計算の見直し(シェパードトーンを7→8オクターブに変更、... |
fcbe8ac3 | 2017-05-14 23:53:39 | ![]() | ・チャンネル優先度指定に対応(特定のMIDIチャンネルについ... |
48db0187 | 2017-05-11 00:00:36 | ![]() | スケッチの例をCAmiDionのスケッチから抜粋して大幅拡充 |
38ba7d32 | 2017-05-06 21:57:55 | ![]() | 応答性の改善 ・ボイスアサイン優先度計算の軽量化(見るボリ... |
6d811271 | 2016-06-11 13:25:25 | ![]() | [BUGFIX] RPNで受信したベンド幅(Pitch Bend Sensitivity)... |
cc32489e | 2016-04-23 23:45:17 | ![]() | systemReset() による初期化動作が不十分だったのを修正 |
[PWMDAC_Synth - PWM DAC synthesizer library for Arduino] ver.20200418 https://osdn.jp/users/kamide/pf/PWMDAC_Synth/wiki/FrontPage ±êÍACAmiDion http://www.yk.rim.or.jp/~kamide/music/chordhelper/hardware/ ÌQ@È~ÅÀµ½¹¹ðCuÆµÄÆ§³¹½A ArduinoÝ·@pÌPWMVZTCUCuÅ·B ArduinoÅyíðìë¤ÆµÄA±ñÈâèÉÔ¿½Á½±ÆÍ èܹñ©H E¹ðo·Èç tone() ªèÁæè¢¯ÇAa¹ªoÈ¢c EanalogWrite() Å PWM o͵ÄàApXgÌügª490HzÆ á·¬é©çA1kHzOã̹ÈñÄæ¹çêÈ¢AǤµæ¤c »ñÈâèàAAVRÌvXP[iªüíjÌÝèðÏ¦Ä pXgÌügðÅåÉ·êÎêCÉðB ±ÌCuÍAK¥³µ¢Å¬ÌüúŶ³¹½^C}[èÝÅA »ÌuÔÌg̳ɶAPWMÌpXðñA^CÉfXV·é ±ÆÉæèAé`g¾¯ÅÈAFXÈg`̹ðo͵ܷB ¡Ì{CXðgÁ½½dÁZÉæèPWMÌpXðvZµÄ¢éÌÅA a¹ÌoÍàÂ\Å·B O¹¹`bvȵŠArduino {Ì»ÌàÌÉVZTCU̹¹ð Àµ½¢Æ«ÉpµÄ¾³¢B CXg[ WJµ½ PWMDAC_Synth tH_ðAWindows Ì }ChL g\Arduino\libraries\ Éu¾¯ÅCXg[ūܷB u¢½ãAArduino IDE Ìj [ [t@C] ¨ [XPb`Ìá] É PWMDAC_Synth ª»ê鱯ðmFµÄ¾³¢B g¢û î{IÈg¢ûðºLɦµÜ·BȨAm[gIAm[gItÈÇA¹ÌoµûÉ¢ÄÍ Arduino IDE Ìj [©ç½ÇêéuXPb`ÌávðQlɵľ³¢B yTvR[hz // // KvɶAPWMDAC_Synth.h ðCN[h·éOÉ #define źLðwèūܷB // #define PWMDAC_OUTPUT_PIN 3 // PWMoÍsÔiȪÂFºLuoÍs(PWM)vQÆj #define PWMDAC_POLYPHONY 6 // ¯¹iȪÂFºLu¯¹vðQÆj #define PWMDAC_NOTE_A_FREQUENCY 440 // A¹Ì` [jOügiȪÂFftHg440Hzj #define PWMDAC_CHANNEL_PRIORITY_SUPPORT // Áè`lÌDæxðã°é@\ðLø»igíÈ¢êÍȪj #include <PWMDAC_Synth.h> // // g`e[uðAKvȪ¾¯è`µÜ·B // PWMDAC_CREATE_WAVETABLE(squareWavetable, PWMDAC_SQUARE_WAVE); // é`g PWMDAC_CREATE_WAVETABLE(triangleWavetable, PWMDAC_TRIANGLE_WAVE); // Opg PWMDAC_CREATE_WAVETABLE(sineWavetable, PWMDAC_SINE_WAVE); // ³·g PWMDAC_CREATE_WAVETABLE(shepardToneSineWavetable, PWMDAC_SHEPARD_TONE); // VFp[hg[i³À¹Kj PWMDAC_CREATE_WAVETABLE(sawtoothWavetable, PWMDAC_SAWTOOTH_WAVE); // ̱¬èg // // g`ÆGx[vp[^iADSRjð Instrument \¢ÌÉ©ËÄ // vOÌæÉ¹Ff[^𶬵ܷB // à¤Ì {} ÉÍADSRÌlðtÅwèµÜ·ilÌÍÍÉ¢ÄÍãqÌu¹FÏXvðQÆjB // PROGMEM const Instrument instrument = {sawtoothWavetable, {9, 0, 11, 4}}; // // ¶¬µ½¹FðwèµÄPWMDAC_SynthÌÀÌiCX^Xj𶬵ܷB // MIDI`l1`16ª·×ı̹FÉú»³êÜ·B // PWMDAC_CREATE_INSTANCE(&instrument); setup() { PWMDACSynth::setup(); // ú»iK{j #if defined(PWMDAC_CHANNEL_PRIORITY_SUPPORT) // KvɶÄAfBp[gªüÁÄ¢éMIDI`lÌDæxðµÜ· //iÚ×É¢ÄÍãqÌu`lDæxwèvðQÆjB PWMDACSynth::getChannel(1)->setPriority(0xC0); #endif } loop() { PWMDACSynth::update(); // óÔXViK{j // £ ±êÍA¸ÈÇÌADSRGx[v`óÌ»ÝÊuðêÂiß½èA // W [VÉæÁÄÏ»·éÔ²ÆÌügðXV·é½ßÌÖÅ·B // ÄÑoµpxÍ©ªÅJE^ðpÓ·éÈÇÌû@ÅRg[µÄ¾³¢B } ¯¹i{CXj ftHgÍ6da¹Å·B PWMDAC_POLYPHONY ÉlðÝèµÄRpCµ¼·±ÆÅ¸Â\Å·B ¦ ¯¹ðâµÄ¢ÆA»Ìª ISR() (Interrupt Service Routine: èÝT[rX[`)ɨ¯é [vñª¦A½ZÉÈÁīܷB ÜèɽZ᪎ loop() ðÀs·é ɪÈÈéÆA®ìs\É×èÜ·B»¤Èé¡OªA¯¹ÌÀãÌãÀÅ·B ¦ ISR() ÈÇÅ®ì¬xªv³êé½ßAPWMDAC_Synth.h ÉÍ #pragma GCC optimize ("-O3") ªwè³êĢܷBRpCÌÅK»îðA±ÌCu¾¯¬xDæÉ·é½ßÅ·B ÁèÌMIDI`lÉε{CXATCÌDæxðã°é±ÆàūܷB ãqÌu`lDæxwèvðQÆB oÍs(PWM) PWM¹ºoÍpƵÄwèÅ«ésÔÍ 3,9,10,11 Ì¢¸ê©Å·B ftHgÌsÔÍ 3 Å·B 3,11 ðIðµ½êÍ TIMER2A9,10 ðIðµ½êÍ TIMER1 ªgíêÜ·B ȨAsÔ 5,6 à PWM [qÅ·ªA±êðwèµÄàRpCG[ÉÈèA pūܹñB±êÍ TIMER0 pÌ ISR() ªAArduino Ì millis() Öð À·é½ß·ÅÉgíêÄ¢ÄAÄè`ūȩÁ½½ßÅ·B PWM oÍsÍA»ÌÜÜ PC Ì LINE IN ÈÇÉÂÈ¢Åàê¹Í·±¦Ü·ªA [pXtB^Å®üg¾¯ðÊ·æ¤É·éÆAæè·«â·ÈèÜ·B MIDI`lì PWMDACSynth::getChannel() Å MIDI`lÔ(1`16) Ì MIDI`lÖÌ|C^ ðÝϷūܷBMIDI`lÖÌ|C^ðîµÄA `lPÊɽ¹ép[^ðìūܷB iìû@É¢ÄÍ PWMDAC_Synth.h ðQÆj ȨAm[gIAm[gItAsb`xhÈÇA¡oÄ¢é¹ iATC³êÄ¢é{CXjɦÀɽf³¹éÉÍAPWMDACSynth Ì٤ŠpӵĢéoÖðÄÑoµA`lÆ{CXð¯ÉXV·éKvª èÜ·B MIDIÖ PWMDACSynth Åè`³ê½¢Â©Ì static IuWFNgÍA MIDICuÌ MIDI.setHandleXxxx() ɼÚwèÅ«é`®ÉÈÁĢܷB ½¾µAÚ±èÌMIDIfoCXÉæÁÄÍANOTE OFF ÌãíèÉ velocity=0 Ì NOTE ON ðÁÄ鱯ª éÌÅA»Ì꾯 NOTE OFF ðÄÑo·Æ¢Á½HvªKvÉÈèÜ·B MIDI`lÔÍAMIDICuÉí¹Ä 1`16 ÌÍÍÅ wè·éæ¤ÉìÁÄ èÜ·B ¹FÏX g`e[uÆADSRGx[vp[^ðA»ê¼ê MidiChannel NXÌ wavetable Æ envelope[] Éwè·é±ÆÅA¹FðÏXūܷB ܽAInstrument \¢ÌèðvOÌæÉìèA»êð programChange() Éwè·é¾¯ÅAg`ÆGx[vðêxÉÝèūܷB MIDIÌvO`FWðÀ·éÆ«ÉÖÅ·B yg`z wavetable g`e[uÍAvf256Ìbyte^PROGMEMzñƵͬµÜ·B »êð wavetable Éwè·é±ÆÅAg`ðØè֦鱯ªÅ«Ü·B g`ÖÌ}Nð PWMDAC_CREATE_WAVETABLE() }NÉwè·é©A ܽͻêÉÈçÁÄ©ªÅzñðè`·é±ÆÅACÓÌg`ð¶¬·é±ÆªÂ\Å·B ¦ gÍi255¯¹FftHg6da¹ÌÆ«42jð´¦È¢æ¤ÉµÄ¾³¢B ¯¹¢ÁÏ¢ÉÂ絽ƫÉÅå¹Ê255ð´¦ÄI[o[t[µAmCYª ¶·é°êª èÜ·B yADSRGx[vz envelope[] ADSR_ATTACK_VALUE - A^bNÔi0`15Aå«¢ÙÇm[gI¼ã̧¿ãªèªäÁèj ADSR_DECAY_VALUE - fBPCÔi0`15Aå«¢ÙÇm[gIã̸ªäÁèj ADSR_SUSTAIN_VALUE - TXeBxi0`255A¸ª~ÜÁ½ ÆÛ·é¹Êj ADSR_RELEASE_VALUE - [XÔi0`15Aå«¢ÙÇm[gItã̸ªäÁèj ÀÔÍ loop() àÅ update() ðÄÑo·pxÉæÁÄÏíèÜ·B `lDæxwè ±Ì@\ÍAÁèÌMIDI`liáFfBp[gj̹ª¼ÌMIDI`lÌ¹É ©«Á³êé»ÛªÚ§ÂêÉA»ÌMIDI`lÉηé{CXATCÌDæxð ·é½ßÌ@\Å·B ±Ì@\ðg¤ÉÍ PWMDAC_CHANNEL_PRIORITY_SUPPORT ð #define ·éKvª èÜ·B #define PWMDAC_CHANNEL_PRIORITY_SUPPORT PWMDACSynth::getChannel(`lÔ)->setPriority(`lDæx); `lDæxÉÍ 0x00i0AÅáFftHgj` 0xFFi255AÅjðwèūܷB î{IÈl¦ûƵÄAADSRGx[vÅÏ®µ½¹ÊÌÅଳ¢{CX©çÉA ¼ÌMIDI`lÉ÷é±Æð´¥ÆµÄ¢Ü·B »Ì¤¦ÅA`lDæxÌrbg½]li1Ìâjðu¹ÊèlvƵA »êð´¦é¹ÊÌ{CXðA»Ì`lªæèDæIÉèLµ±¯éæ¤ÉµÄ¢Ü·B Dæxð Üèµ·¬éÆA\ª¬³¢¹ÊÉà©©íç¸{CXðèLµ±¯ÄµÜ¢A ½da¹´ª¸íê鱯ª èÜ·ÌÅAKX²®µÄ¾³¢B ìÒF«æµ - Akiyoshi Kamide http://www.yk.rim.or.jp/~kamide/
Welcome to OSDN Wiki system. Here is your chamber Wiki space.
Check Wiki Guide (English) to refer syntax and functions.
[PageInfo]
(auto generated page)
[Permissions]
view:all, edit:admins, delete/config:admins