设为首页收藏本站

[应用教程] party神器~Processing&Arduino音乐LED

AdaZhao 发表于 2016-1-14 19:20:58 | 显示全部楼层 [复制链接]
33 4899
本帖最后由 AdaZhao 于 2016-1-15 13:37 编辑

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


一定要开声音!先来看一下效果吧(结尾有彩蛋)~如果在黑暗环境里效果会更好,然而我并不能把办公室的灯全关了> <
http://v.qq.com/page/f/4/7/f01809ckb47.html



这个效果主要是依靠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, 下载次数: 72)

libraries.rar

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

发表于 2016-1-14 22:51:26 | 显示全部楼层
沙发  
回复 支持 反对

使用道具 举报

发表于 2016-1-15 12:10:04 | 显示全部楼层
恩,这个有点意思啊
回复 支持 反对

使用道具 举报

发表于 2016-1-15 17:05:06 | 显示全部楼层
有什么彩蛋?
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:08:13 | 显示全部楼层
效果很好,不过自己感觉已经过了迷恋这种闪光的年纪,所有不知道实际有什么用途
回复 支持 反对

使用道具 举报

发表于 2016-1-16 07:13:59 | 显示全部楼层
我看到拍照的是个妹子。哈哈
回复 支持 反对

使用道具 举报

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

没有用就是最有用,哈哈
回复 支持 反对

使用道具 举报

发表于 2016-1-17 19:20:06 | 显示全部楼层
这个灯光效果很不错
回复 支持 反对

使用道具 举报

发表于 2016-1-17 23:27:13 | 显示全部楼层
马上拿下
回复 支持 反对

使用道具 举报

发表于 2016-1-18 10:01:47 | 显示全部楼层
效果好赞,圆盘的led灯带与音乐结合呈现的效果别有一番趣味
回复 支持 反对

使用道具 举报

发表于 2016-1-18 11:44:31 | 显示全部楼层
圆盘的led环形灯带哪里有售?
回复 支持 反对

使用道具 举报

发表于 2016-1-19 16:33:01 | 显示全部楼层
赞一个,我已成功移植到灯带上,效果也不错哦
回复 支持 反对

使用道具 举报

发表于 2016-1-20 10:49:39 | 显示全部楼层
maker_王 发表于 2016-1-19 16:33
赞一个,我已成功移植到灯带上,效果也不错哦

棒 求效果图~
回复 支持 反对

使用道具 举报

发表于 2016-1-20 10:50:58 | 显示全部楼层

洗脑神曲啊。。。之前在电梯里放了那个视频,出了电梯就有人开始唱歌了
回复 支持 反对

使用道具 举报

发表于 2016-1-20 14:45:42 | 显示全部楼层
AdaZhao 发表于 2016-1-20 10:50
洗脑神曲啊。。。之前在电梯里放了那个视频,出了电梯就有人开始唱歌了 ...

我在办公室看视频都没敢开声音
回复 支持 反对

使用道具 举报

发表于 2016-1-20 17:11:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-1-24 14:45:17 | 显示全部楼层
请问压缩包里的文件相对应放哪
回复 支持 反对

使用道具 举报

发表于 2016-1-25 15:25:19 | 显示全部楼层
这个好赞!!!!被最后的歌洗脑了
回复 支持 反对

使用道具 举报

发表于 2016-1-27 22:20:39 | 显示全部楼层
nxcosa 发表于 2016-1-25 15:25
这个好赞!!!!被最后的歌洗脑了

啊 对的 就是要这个效果hhh
回复 支持 反对

使用道具 举报

发表于 2016-1-27 22:21:30 | 显示全部楼层
yokovs123tian 发表于 2016-1-24 14:45
请问压缩包里的文件相对应放哪

是libraries压缩包里吗?要放在arduino-libraries里,如果arduino里面没有libraries的文件夹自己创建一个就好
回复 支持 反对

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则 允许回帖同步到新浪微博  

  • 初级技师
  • 296
  • 3

楼主的其它帖子

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表