Music and Processing

差不多半年前,我就在processing平台上完成了一次十分粗略的音乐可视化。所以这次,在对Processing已经有了一定的了解之后的我,再次选择了踏上这条不归路。
不过,今时不同往日。这次,我先去学习了一些乐理相关的知识,并在掌握了一些知识之后才选择动手去实现程序。(但其实我学到的也仅仅是些皮毛,上面的链接是真的大佬写的干货。)

以上,简答说来就是对于同一八度而言,其音程分为12段,各个段的比为2的12次方根;然后每个八度相同的音或半音又是2倍关系。
OK,现在我们简单的掌握了一些十二平均律的相关知识,然后就要去寻找实现的方法了。而对于音频,最好的处理方法莫过于傅里叶变换。然而自己实现确实相对困难,好在Processing提供了相关的库——minim库。

初抚瑶琴谱新曲

通过minim库所包含的AudioPlayer类,可以达成提取音频的步骤,之后通过FFT类就可以对提取到的音频进行傅里叶变换,就可以获取在我们所规定的采样率下所获得的波谱频率。然后根据十二平均律的原理,对获得的频率进行处理,就可以得到想要的节奏了。

效果如下:有一种 launchpad 的感觉



这里bgm——MEGALOBOX,是我特意选取的一个节奏感极强的音乐,可以看出其节奏感还是有所体现的。(并且,根据本人实际测验,这种方法达到的效果会比minim库自带函数isKick() ,检测节奏的效果要好很多。)另外,还可以尝试使用这首BGM——The Diva Dance 音准很稳,可以看到明显的音阶。

ps:这里,我觉得是完全可以做成类似launchpad效果的作品的,点击特定地点产生指定频率的声音,minim库是有这种函数的。所以有兴趣的可以进行拓展,h65y。

主要代码如下:

String spe_area(){String result="";int n=0;float s=0;if(volumn>20){fft.forward(mus.left);for(int f=0; f<mus.sampleRate()/2; f++){max[f] = fft.getFreq(float(f));}max_freq=max(max);for (int i=0; i<max.length; i++){if(max[i]==max_freq){s=i-s;n+=1;}if(n==3){break;}}}if(s>55){float tem = s / 55;float y = log(tem) / log(2);float x = (log(s/(55*pow(2,int(y))))/log(2)*12);result=Float.valueOf(x).toString()+" "+Float.valueOf(y).toString();}return result;
}

复得易水赋英雄

得到了每首歌曲的节奏,之后就可以对这些数据进行处理和一些逻辑上的判定。就能获得一个简易版本的音游了。
效果如下:
哈哈哈,有些蠢,界面有点丑,操作的话就是a s d j k l对应相应的区域,或者脸滚键盘就行。

而且既然主题是Avengers吗,肯定会有情怀向的彩蛋啦!
彩蛋一(失败时)、

彩蛋二(成功时)、

彩蛋三 on your left

效果就像以上,下面来谈一谈实现原理。
首先是向上移动的彩色圆圈 无限宝石,是通过一个粒子类来实现,根据音乐节奏来刷新出生地点;并且当其达到无限手套宝石所在处则移除,切life值减1;当键盘产生事件则把对应的粒子从ArrayList中移除。

部分实现代码

for(Particle p : particles){p.run();} for (int i=0; i<particles.size(); i++){if(particles.get(i).life == false){life = life - particles.get(i).yin_gao;particles.remove(i);i--;}}}
if(key == 'a'){for(int i=0; i<particles.size(); i++){int yin_cheng =1;if(particles.get(i).yin_cheng == yin_cheng){particles.remove(i);break;}}}

部分Particle代码

class Particle{Particle(int yin_cheng, int yin_gao){float x = stone_x[yin_cheng-1];pos = new PVector(x,height);life = true;this.yin_gao = yin_gao;this.yin_cheng = yin_cheng;}void is_in(){float y = stone_y[yin_cheng-1];if(pos.y < y){life = false;}}void show(){pos.y = pos.y - 15;noStroke();int h = H[yin_cheng-1];int s = S[yin_cheng-1];int b = B[yin_cheng-1];fill(h,s,b);ellipse(pos.x,pos.y,12*pow(yin_gao,1/2),12*pow(yin_gao,1/2));}void run(){show();is_in();}
}

然后是彩蛋视频,但是实话说这并不是视频,而是序列帧动画,因为Processing自带的video库很不友好,仅支持mov格式视频播放,所以即使我通过各种方法转码视频都播放不了。因此,最终我选择了序列帧+MP3配音的方法。好在以上两样资源,都可以在AE+AME中很方便的进行获取。不过这样可能导致的后果就是会产生音画不同步的瑕疵。(但基本看不出来)

部分代码

       String ii = String.valueOf(index);String t="";if (ii.length()==1){ t="00";}if (ii.length()==2){ t ="0";}String name = "data" + "/" + "1"+"/"+"1" +t+ii+".png";fail_pic = loadImage(name);image(fail_pic,60,250,420,360);index+=5;fail.play();if(index >= 196){ dust_start = true;index=0;}}

最后就是灰尘的粒子效果,两种粒子图都是我先在ae中进行抠图设计 ,然后在导入matlab中进行数据处理,最后导进Processing中,使粒子系统在特定位置生成特定图案。所以当达成某种条件时,就产生哪种粒子就ok了。
Particle2中部分方法

void wind(){if(dust){float angle = random(0,PI/2);pos.x = pos.x + 5*cos(angle);pos.y = pos.y - 5*sin(angle);}else{ if( (135+300-pos.y)/(480+30-pos.x)<tan(PI/2.001) && (135+300-pos.y)/(480+30-pos.x)>tan(PI/n)){float angle = random(PI/6,PI/3);pos.x = pos.x + random(-1,10)*5*cos(angle);pos.y = pos.y + random(-1,10)*5*sin(angle);dust = true;}}}void is_life(){if(pos.x>width || pos.y<0){life = false;}}

当然还有两个功能,start 和 restart 功能,比较简单就不展开了。

完美谢幕

实话说,并不能算完美。因为还有一下几点是可以进行优化的:一、字体 比如life、start和restart的字体描述,是可以在ae中去美化下的;二、无限宝石 其实是可以用真正的图片来替代的;三、游戏的逻辑问题,导致实际操作起来过于简单,而且也失去了我原本对乐理进行研究所实现的节奏检测的初心。前两点主要是因为懒(233,最后一点还是需要好好思考下游戏逻辑该怎么展开比较好。
所以这完美谢幕仅是对复联四的,哈哈哈。

最后,在心里默默祈祷下不会收到迪斯尼的律师函(溜了!

参考文献

《代码本色》

Processing——A Music Game for the Avengers相关推荐

  1. DPU(Data Processing Unit)数据处理器

    DPU(Data Processing Unit)数据处理器 DPU:5G边缘云 5G时代带来通信带宽的巨大提升,更多的带宽使能更多的应用.数据量的迅猛增多,服务器网络带宽的快速增长,都已经远超计算能 ...

  2. 视频处理单元Video Processing Unit

    视频处理单元Video Processing Unit VPU处理全局视频处理,它包括时钟门.块复位线和电源域的管理. 缺少什么: •完全重置整个视频处理硬件块 •VPU时钟的缩放和设置 •总线时钟门 ...

  3. Spring Boot项目错误:Error parsing lifecycle processing instructions

    pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...

  4. IEEE signal processing letters 投稿经验

    转自:http://emuch.net/t.php?tid=6226942 前段时间比较幸运地中了一篇spl,把自己浅薄的经验写出来,直接从自己博客上转过来,分享给大家,望抛砖引玉吧~~~ 从投稿到录 ...

  5. rewrite or internal redirection cycle while processing nginx重定向报错

    2018/05/07 15:03:42 [error] 762#0: *3 rewrite or internal redirection cycle while processing "/ ...

  6. Stream Processing:滑动窗口的聚集(aggregation)操作的优化算法讲解

    本文将要讲解流处理中滑动窗口聚集操作的相关优化算法.将分别从下面几个方面讲解: 什么是滑动窗口? 什么是滑动窗口的聚集操作? 聚集操作的优化的必要性在哪里? 有哪些优化算法,它们的原理分别是什么? 4 ...

  7. Stream Processing:Apache Flink快照(snapshot)原理

    本文将要讲解的是Apache Flink分布式流处理的轻量异步的快照原理.网上已经有几篇相关的博文,而本文的不同之处在于,它不是论文的纯粹翻译(论文地址),而是用自己的语言结合自己的理解对其原理的阐述 ...

  8. Stream Processing: S4系统模型分析和关键源码读解

    S4(Simple Scalable Stream System) 流数据处理系统是Yahoo!公司提出的,在2011年的时候成为Apache软件基金下的一个孵化项目,可惜的是在2014年的时候该孵化 ...

  9. Stream Processing: Apache Kafka的Exactly-once的定义 原理和实现

    2018年,Apache Kafka以一种特殊的设计和方法实现了强语义的exactly-once和事务性.热泪盈眶啊! 这篇文章将讲解kafka中exactly-once和事务操作的原理,具体为 (1 ...

最新文章

  1. 32位oracle_Oracle 之Hugepage
  2. shell   %% , ##,#,% 用法
  3. 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七
  4. Linux上如何查看物理CPU个数,核数,线程数
  5. OpenCASCADE:拓扑 API之简介
  6. 用Matlab与c++程序生成的数据文件绘制sin函数
  7. acm教程 java版_ACM之java速成 (转)
  8. 转 c#读写xml文件
  9. pythonista3安卓_Pythonista 3 app下载
  10. Java类集框架 —— LinkedHashMap源码分析
  11. Android SDK安装与环境配置
  12. ALAsset 循环获取图片(Assets Library Framework)
  13. BZOJ1061: [Noi2008]志愿者招募(线性规划)
  14. python抽学号程序_Python 9行代码来随机抽学生回答指定问题
  15. 小学计算机英语,小学英语电脑版
  16. C语言移动营业厅程序设计,c语言实现移动电话系统
  17. android wine教程_如何在 Android 上借助 Wine 来运行 Apps
  18. 专为程序员编写的英语学习指南
  19. flutter 必须掌握的CustomScrollView及Sliver类型控件的几种使用
  20. Mac 下如何添加网段

热门文章

  1. 【k8s admission学习】yaml 部署注意的坑
  2. React中PureComponent和Component异同
  3. 爱莫科技携手华为云 “聚微光,创未来”
  4. iOS最新面试题4【经典】_技术成长笔记_新浪博客
  5. hdu 6825 Set1
  6. C语言double指针如何初始化,C语言指针的初始化以及什么是空指针和void指针
  7. 1.解决部分网页打不开的方法
  8. 中英文地址的写法(转贴)
  9. 2020春招菜鸡面试记录
  10. 【无标题】学生检讨书模板