首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多节拍/节拍js DAW

多节拍/节拍js DAW
EN

Stack Overflow用户
提问于 2014-03-02 05:10:24
回答 2查看 462关注 0票数 0

有没有人像大多数桌面DAW (pro工具、声纳等)那样实现了具有多节拍和节拍改变功能的javascript音频DAW?据我所知,clawopenDAWweb audio editor不会这样做。当节拍和节拍在项目中不变时,绘制网格计量器,在样本和MBT时间之间转换,以及渲染波形都很容易,但当他们这样做时,就会变得相当复杂。我正在寻找任何关于如何完成这样的事情的信息。我知道Audacity的源代码是可用的,但我希望不必在一种我不是专家的语言中挖掘大量代码来弄清楚这一点。

EN

回答 2

Stack Overflow用户

发布于 2014-09-05 02:16:42

存在基于web的DAW解决方案。基于web的DAW被视为SaaS(软件即服务)应用程序。它们是轻量级的,包含基本的DAW功能。为了设计富客户端应用程序(RCA),您应该看看GWT和Vaadin。

我推荐GWT,因为它很成熟,具有可重用的组件,而且它也是由AJAX驱动的。此外,在musicradar网站上,他们列出了九种不同的基于浏览器的音频,workstations.you也可以参考popcorn maker,它完全是javascript,code.You可以从那里获得一些灵感来开始使用。

票数 1
EN

Stack Overflow用户

发布于 2014-03-02 11:08:27

你错过了最后一步,这将使它变得更容易。

所有的测量都是相对于分钟的分数,基于时间签名和节奏。

现在,数学变得有点复杂了,因为你不能简单地绘制4/4或6/8并完成它,但你看到的是运行一条实际的时间线(无论是否在屏幕上绘制),然后根据轨迹当前长度的运行总和(以分钟/秒为单位)或基于最左边的take的x坐标(起点)+持续时间来计算每个度量的起点和终点。

或者基于每个测量的总长度(以秒为单位),直到您关心的当前节拍。

代码语言:javascript
复制
var measure = { beats : 4, denomination : 4, tempo : 80 };

给定这三个数据点,您应该能够说:

代码语言:javascript
复制
var measure_length = SECONDS_PER_MINUTE / measure.tempo * measure.beats;

当然,这目前是以秒为单位的。要以毫秒为单位,您只需使用MS_PER_MINUTE,或您想要测量的任何其他分钟比率。

代码语言:javascript
复制
current_position + measure_length === start_of_next_measure;

现在,您已经分离出允许动态计算每个度量所需的每个维度。

在轨道上定位每个度量,以匹配它在时间轴上的位置,就像保持X在ms中的位置(度量的左边缘)一样简单(实际上是在屏幕空间和投影坐标中,但ms现在可以很好地工作)。

代码语言:javascript
复制
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,您只需在音频缓冲区(或音频缓冲区的视图缓冲区)中设置视图的开始时间和持续时间属性。

这些视图将是非破坏性的窗口,您可以调整大小并在轨迹周围拖动。

然后就是找出快照的逻辑--你的屏幕空间是什么,而不是项目空间,当你点击一个音轨的剪辑,等等,你就进入了,在调整大小/移动时进行音频捕捉。

当然,在浏览器中用JS 1:1重现ProTools是行不通的(在一个浏览器选项卡上占用大量内存是不行的,媒体捕获应用编程接口仍然不足以进行多跟踪,在浏览器中写入磁盘比在C++中、在您选择的操作系统中等等要困难得多),但这至少应该给您足够的运行空间。

如果我遗漏了什么让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22120417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档