关于midi音符的统计工具

问题详情

是否存在这样的action或者功能?

对一个items里面所有的midi音符进行列表并排序:

1 统计每两个相连音之间的间隔时间,以秒或者毫秒为计算单位并排序。

2 统计所有音符的时长,以秒或者毫秒为时间单位排序。

3 统计所有音符的力度,并排序。

排序可以从大到小,或者从小到大,或者以时间序列。

自带的event list实现不了这个功能。

做过的尝试

自带的event list实现不了这个功能。

用脚本很容易做到,但是有些好奇是干嘛用的?

哪个daw也没这功能吧。。。没啥用处

写算法音乐的时候,需要知道音符之间的出现规律,而规律需要统计学的一些数据,所以如果有这样的一个工具的话会方便一些。

那估计得你自己写脚本了。

尝试了一下,但是没法用,贴过来大家看看是啥问题?如下:

-- 获取当前项目和轨道
local project = reaper.GetProject()
local tracks = reaper.GetTracks(project)

-- 获取所有的MIDI items
local items = reaper.GetSelectedMediaItems(project)

-- 对items进行遍历
for i, item in ipairs(items) do
    -- 获取MIDI音符
    local regions = reaper.GetMediaItemRegions(item)
    
    -- 对音符进行排序
    table.sort(regions, function(a, b)
        local startA, endA = reaper.GetMediaRegionInfo_Value(a, "R_STARTTIME")
        local startB, endB = reaper.GetMediaRegionInfo_Value(b, "R_STARTTIME")
        return startA < startB
    end)
    
    -- 初始化起始时间和间隔时间列表
    local startTime = regions[1]
    local intervalTime = {}
    
    -- 计算每两个相邻音符之间的间隔时间
    for j = 2, #regions do
        local startTime = reaper.GetMediaRegionInfo_Value(regions[j-1], "R_STARTTIME")
        local endTime = reaper.GetMediaRegionInfo_Value(regions[j], "R_STARTTIME")
        local interval = math.abs(endTime - startTime) * 1000 -- 转换为毫秒
        table.insert(intervalTime, interval)
    end
    
    -- 打印间隔时间列表
    for _, v in ipairs(intervalTime) do
        reaper.ShowConsoleMsg(v .. "\n")
    end
end

能用才怪,这是机器人瞎编的代码吧?红色的全是假的API。 :sweat_smile:

是啊。 :joy:

如果自己不明白脚本每一行的含义,请不要直接使用 AI 提供的代码。

这个答案是正解~!!!