Phonique —可视的AVAudioEngine编辑器

我为AVAudioEngine编写了可视化编辑器,您可以在此处下载:在App Store上查看

嗨,我是克里斯,几年前,我想开始在iOS上播放音频,那时,直到今天,您仍可以使用CoreAudio和AUGraphs生成音频帧缓冲区,处理数据包并基本上播放音频。

如果您曾经使用过此API,那么您将了解它的强大功能,它很复杂。

都叫AVAudioEngine

我偶然在StackOverflow帖子中找到了AVAudioEngine,它一定是在WWDC上宣布的,但我从未见过。 AVAudioEngine是用于在iOS / macOS / tvOS / watchOS上处理音频的高级API。 它具有非常出色的API,您可以快速启动并运行。
就像我上一篇关于WarpTool的帖子一样,我想走得更快。

需求

我想要一个可以将组件拖到屏幕上,将它们连接在一起并收听输出内容的系统。 我不想写代码来做到这一点。 —但是,当然,我希望我在屏幕上进行视觉设计的任何内容都能为我提供代码,以便可以在真实的应用程序中使用它。

该应用程序的第一个版本根本不起作用,只是我在想我希望它如何工作:

Phonique的最终编辑:

设计进度

快速浏览一下编辑人员在开发过程中的设计进度:

在此版本中,我使用的是基于多个文档的设置,您可以在其中具有多个文档窗口并在不同的图形之间切换。 它没有用,但我不觉得人们会一次打开多个文档。

所以我去了一个文档应用程序,请注意主要设计区域是SpriteKit。

代码生成和可怕的代码突出显示进一步发展!

为什么这个项目是用Objective-C而不是Swift编写的?

我最初是在Swift发行之前就开始在Objective-C上写这篇文章的,后来我顺其自然。 我刚刚检查了一下,该项目有180个提交,但是在移交给源代码管理之前,我估计实际可能有200个提交。

基于插件的架构

该应用程序从插件运行,如果没有插件,它什么也不做,工具选项板上的每个工具都是插件。
每个插件定义了它可以做什么,应该如何在屏幕上绘制,导出了什么代码等。
该应用程序定义了插件必须实现的一组协议,以及一些可选的协议,例如,它是否提供了自己的视图。

一个示例插件结构如下所示:

以这种方式编写应用程序使我可以逐步构建工具。 定义协议还意味着添加新协议很容易

分解文件播放器组件:

PHNQFilePlayer —此类是插件的主要入口点/参考点,它是主体类。
它包含一些常规内容,例如,插件的名称,向检查器提供的属性,如何序列化自身。

PHNQFilePlayerRuntime-运行时是应用在play模式下使用的运行时。 在这里,我初始化AVAudioPlayerNode并设置它的属性。

PHNQFilePlayerView —定义组件在设计区域中的显示方式,即组件的输入和输出位置。

PHNQPositionWrapper —有时我要在检查器中设置的属性没有与该类的一对一映射。 一些插件具有包装器类,以帮助转换值。

PHNQFilePlayerCodegenerator —应该如何生成代码。

Media.xcassets-包含要在工具选项板中使用的图标。

注意 :我将按照惯例使用编码,在此您可以随意调用插件,然后仅添加类应执行的后缀,即:Runtime,View,CodeGenerator,但是在输入错误和验证失败之后在项目的中间,我只是为了与定义的协议一起使用而将其报废。

保存文件

像其他工具一样,一旦创建了某些东西,我希望能够保存它,并在以后再次将其打开,因此FileWrappers再次发挥作用。 这里没有什么花哨的东西,数据保存为JSON,为缩略图拍摄了屏幕截图。

显示文字

在开发该应用程序时,我发现自己正在选择组件,然后将目光转向检查器,以查看屏幕上设置为空白组件的所有内容都没有人使用。
因此,我为每个组件添加了文本,最上面的文本告诉我它是什么类型,以及组件特定细节下方的文本。

连接组件

组件通常具有一个输入和一个输出。 像输出这样的组件只有一个输入。
每个组件都决定了它可以有多少个输入和输出,所以我编写了一个连接器验证器,当您尝试将一个组件连接到另一个组件时,该连接器验证器会运行,记住一些事情,例如,您无法连接到自己,无法将输入连接到另一个输入等

组件类型

波发生器

波形发生器可以产生4种不同类型的波,正弦波,方波,三角波和锯齿波。

代码生成

所有组件组成一个图,我可以生成具有所有设置属性的代码文件。 我想生成代码,因为它是应用程序的主要目标,以视觉方式设计一些东西,然后轻松地将代码发布出去。

代码导出

这是我有点过头的地方,但是为什么不呢?you如果按Export按钮,我将从头开始创建一个完整的工作Xcode项目,其中包括源代码,资源,音频文件和* .xcproj文件(这很可能是另一个博客文章的主题)。
您可以立即运行项目(在编译后)。 我将所有触发器都创建为UIButtons,以便您可以轻按一下即可点击。

应用布局

该应用程序的主要故事板非常简单,左侧是工具面板,中间是splitview,顶部是设计区域,底部是生成器,右侧是检查器。 在完成更多这些操作之后,我应该将中间部分真正分成一个单独的情节提要,这只会使它更容易。

工具面板

选板列出了您拥有的所有插件,它具有一个搜索字段,以便您可以过滤列表,它只是一个集合视图。

检验员

检查器一如既往地对上下文敏感,但是我尝试使该检查器在视觉上更具吸引力,例如,为每个单元格的背景添加渐变,使文本字段带有缩进。

非标准组件扩展

触发器/按钮

我还希望能够在图形运行时触发事件,这意味着添加按钮的概念,该按钮可以动态更改组件的参数。
触发器可以有两种不同的模式:切换或非切换,因此我可以按下触发器并保持打开状态,直到再次按下它。 或者,当我按直到放开时,我也可以激活。

参数LFO(低频振荡器)

我只想添加此组件,因为我认为这很酷。 参数LFO以正弦形式循环。 然后将任何时间点的值映射到选定组件的参数上,以在from和to值之间进行线性插值。

听众

这可能是我添加的最复杂的组件。 您可以认为它们好像if this then that
侦听器不会直接连接到设计窗口上的组件(尽管我可能应该显示它们连接到的组件的某些指示)。
对于每个侦听器,您可以指定要在屏幕上侦听的其他组件的参数,选择该参数后,将显示该对象的可侦听属性。 这是一个例子:

这位听众说:

 如果调音台的输出量小于0.534 
然后
文件播放器的Y位置应设置为-2.1米

您可以想象会造成多大破坏。🙂您可以随心所欲地收听。 这是一个实际的视频

有趣有趣

总览

您可以从以下Mac应用程序商店下载Phonique:在App Store上查看我对这个应用程序感到满意,有时候,即使我没有音频项目,我也会打开它,只是为了玩和创造美好的事物,几乎就像是音频创意的游乐场。

您可以在Twitter或我的个人网站上找到我:www.chrisdavis.com