Processing

Processing:算法(下)

6.2.4. 雨滴 可以分为如下步骤: 1)一个运动的雨滴 2)一个雨滴对象的数组 3)随机数量的雨滴(每次显示一滴) 4)优化雨滴外形 1)比较简单(先用个简单的圆形代替) float x,y; // 雨滴位置变量 void setup() { size(400,400); background(0); x = width/2; y = 0; } void draw() { background(255); // 显示雨滴 fill(50,100,150); noStroke(); ellipse(x,y,16,16); // 移动雨滴 y++ ; } 再次,我们需要通过将雨滴做成类,而得到一个关于雨滴类的数组,以实现很多雨滴。我们可以为其增加诸如速度或大小等变量,同时还可以加入一个测试雨滴是否滴到地面的函数。 class…

Processing:算法(上)

1. 回顾之前的学习。以Zoog为例,他教会了我们用p5自带库绘制基础的形状。从那开始,Zoog升级为可以与鼠标互动,通过变量自动移动,运用条件式变化方向,用循环扩展他的身体,通过函数组织他的代码,将他的数据和功能封装进入一个对象,最后通过数组复制他自己。学到现在,我们应该停下来一会,想想我们学到的然后如何使用它们得到我们想要的结果。我们的想法是什么?变量、条件式、循环、函数、对象和数组,它们能如何来帮助我们? 2. 在之前的学习中,我们把所有精力集中在“一种特性”的编程例子上。Zoog可以并且只会抖动。Zoog不会忽然开始跳起来,并且Zoog通常都是一个人,从不在路上与其他外星生物互动。当然,我们可以将之前那些例子带向更远,但现在更重要的是,抓住基本的机能(functionality),只有这样我们才能真正学到基本原理(fundamentals)。 3. 本课我们的目标主要是示范一个大型的项目如何由许多“单一特性”的小程序构成。你,程序员,应当从全局出发,但必须学会如何将它打散为不同独立的部分以成功执行你的预期。 3.1. 我们的步骤 1)想法——从一个想法开始。 2)部分——将这个想法打散为小块。 a. 算法伪码——以伪码的形式日出各个部分的算法 b. 算法代码——用代码执行算法。 c. 对象——将与这个算法有关的数据和功能建入一个类。 3)整合——将第二步得到的所有类整合为一个更大的算法。 4. 一个算法就是一个解决问题的程序或公式。在计算机编程中,一个算法就是要求执行一项任务的步骤。我们之前所有的例子都包括一个算法。 5. 通常意义上,编程被认为按以下的程序运作:1)发展一个想法,2)设计出一套实现这个想法的算法,3)写出实现那个算法的代码。再细分的话,编程的程序就是:1)发展一个想法,2)将那个想法分解为多个更小的可管理的部分,3)为每个部分设计出算法,4)为每个部分写代码,5)为所有部分一同设计出算法,6)整合各部分的代码。

Minim:控制器

[ javadoc | 范例 ] 像之前的章节里提到的,JavaSound使用Line在你的系统和程序间传递音频。每条线路都可以通过它进行声相、平衡、增益和音量调节。优点是你无须在你的合成类里执行以上的控制,但缺点是在回放音频时,只有当你的软件接到采样后这些控制才会起作用。这意味着你在播放一个立体声音频时,即使将平衡调至极右,你也不会在你的采样中看到任何差别。换句话说,当你以为左声道的值为0的时候,它仍将保存原始音频文件左声道内的一起实际存在的东西。另外,在监听音频输入的时候,设置一个控制将被反映入采样缓冲器中,因为它将在你的软件收到音频之前起效。 打印控制 并非所有控制在所有线路上都可用。你可以使用方法printControls打印出一个控制器上可用的控制,同时包括那些控制的范围。 示范代码(在线范例) import ddf.minim.*; Minim minim; AudioOutput out; void setup() { size(512, 200); minim = new Minim(this); out = minim.getLineOut(); out.printControls(); } void draw() { background(0); } void stop() { // 日完记得关闭Minim音频类 out.close();…

Minim:AudioSource(音源)

[ javadoc | 范例 ] AudioSource定义了三个AudioBuffer成员,同时也可执行Recordable和Effectable界面。你无法直接创建一个AudioSource,它仅仅是为AudioPlayer, AudioSample, AudioOuput和AudioInput提供普通功能而存在。 采样缓冲器 三个采样缓冲器被命名为left, right和mix。它们持续更新左通道,右通道及左右混合声道的音源。即使在播放单声道音频时,三个通道都是可用的并且包含同样的采样。每个采样缓冲器都是一个AudioBuffer对象。 AudioBuffer: Get和Size 两个你在AudioBuffer中使用最频繁的方法是get(int i)和size()。方法size返回缓冲器的长度。方法get返回采样缓冲器第i个采样的浮点值,这个值将会在-1~1的范围内。因此,这常被认为是一个标准化的浮点采样。一个采样即对一个音源在某一时刻的振幅测量值。要听见一个声音,振幅必须时刻处于变化。最简单的变化辨识方波(square wave)。方法get并不做任何范围检查。因此,如果你询问一个位置小于零或大等于size返回值的采样,你将会得到一个ArrayOutOfBounds的错误。下例示范了如何使用get和size来为一个音频信号绘制波形。 范例(在线看) import ddf.minim.*; Minim minim; AudioPlayer groove; void setup() { size(512, 200, P3D); minim = new Minim(this); groove = minim.loadFile(“groove.mp3”); groove.loop(); } void draw()…

Minim:层级

Minim主要基于两个类建立:Controller 和 AudioSource,并由四个interface(界面)定义:Playable, Effectable, Polyphonic, 和 Recordable。在Java中,一个界面被定义为一个仅含函数定义的类。即,它仅含有一堆功能而并不实际执行其中任一。 在JavaSound里,当一个音频在你的系统和软件间传送时,他都会经过一条Line(线),这是JavaSound API里定义的一个界面。一条线可以控制例如声相、音量和平衡等,这些控制可以实时改变声音。你可以经由基础类Controller、AudioSnippet以及源自Controller的AudioSource来获取这些控制。 AudioSource定义了三个AudioBuffer:left, right, 和 mix。这三个采样缓冲器(一个采样缓冲器就是一个浮动数组)包含左通道、右通道和左右混合通道。AudioPlayer, AudioOutput, AudioInput, 和 AudioSample都来自AudioSource,这意味着它们都像数据成员般继承这些缓冲器,同时意味着它们都能提供进入采样的通路。 AudioSource同样执行四个界面中的两个:Recordable(可录制) 和 Effectable(可加效果)。因此,上述四个来自AudioSource的类同样可以Recordable 和 Effectable。 最后,因为方法遗传的层叠性,这四个来自AudioSource的类同样继承Controller。这么想,比如说:AudioPlayer是一个AudioSource同时也是一个Controller。因此,你能用AudioSource或Controller做的所有事,同样可以用AudioPlayer来完成。

Minim:Minim

[ javadoc | 范例 ] Minim是你正在阅读的音频库的名字。Minim是在能提供一堆方法(method)给你获取系统音频资源的库里的一个类。要使用它,你必须在setup()之前申明一个Minm的变量,而后例示一个Minim对象。为了使Minm能够辨识一些东西并能够进入你sketch的data文件夹,你必须这么做。 示范代码 import ddf.minim.*; Minim minim; void setup() { size(100, 100); minim = new Minim(this); } void draw() { } 获取Minim的音频资源 你可以用Minim做四件事:播放一个音频文件,播放合成音频,监听音频输入,向硬盘内录制音频。所有这些都是由库内不同的类操作的,这些类的范例通过呼叫Minim适当的方法而获得。 载入一个音频文件 有三个不同的类可用来播放一个音频文件,每种都用来配合特定的回放类型。接下来的课程会详尽的讲解每个类,现在你只需要知道他们是:AudioSnippet, AudioSample, 和 AudioPlayer。你通过呼叫如下Minim方法创建它们: loadSnippet(String filename) loadSample(String filename) loadSample(String filename, int bufferSize)…