12352|12

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用Arduino做的效果器~可以自己Remix啦~ [复制链接]

参考国外大神制作的一个效果器,可以发出各种奇葩的声音,板子用的是Arduino Uno。通过调节5个4.7K的电位器合成各种不同的声音,当然,也可以通过修改程序发出不同的声音~
程序使用的是一种声音合成算法,这个算法是产生一些短到刚好能分辨的声音小片段(声音粒子grain),然后对它们组合重排处理,在输入多变的参数时,可以形成丰满丰富的连续声音。好吧,其实这个程序我也看得一知半解的。。。囧rz


这是国外大神制作的合成器的项目主页:https://code.google.com/p/tinkerit/wiki/Auduino
代码如下:
  1. // Auduino, the Lo-Fi granular synthesiser
  2. //
  3. // by Peter Knight, Tinker.it [url]http://tinker.it[/url]
  4. //
  5. // Help:      [url]http://code.google.com/p/tinkerit/wiki/Auduino[/url]
  6. // More help: [url]http://groups.google.com/group/auduino[/url]
  7. //
  8. // Analog in 0: Grain 1 pitch
  9. // Analog in 1: Grain 2 decay
  10. // Analog in 2: Grain 1 decay
  11. // Analog in 3: Grain 2 pitch
  12. // Analog in 4: Grain repetition frequency
  13. //
  14. // Digital 3: Audio out (Digital 11 on ATmega8)
  15. //
  16. // Changelog:
  17. // 19 Nov 2008: Added support for ATmega8 boards
  18. // 21 Mar 2009: Added support for ATmega328 boards
  19. // 7 Apr 2009: Fixed interrupt vector for ATmega328 boards
  20. // 8 Apr 2009: Added support for ATmega1280 boards (Arduino Mega)

  21. #include <avr/io.h>
  22. #include <avr/interrupt.h>

  23. uint16_t syncPhaseAcc;
  24. uint16_t syncPhaseInc;
  25. uint16_t grainPhaseAcc;
  26. uint16_t grainPhaseInc;
  27. uint16_t grainAmp;
  28. uint8_t grainDecay;
  29. uint16_t grain2PhaseAcc;
  30. uint16_t grain2PhaseInc;
  31. uint16_t grain2Amp;
  32. uint8_t grain2Decay;

  33. // Map Analogue channels
  34. #define SYNC_CONTROL         (4)
  35. #define GRAIN_FREQ_CONTROL   (0)
  36. #define GRAIN_DECAY_CONTROL  (2)
  37. #define GRAIN2_FREQ_CONTROL  (3)
  38. #define GRAIN2_DECAY_CONTROL (1)


  39. // Changing these will also requires rewriting audioOn()

  40. #if defined(__AVR_ATmega8__)
  41. //
  42. // On old ATmega8 boards.
  43. //    Output is on pin 11
  44. //
  45. #define LED_PIN       13
  46. #define LED_PORT      PORTB
  47. #define LED_BIT       5
  48. #define PWM_PIN       11
  49. #define PWM_VALUE     OCR2
  50. #define PWM_INTERRUPT TIMER2_OVF_vect
  51. #elif defined(__AVR_ATmega1280__)
  52. //
  53. // On the Arduino Mega
  54. //    Output is on pin 3
  55. //
  56. #define LED_PIN       13
  57. #define LED_PORT      PORTB
  58. #define LED_BIT       7
  59. #define PWM_PIN       3
  60. #define PWM_VALUE     OCR3C
  61. #define PWM_INTERRUPT TIMER3_OVF_vect
  62. #else
  63. //
  64. // For modern ATmega168 and ATmega328 boards
  65. //    Output is on pin 3
  66. //
  67. #define PWM_PIN       3
  68. #define PWM_VALUE     OCR2B
  69. #define LED_PIN       13
  70. #define LED_PORT      PORTB
  71. #define LED_BIT       5
  72. #define PWM_INTERRUPT TIMER2_OVF_vect
  73. #endif

  74. // Smooth logarithmic mapping
  75. //
  76. uint16_t antilogTable[] = {
  77.   64830,64132,63441,62757,62081,61413,60751,60097,59449,58809,58176,57549,56929,56316,55709,55109,
  78.   54515,53928,53347,52773,52204,51642,51085,50535,49991,49452,48920,48393,47871,47356,46846,46341,
  79.   45842,45348,44859,44376,43898,43425,42958,42495,42037,41584,41136,40693,40255,39821,39392,38968,
  80.   38548,38133,37722,37316,36914,36516,36123,35734,35349,34968,34591,34219,33850,33486,33125,32768
  81. };
  82. uint16_t mapPhaseInc(uint16_t input) {
  83.   return (antilogTable[input & 0x3f]) >> (input >> 6);
  84. }

  85. // Stepped chromatic mapping
  86. //
  87. uint16_t midiTable[] = {
  88.   17,18,19,20,22,23,24,26,27,29,31,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73,
  89.   77,82,86,92,97,103,109,115,122,129,137,145,154,163,173,183,194,206,218,231,
  90.   244,259,274,291,308,326,346,366,388,411,435,461,489,518,549,581,616,652,691,
  91.   732,776,822,871,923,978,1036,1097,1163,1232,1305,1383,1465,1552,1644,1742,
  92.   1845,1955,2071,2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143,
  93.   4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286,8779,9301,9854,
  94.   10440,11060,11718,12415,13153,13935,14764,15642,16572,17557,18601,19708,20879,
  95.   22121,23436,24830,26306
  96. };
  97. uint16_t mapMidi(uint16_t input) {
  98.   return (midiTable[(1023-input) >> 3]);
  99. }

  100. // Stepped Pentatonic mapping
  101. //
  102. uint16_t pentatonicTable[54] = {
  103.   0,19,22,26,29,32,38,43,51,58,65,77,86,103,115,129,154,173,206,231,259,308,346,
  104.   411,461,518,616,691,822,923,1036,1232,1383,1644,1845,2071,2463,2765,3288,
  105.   3691,4143,4927,5530,6577,7382,8286,9854,11060,13153,14764,16572,19708,22121,26306
  106. };

  107. uint16_t mapPentatonic(uint16_t input) {
  108.   uint8_t value = (1023-input) / (1024/53);
  109.   return (pentatonicTable[value]);
  110. }


  111. void audioOn() {
  112. #if defined(__AVR_ATmega8__)
  113.   // ATmega8 has different registers
  114.   TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20);
  115.   TIMSK = _BV(TOIE2);
  116. #elif defined(__AVR_ATmega1280__)
  117.   TCCR3A = _BV(COM3C1) | _BV(WGM30);
  118.   TCCR3B = _BV(CS30);
  119.   TIMSK3 = _BV(TOIE3);
  120. #else
  121.   // Set up PWM to 31.25kHz, phase accurate
  122.   TCCR2A = _BV(COM2B1) | _BV(WGM20);
  123.   TCCR2B = _BV(CS20);
  124.   TIMSK2 = _BV(TOIE2);
  125. #endif
  126. }


  127. void setup() {
  128.   pinMode(PWM_PIN,OUTPUT);
  129.   audioOn();
  130.   pinMode(LED_PIN,OUTPUT);
  131. }

  132. void loop() {
  133.   // The loop is pretty simple - it just updates the parameters for the oscillators.
  134.   //
  135.   // Avoid using any functions that make extensive use of interrupts, or turn interrupts off.
  136.   // They will cause clicks and poops in the audio.

  137.   // Smooth frequency mapping
  138.   //syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;

  139.   // Stepped mapping to MIDI notes: C, Db, D, Eb, E, F...
  140.   //syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));

  141.   // Stepped pentatonic mapping: D, E, G, A, B
  142.   syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));

  143.   grainPhaseInc  = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2;
  144.   grainDecay     = analogRead(GRAIN_DECAY_CONTROL) / 8;
  145.   grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2;
  146.   grain2Decay    = analogRead(GRAIN2_DECAY_CONTROL) / 4;
  147. }

  148. SIGNAL(PWM_INTERRUPT)
  149. {
  150.   uint8_t value;
  151.   uint16_t output;

  152.   syncPhaseAcc += syncPhaseInc;
  153.   if (syncPhaseAcc < syncPhaseInc) {
  154.     // Time to start the next grain
  155.     grainPhaseAcc = 0;
  156.     grainAmp = 0x7fff;
  157.     grain2PhaseAcc = 0;
  158.     grain2Amp = 0x7fff;
  159.     LED_PORT ^= 1 << LED_BIT; // Faster than using digitalWrite
  160.   }

  161.   // Increment the phase of the grain oscillators
  162.   grainPhaseAcc += grainPhaseInc;
  163.   grain2PhaseAcc += grain2PhaseInc;

  164.   // Convert phase into a triangle wave
  165.   value = (grainPhaseAcc >> 7) & 0xff;
  166.   if (grainPhaseAcc & 0x8000) value = ~value;
  167.   // Multiply by current grain amplitude to get sample
  168.   output = value * (grainAmp >> 8);

  169.   // Repeat for second grain
  170.   value = (grain2PhaseAcc >> 7) & 0xff;
  171.   if (grain2PhaseAcc & 0x8000) value = ~value;
  172.   output += value * (grain2Amp >> 8);

  173.   // Make the grain amplitudes decay by a factor every sample (exponential decay)
  174.   grainAmp -= (grainAmp >> 8) * grainDecay;
  175.   grain2Amp -= (grain2Amp >> 8) * grain2Decay;

  176.   // Scale output to the available range, clipping if necessary
  177.   output >>= 9;
  178.   if (output > 255) output = 255;

  179.   // Output to PWM (this is faster than using analogWrite)  
  180.   PWM_VALUE = output;
  181. }
复制代码
硬件接法如下图:

最后附上我录制的视频,可以去听听声音,我感觉还行~哈哈,视频中的音箱也是自己做的哦,3寸的全频迷宫式音箱,听人声杠杠的!
http://v.youku.com/v_show/id_XNjQzNzYzMTUy.html


[ 本帖最后由 tanzhaoran 于 2013-12-6 17:34 编辑 ]

最新回复

请问怎么接线?  详情 回复 发表于 2017-5-24 19:42

点评

难道楼主就是传说中的搓盘手......:sexy:  详情 回复 发表于 2013-12-6 14:20

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

9

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

只能再Uno上面跑

因为程序中使用了一些avr-gcc的语句(应该是为了追求效率),所以这个程序只能在Uno板子上跑,Leonardo是无法跑这程序的!
 
 

回复

553

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
知道我是谁吧?加你了^_^
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

4
 
Arduino板子还能做这个呢?厉害厉害。就是不知道声音合成算法这块难不。我一直搞不懂声音这部分,估计是因为缺少音乐细胞。
 
 
 

回复

447

帖子

30

TA的资源

五彩晶圆(初级)

5
 

回复 楼主tanzhaoran 的帖子

难道楼主就是传说中的搓盘手......

点评

唉,过年回家肯定被老妈逼着搓盘子的。。。洗碗。。。:funk:  详情 回复 发表于 2013-12-6 17:20
个人签名www.ctdisk.com/u/1283024
个人书库,持续更新中。
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

6
 
唉,过年回家肯定被老妈逼着搓盘子的。。。洗碗。。。
原帖由 osoon2008 于 2013-12-6 14:20 发表
难道楼主就是传说中的搓盘手......

点评

不是哦, 我说的是DJ搓盘  详情 回复 发表于 2013-12-7 08:35
 
 
 

回复

60

帖子

0

TA的资源

纯净的硅(初级)

7
 
这个给力。。呵呵
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

8
 
是单纯的各种频率的声音信号的叠加吗?这个算法的具体过程,楼主清楚不?
 
 
 

回复

447

帖子

30

TA的资源

五彩晶圆(初级)

9
 

回复 6楼tanzhaoran 的帖子

不是哦, 我说的是DJ搓盘
个人签名www.ctdisk.com/u/1283024
个人书库,持续更新中。
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

10
 
赞一个,支持亲历亲为
个人签名《MCU工程师炼成记》作者之一
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

11
 
虽然不太懂,先收下了~
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(初级)

12
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
请问怎么接线?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表