有没有人实现过具有多种节拍和电表更换功能的javascript音频DAW,例如大多数桌面应用程序(专业工具,声纳等)?据我所知,claw,openDAW和web audio editor不这样做。绘制网格仪表,在样本和MBT时间之间进行转换,以及在项目期间速度和仪表没有变化时渲染波形很容易,但是当它们这样做时会变得更加复杂。我正在寻找有关如何完成这样的事情的任何信息。我知道Audacity的来源是可用的,但是我不想用一种我不是专家的语言来挖掘大量的代码来解决这个问题。
答案 0 :(得分:1)
我推荐GWT,因为它已经成熟并且具有可重用的组件,并且还支持AJAX。 同样在musicradar网站,他们列出了九个不同的基于浏览器的音频工作站。您还可以参考popcorn maker这完全是javascript代码。您可以从那里获得一些灵感来开始。
答案 1 :(得分:0)
你错过了最后一步,这将使它变得更容易。
根据时间签名和节奏,所有度量都相对于分数的分数。
数学变得有点复杂,现在你不能只用4/4或6/8绘制并完成它,但你正在看的是运行一个实际的时间线(是否在屏幕上绘制),然后根据轨道当前长度的运行总和(以分钟/秒为单位)或基于最左侧的x坐标(起点)确定每个度量开始和结束的位置)+持续时间......
或基于每个小节的总长度(以秒为单位),直至您关心的当前节拍。
var measure = { beats : 4, denomination : 4, tempo : 80 };
鉴于这三个数据点,您应该能够说:
var measure_length = SECONDS_PER_MINUTE / measure.tempo * measure.beats;
当然,目前只有几秒钟。要在 ms 中获取它,您只需使用MS_PER_MINUTE,或者您想要测量的其他分钟比例。
current_position + measure_length === start_of_next_measure;
您现在已经分离出所需的每个维度,以便您可以动态计算每个度量。
将每个度量定位在轨道上,以便与时间轴上的所在位置相匹配,就像保持X在哪里(度量的左边缘)的运行记录一样简单(实际上在屏幕空间和项目中) -coordinates,但ms现在可以正常工作了。)
var current_position = 0,
current_tempo = 120,
current_beats = 4,
current_denomination = 4,
measures = [ ];
measures.forEach(function (measure) {
if (measure.tempo !== current_tempo) {
/* draw tempo-change, set current_tempo */
/* draw time-signature */
}
if (measure.beats !== current_beats ||
measure.denomination !== current_denomination) {
/* set changes, draw time-signature */
}
draw_measure(measure, current_position);
current_position = MS_PER_MINUTE / measure.beats * measure.tempo;
});
绘制样本只需要确定你从哪里开始,然后坚持一些分辨率(MS / MS * 4 /秒)。
分离计算时间的额外好处是你可以通过改变你所比较的时间尺度(ms / sec / min / etc)来动态改变渲染的分辨率,所以只要你在缩放后重新渲染整个事物。兔子洞更深(例如,实际的音轨并不真正关心测量/节拍,虽然量化过程确实如此),所以要写一个非破坏性的非线性DAW,你可以设置开始 - 视频到音频缓冲区的时间和持续时间属性(或视图到音频缓冲区的视图缓冲区) 这些视图将是非破坏性窗口,您可以调整大小并在轨道上拖动。
然后就是找出快照的逻辑 - 你的屏幕空间是什么,与项目空间相比,当你点击一个轨道的剪辑,你在哪个测量,等等,你做音频 - 捕捉调整大小/移动。
当然,在浏览器中以1:1的方式在JS中重新创建ProTools将无法实现(一个浏览器选项卡的RAM不会发生,媒体捕获API仍然不足以进行多跟踪,磁盘写入在您选择的操作系统中,在浏览器中比在C ++中要困难得多,等等,但这至少应该足以让您运行。
如果我遗失了某些东西,请告诉我。