• 上海合作组织青岛峰会举行 2019-04-20
  • 遭遇隐形歧视 就业权益谁来维护 2019-04-20
  • 杨立新解读2018年天津市《政府工作报告》--天津频道--人民网 2019-04-19
  • 【北京海之沃车型报价】北京海之沃4S店车型价格 2019-04-19
  • 让个体诚信有力推动社会诚信 2019-04-13
  • 习近平会见巴基斯坦总统侯赛因 2019-04-13
  • 罗亦农:“残躯何足惜,大敌正当前” 2019-03-21
  • 由进口至出口再至走向世界,这一路着实不易,其中少不了无数位科研人员的奉献与牺牲。 2019-03-21
  • 查看: 22320|回复: 37
    打印 上一主题 下一主题

    [进阶教程] party神器~Processing&Arduino音乐LED

    [复制链接]
    本帖最后由 AdaZhao 于 2016-1-15 13:37 编辑

    Processing&Arduino音乐LED
    好像大家都陆陆续续开始放假了呢(虽然楼主只有一周就要开学了 泪目),要不要请朋友来家里聚一聚?想不想让聚会更加高大上?今天这个音乐LED可以随着电脑播放的歌曲闪烁,让你的party更加炫酷,只需一个按键就可以让你的客厅开启club模式!你还可以通过键盘的空格键、上下按键和退出键实现播放/暂停、切歌以及退出的功能。


    一定要开声音!先来看一下效果吧(结尾有彩蛋)~如果在黑暗环境里效果会更好,然而我并不能把办公室的灯全关了> <



    这个效果主要是依靠processing实现的:利用processing的minim库分析音频,在通过Serial将处理好的数据传给Arduino,Arduino只要负责把收到的数据显示在led上就可以了。下面给大家分步再现一下做这个项目的过程。


    [下载并安装processing]

    “Processing是一种具有革命前瞻性的新兴计算机语言,它的概念是在电子艺术的环境下介绍程序语言,并将电子艺术的概念介绍给程序设计师。它是Java 语言的延伸,并支持许多现有的 Java 语言架构,不过在语法 (syntax) 上简易许多,并具有许多贴心及人性化的设计。Processing 可以在 Windows、MACOS X、MAC OS 9 、Linux 等操作系统上使用。目前最新版本为Processing 3。以 Processing 完成的作品可在个人本机端作用,或以Java Applets 的模式外输至网络上发布?!?——度娘





    [分析音频]

    首先需要下载minim库。processing的库可以直接从编辑器中下载。速写本->引用库文件 -> 添加库文件,搜索minim,下载。

    最基本的代码源自https://github.com/blyk/Music-Visualization/blob/master/MusicViz.pde, 删除了一些我们不需要的数据之后是这样滴,这也是最后视频中电脑界面效果的代码:
    1. import ddf.minim.*;
    2. import ddf.minim.analysis.*;

    3. Minim minim;
    4. AudioPlayer player;
    5. AudioMetaData meta;
    6. BeatDetect beat;
    7. int  r = 200;
    8. void setup()
    9. {
    10.   size(displayWidth, displayHeight);
    11.   minim = new Minim(this);
    12.   //change the address to your file
    13.   player = minim.loadFile("D:/Cisum/Ragni MMS 2/Baby Doll - Ragini MMS 2 - [SongsPk.CC].mp3");
    14.   meta = player.getMetaData();
    15.   beat = new BeatDetect();
    16.   player.play();
    17.   background(-1);
    18.   noCursor();
    19. }

    20. void draw()
    21. {
    22.   beat.detect(player.mix);
    23.   fill(#1A1F18, 20);
    24.   noStroke();
    25.   rect(0, 0, width, height);
    26.   translate(width/2, height/2);
    27.   noFill();
    28.   fill(-1, 10);
    29.   stroke(-1, 50);
    30.   int bsize = player.bufferSize();
    31.   for (int i = 0; i < bsize - 1; i+=5)
    32.   {
    33.     float x = (r)*cos(i*2*PI/bsize);
    34.     float y = (r)*sin(i*2*PI/bsize);
    35.     float x2 = (r + player.left.get(i)*100)*cos(i*2*PI/bsize);
    36.     float y2 = (r + player.left.get(i)*100)*sin(i*2*PI/bsize);
    37.     line(x, y, x2, y2);
    38.   }
    39.   beginShape();
    40.   noFill();
    41.   stroke(-1, 50);
    42.   for (int i = 0; i < bsize; i+=30)
    43.   {
    44.     float x2 = (r + player.left.get(i)*100)*cos(i*2*PI/bsize);
    45.     float y2 = (r + player.left.get(i)*100)*sin(i*2*PI/bsize);
    46.     vertex(x2, y2);
    47.     pushStyle();
    48.     stroke(-1);
    49.     strokeWeight(2);
    50.     point(x2, y2);
    51.     popStyle();
    52.   }
    53.   endShape();
    54. }
    复制代码


    [处理数据]

    将1024分别按照灯环的LED数量分成12、16、24份,并应用player.left.get()读取缓冲区里的值,这个值是介于-1到1之间,然而在这里我们只需要整数,原因会在下个步骤中详述。
    1. for (int i = 0; i < 12; i++)
    2.   {
    3.     int x = int(players.left.get(i*ring3)*average);
    4.     if (x < 0) x = -x;
    5.     if (x > 100) x = 100;
    6.     rings[i] = x;
    7.   }

    8.   for (int i = 12; i < 28; i++)
    9.   {
    10.     int x = int(players.right.get((i-12)*ring4)*average);
    11.     if (x < 0) x = -x;
    12.     if (x < 40) x = 0;
    13.     else x = x - 40;
    14.     if (x > 100) x = 60;
    15.     rings[i] = x;
    16.   }

    17.   for (int i = 28; i < 52; i++)
    18.   {
    19.     int x = int(players.left.get((i-28)*ring5)*average);
    20.     if (x < 0) x = -x;
    21.     if (x < 90) x = 0;
    22.     else x = x - 90;
    23.     if (x > 100) x = 10;
    24.     rings[i] = x;
    25.   }
    复制代码



    [传给Arduino]

    Processing和arduino的交互主要有两种方法,一种是Serial,一种是Firmata。Firmata更适用于少量数据的交互,更适用于在arduino里没有引用库文件的情况。只需要给arduino烧录standard firmata这个程序,在processing端引用arduino库,就可以直接控制arduino了。而这个音乐led用的是Serial,就是通过串口在processing端用write()输出数据,用read()读取数据。Arduino连接在电脑不同的端口上,StringportName = Serial.list()[0]中的“0”也要根据端口进行变化,可以把整个Serial.list()[]都打印出来找到自己需要的那一个。Serial只可以传整数,所以在上一个步骤中进行了int x =int(players.right.get((i-12)*ring4)*average);取整处理。经过测试发现发出的数据和接收的数据之间有错位的现象所以增加了数列中第53个数:rings[52] = 255;用来矫正。
    1. import processing.serial.*;
    2. Serial myport;
    3. void setup(){
    4. String portName = Serial.list()[0];
    5. myport = new Serial(this, portName, 9600);
    6. }

    7. void draw(){
    8.   rings[52] = 255;
    9.   for (int i = 0; i < 53; i++) {
    10.     myport.write(rings[i]);
    11.   }
    12. }
    复制代码


    [接收并显示数据]
    led.rar (7.2 MB, 下载次数: 125)
    引用三个库用来控制灯环上led的亮度以及颜色,用ring[]来储存接收到的数据,用255/200=1.275用来校准。采用hsb的色彩模式,三个参数分别为色相,饱和度以及亮度,色相在0-360之间渐变,收到的数据用来调整亮度
    1. #include <Adafruit_NeoPixel.h>//the library can be found at https://github.com/adafruit/Adafruit_NeoPixel
    2. #include <DFRobot_utility.h>
    3. #include <Metro.h>

    4. #define PIN3 10
    5. #define PIN4 9
    6. #define PIN5 8

    7. Adafruit_NeoPixel round3 = Adafruit_NeoPixel(12, PIN3, NEO_GRB + NEO_KHZ800);
    8. Adafruit_NeoPixel round4 = Adafruit_NeoPixel(16, PIN4, NEO_GRB + NEO_KHZ800);
    9. Adafruit_NeoPixel round5 = Adafruit_NeoPixel(24, PIN5, NEO_GRB + NEO_KHZ800);

    10. float ring[53];
    11. int color = 0;

    12. void setup() {
    13.   // put your setup code here, to run once:
    14.   Serial.begin(9600);
    15.   round3.begin();
    16.   round4.begin();
    17.   round5.begin();
    18.   for (int j = 0; j < 52; j++) {
    19.     ring[j] = 0;
    20.   }
    21.   round3.show();
    22.   round4.show();
    23.   round5.show();
    24. }

    25. void loop() {
    26.   // put your main code here, to run repeatedly:
    27.   if (Serial.available()) {
    28.     if (color == 360) color = 0;
    29.     static int i = 0;
    30.    
    31.     if (i == 52) i = 0;
    32.    
    33.     ring[i] = Serial.read();
    34.     ring[i] = ring[i]/200;
    35.     if (ring[i] == 1.275) {
    36.       ring[52] = 1.275;
    37.       i = 0;
    38.       return;
    39.     }
    40.     if (i < 12) {
    41.       round3.setPixelColor(i, hsbToColor (color, 1, ring[i]));
    42.     } else if (i < 28) {
    43.       round4.setPixelColor(i - 12, hsbToColor (color, 1, ring[i]));
    44.     } else if (i < 52){
    45.       round5.setPixelColor(i - 28, hsbToColor (color, 1, ring[i]));
    46.     }
    47.     if (i == 12) round3.show();
    48.     if (i == 28) round4.show();
    49.     if (i == 51) {
    50.       round5.show();
    51.       color += 5;
    52.     }
    53.     i ++;
    54.   }
    55. }
    复制代码
    [添加播放器功能,多首歌曲]

    主要是把之前的主要功能提出来,写成一个function,再加上void keyPressed()读取键盘的输入。
    1. AudioPlayer players;
    2. AudioPlayer player;
    3. AudioPlayer player1;
    4. int playernum=0;
    5. void setup(){
    6.   player = minim.loadFile("I Really Like You.mp3", 1024);
    7.   player1 = minim.loadFile("TFBOYS.mp3", 1024);
    8. }
    9. void draw(){
    10.   switch (playernum) {
    11.   case 0:
    12.     drawLED (player);
    13.     break;
    14.   case 1:
    15.     drawLED (player1);
    16.     break;
    17.   }
    18. }

    19. void keyPressed() {
    20.   if (key==ESC) {
    21.     myport.write(255);
    22.     exit();
    23.   }
    24.   if (key == ' ') {
    25.     if (pause) pause = false;
    26.     else pause = true;
    27.   }
    28.   if (key == CODED) {
    29.     if (keyCode == DOWN) {
    30.       pause();
    31.       playernum ++;
    32.     }
    33.     if (keyCode == UP) {
    34.       pause();
    35.       playernum --;
    36.     }
    37.   }
    38. }

    39. void pause() {
    40.   switch (playernum) {
    41.   case 0:
    42.     player.pause();
    43.     break;
    44.   case 1:
    45.     player1.pause();
    46.     break;
    47.   }
    48. }

    49. void drawLED(AudioPlayer players) {
    50. ……
    51. }
    复制代码

    程序都是一部分一部分介绍的,可能会有些小遗落,完整版的在这里:






    libraries.rar

    62.16 KB, 下载次数: 102, 下载积分: 创造力 -1

    推荐

    yokovs123tian  中级技师

    发表于 2016-1-24 14:45:17

    请问压缩包里的文件相对应放哪
    沙发

    大连林海  初级技神

    发表于 2016-1-14 22:51:26

    沙发  
    板凳

    孙毅  版主

    发表于 2016-1-15 12:10:04

    恩,这个有点意思啊
    地板

    dsweiliang  版主

    发表于 2016-1-15 17:05:06

    有什么彩蛋?
    5#

    单品蓝山  高级技匠

    发表于 2016-1-15 21:08:13

    效果很好,不过自己感觉已经过了迷恋这种闪光的年纪,所有不知道实际有什么用途
    6#

    hnyzcj  超级版主

    发表于 2016-1-16 07:13:59

    我看到拍照的是个妹子。哈哈
    7#

    hnyzcj  超级版主

    发表于 2016-1-16 07:14:38

    单品蓝山 发表于 2016-1-15 21:08
    效果很好,不过自己感觉已经过了迷恋这种闪光的年纪,所有不知道实际有什么用途 ...

    没有用就是最有用,哈哈
    8#

    丄帝De咗臂  版主

    发表于 2016-1-17 19:20:06

    这个灯光效果很不错
    9#

    冰儿burning  见习技师

    发表于 2016-1-17 23:27:13

    马上拿下
    10#

    Phoebe  管理员

    发表于 2016-1-18 10:01:47

    效果好赞,圆盘的led灯带与音乐结合呈现的效果别有一番趣味
    11#

    kaka  版主

    发表于 2016-1-18 11:44:31

    圆盘的led环形灯带哪里有售?
    12#

    maker_王  初级技匠

    发表于 2016-1-19 16:33:01

    赞一个,我已成功移植到灯带上,效果也不错哦
    13#

    AdaZhao  初级技师
     楼主|

    发表于 2016-1-20 10:49:39

    maker_王 发表于 2016-1-19 16:33
    赞一个,我已成功移植到灯带上,效果也不错哦

    棒 求效果图~
    14#

    AdaZhao  初级技师
     楼主|

    发表于 2016-1-20 10:50:58


    洗脑神曲啊。。。之前在电梯里放了那个视频,出了电梯就有人开始唱歌了
    15#

    dsweiliang  版主

    发表于 2016-1-20 14:45:42

    AdaZhao 发表于 2016-1-20 10:50
    洗脑神曲啊。。。之前在电梯里放了那个视频,出了电梯就有人开始唱歌了 ...

    我在办公室看视频都没敢开声音
    19#

    nxcosa  中级技师

    发表于 2016-1-25 15:25:19

    这个好赞?。。?!被最后的歌洗脑了
    20#

    AdaZhao  初级技师
     楼主|

    发表于 2016-1-27 22:20:39

    nxcosa 发表于 2016-1-25 15:25
    这个好赞?。。?!被最后的歌洗脑了

    啊 对的 就是要这个效果hhh
    21#

    AdaZhao  初级技师
     楼主|

    发表于 2016-1-27 22:21:30

    yokovs123tian 发表于 2016-1-24 14:45
    请问压缩包里的文件相对应放哪

    是libraries压缩包里吗?要放在arduino-libraries里,如果arduino里面没有libraries的文件夹自己创建一个就好
    12下一页
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    为本项目制作心愿单
    购买心愿单
    心愿单 编辑
    wifi气象站

    硬件清单

    btnicon
    我也要做!
    点击进入购买页面
    上海智位机器人股份有限公司 沪ICP备09038501号-4

    © 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

    浙江6加1开奖结果
  • 上海合作组织青岛峰会举行 2019-04-20
  • 遭遇隐形歧视 就业权益谁来维护 2019-04-20
  • 杨立新解读2018年天津市《政府工作报告》--天津频道--人民网 2019-04-19
  • 【北京海之沃车型报价】北京海之沃4S店车型价格 2019-04-19
  • 让个体诚信有力推动社会诚信 2019-04-13
  • 习近平会见巴基斯坦总统侯赛因 2019-04-13
  • 罗亦农:“残躯何足惜,大敌正当前” 2019-03-21
  • 由进口至出口再至走向世界,这一路着实不易,其中少不了无数位科研人员的奉献与牺牲。 2019-03-21