录音/制作/创作 吉他 扩声技术 视频技术 作品展示 生活 信息 更多... | 音频应用专卖店
REAPER

安利一波REAPER的MIDI编辑功能【新进展】

( 114 )
 
[收藏]
-  第 5 页  -

1408
#61 20-1-20 13:00
再补一刀 发表于 20-1-20 12:12
差很多。随机力度默认1-127之间的数值随机出现,人性化力度是在输入的数字范围内上下随机。

Random Velocity (Limit Range).lua(这个随机力度是可以输入数字范围的啊)

Humanize Velocity.lua(这个人性化力度并没有数字范围的设置啊,他的设置参数我并不能理解,试了几次,好似是数值越大力度的差别越大哇?

798
#62 20-1-20 13:17
汪洋 发表于 20-1-20 13:00
Random Velocity (Limit Range).lua(这个随机力度是可以输入数字范围的啊)

Humanize Velocity.lua( ...

Random Velocity 有两份,一份可以输入范围,一份默认1-127随机。

Humanize Velocity 对话框只要输入一个数字。比如输入3,将会以当前力度为中间值,上下浮动3的范围,加起来随机范围就是6。

1408
#63 20-1-20 19:16
再补一刀 发表于 20-1-20 13:17
Random Velocity 有两份,一份可以输入范围,一份默认1-127随机。

Humanize Velocity 对话框只要输入 ...

好的好的。谢谢谢谢!

798
#64 20-1-26 01:01
20200123 新增脚本:

zaibuyidao_Select Notes By Step.lua -- 步进选择音符


zaibuyidao_Select Control By Step.lua -- 步进选择控制


zaibuyidao_Select Notes By Step.lua 和 zaibuyidao_Select Control By Step.lua 已整合为:
zaibuyidao_Select Event By Step.lua -- 步进选择事件

--

zaibuyidao_Scale Velocity (Enhanced Version).lua -- 力度缩放2合1,复刻Cakewalk的Scale Velocity功能。
0 默认力度缩放
1 使用百分比


zaibuyidao_Scale Control (Enhanced Version).lua -- 缩放控制2合1
0 默认控制缩放
1 使用百分比


zaibuyidao_Length (Enhanced Version).lua -- 长度工具3合1,复刻Cakewalk的Length功能。
0 放大或缩小位置以及长度
1 放大或缩小位置
2 放大或缩小长度

(配图缺一个功能,实际上3个都有了)
本帖最后由 再补一刀 于 20-1-28 12:06 编辑

1267
#65 20-1-26 23:52
提示: 作者被禁止或删除 内容自动屏蔽

1408
#66 20-2-1 00:13
再补一刀 发表于 20-1-26 01:01
20200123 新增脚本:
zaibuyidao_Select Notes By Step.lua -- 步进选择音符[/ba ...

非常感谢再补一刀的脚本!!
不知道能否求个复制音符的脚本。
类似于下面这种:




这是kawa的Duplicate Musical。
比系统自带的Duplicate Musical要好用不上,系统只能以小节为单位的进行复制,kawa的脚本可以判断最小到16分音符的复制。


但这个脚本有个问题,就是在复制的过程中无法自动扩展区域,系统的Duplicate Musical是可以扩展区域的。请问这个问题有没办法解决呢?
如果可以的话,那能否最小到32分音符的复制呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

798
#67 20-2-3 17:21
附件提供的脚本已实现了该功能,32分音符没有问题。并且,重复出来的音符很稳定,不像Kawa的脚本重复执行会逐渐地减少音符长度。

想要扩展 MIDI Item 的边界,需要把插入音符改成粘贴。KAWA的脚本我看不懂,猜测他也是利用插入音符来创建重复。

基于粘贴方式的脚本目前测试有BUG,待解决了再放上来吧。

Duplicate Note.lua - 重复音符,

本帖最后由 再补一刀 于 20-2-3 17:42 编辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

1408
#68 20-2-3 20:16
再补一刀 发表于 20-2-3 17:21
附件提供的脚本已实现了该功能,32分音符没有问题。并且,重复出来的音符很稳定,不像Kawa的脚本重复执行会 ...

非常感谢,这个脚本是否会集成到你的插件包里呢?如果会集成的话我就不单独加载这个脚本了,就安心等你的reapack更新。

798
#69 20-2-4 20:43
已更新到ReaPack,脚本名: Duplicate Events

+ 新增了CC重复
观众反应

1408
#70 20-2-4 21:31
再补一刀 发表于 20-2-4 20:43
已更新到ReaPack,脚本名: Duplicate Events

+ 新增了CC重复

我看到MPL的duplicate脚本也可以自动扩展区域,代码复制过来了,你看看他们是怎么做到的呢?

  1. -- @description Smart duplicate events
  2. -- [url=home.php?mod=space&uid=203026]@version[/url] 1.01
  3. -- @author MPL
  4. -- @website http://forum.cockos.com/showthread.php?t=188335
  5. -- @changelog
  6. --    # fix maxppq var miss

  7. -----------------------------------------------------------------------------------------  
  8.   function SmartDuplicateNotes()
  9.     local  ME = MIDIEditor_GetActive()
  10.     if not ME then return end
  11.     local take = MIDIEditor_GetTake(ME)
  12.     if not take then return end
  13.     local data = ParseRAWMIDI(take)
  14.     local item = GetMediaItemTake_Item( take )
  15.     local item_pos =  GetMediaItemInfo_Value( item, 'D_POSITION')
  16.      ret, ppq_shift = CalcShift(item, item_pos, take, data)
  17.     if not ret then return end
  18.      extendMIDI, noteoff_ppq = AddShiftedSelectedEvents(take, data, ppq_shift )
  19.     if extendMIDI then
  20.       local start_qn =  TimeMap2_timeToQN( 0, item_pos )
  21.       local end_qn =  reaper.MIDI_GetProjQNFromPPQPos( take, noteoff_ppq )
  22.       MIDI_SetItemExtents(item, start_qn, end_qn)
  23.     end
  24.   end
  25. -----------------------------------------------------------------------------------------  
  26.   function ParseRAWMIDI(take)
  27.       local data = {}
  28.       local gotAllOK, MIDIstring = MIDI_GetAllEvts(take, "")
  29.       if not gotAllOK then return end
  30.       local s_unpack = string.unpack
  31.       local s_pack   = string.pack
  32.       local MIDIlen = MIDIstring:len()
  33.       local idx = 0   
  34.       local offset, flags, msg1
  35.       local ppq_pos = 0
  36.       local nextPos, prevPos = 1, 1
  37.       while nextPos <= MIDIlen do
  38.          
  39.           prevPos = nextPos
  40.           offset, flags, msg1, nextPos = s_unpack("i4Bs4", MIDIstring, prevPos)
  41.           idx = idx + 1
  42.           ppq_pos = ppq_pos + offset
  43.           data[idx] = {rawevt = s_pack("i4Bs4", offset, flags , msg1),
  44.                             offset=offset,
  45.                             flags=flags,
  46.                             selected =flags&1==1,
  47.                             muted =flags&2==2,
  48.                             msg1=msg1,
  49.                             ppq_pos = ppq_pos,
  50.                             isNoteOn =msg1:byte(1)>>4 == 0x9,
  51.                             isNoteOff =msg1:byte(1)>>4 == 0x8,
  52.                             isCC = msg1:byte(1)>>4 == 0xB,
  53.                             chan = 1+(msg1:byte(1)&0xF),
  54.                             vel=vel}


  55.       end
  56.       return data
  57.   end
  58. -----------------------------------------------------------------------------------------
  59.   function CalcShift(item, item_pos, take, data)
  60.     local min_ppq, max_ppq
  61.     for i =1, #data do
  62.       if data[i].selected and not min_ppq then min_ppq = data[i].ppq_pos end
  63.       if data[i].selected                 then max_ppq = data[i].ppq_pos end      
  64.     end
  65.     if not max_ppq or not min_ppq then return end
  66.     local ppq_dif = max_ppq - min_ppq   
  67.     local time_dif = MIDI_GetProjTimeFromPPQPos(take, ppq_dif) - item_pos
  68.     local retval, measures, cml = TimeMap2_timeToBeats(0, time_dif)
  69.     local time_of_measure = TimeMap2_beatsToTime(0, 0, 1)
  70.     local measure_ppq = MIDI_GetPPQPosFromProjTime(take, time_of_measure+ item_pos)
  71.     local ppq_shift = measure_ppq * (measures+1)
  72.     return true, math.floor(ppq_shift)
  73.   end
  74. -----------------------------------------------------------------------------------------  
  75.   function AddShiftedSelectedEvents(take, data, ppq_shift )
  76.     local str = ''
  77.     local last_ppq
  78.     for i = 1, #data-1 do      
  79.       local flag
  80.       if data[i].flags&1==1 then flag = data[i].flags-1 else flag = data[i].flags end
  81.       local str_per_msg = string.pack("i4Bs4", data[i].offset, flag , data[i].msg1)
  82.       str = str..str_per_msg
  83.       last_ppq = data[i].ppq_pos
  84.     end
  85.    
  86.     for i = 1, #data-1 do   
  87.       if data[i].selected then
  88.         local new_ppq = data[i].ppq_pos + ppq_shift
  89.         local str_per_msg = string.pack("i4Bs4", new_ppq-last_ppq, data[i].flags , data[i].msg1)
  90.         str = str..str_per_msg
  91.         last_ppq = new_ppq
  92.       end
  93.     end
  94.    
  95.     local noteoffoffs = data[#data].ppq_pos -last_ppq
  96.     if data[#data].ppq_pos < last_ppq then noteoffoffs = 1 end
  97.     str = str.. string.pack("i4Bs4", noteoffoffs, data[#data].flags , data[#data].msg1)
  98.     MIDI_SetAllEvts(take, str)
  99.    
  100.     if data[#data].ppq_pos < last_ppq then return true, noteoffoffs + last_ppq  end
  101.   end
  102.   
  103. -----------------------------------------------------------------------------------------  
  104.     function CheckFunctions(str_func)
  105.       local SEfunc_path = reaper.GetResourcePath()..'/Scripts/MPL Scripts/Functions/mpl_Various_functions.lua'
  106.       local f = io.open(SEfunc_path, 'r')
  107.       if f then
  108.         f:close()
  109.         dofile(SEfunc_path)
  110.         
  111.         if not _G[str_func] then
  112.           reaper.MB('Update '..SEfunc_path:gsub('%\\', '/')..' to newer version', '', 0)
  113.          else
  114.           Undo_BeginBlock2( 0 )
  115.           SmartDuplicateNotes()
  116.           Undo_EndBlock( 'Smart duplicate notes', -1 )
  117.         end        
  118.        else
  119.         reaper.MB(SEfunc_path:gsub('%\\', '/')..' missing', '', 0)
  120.       end  
  121.     end
  122.   --------------------------------------------------------------------
  123.   CheckFunctions('SetFXName')   
  124.   
  125.   
  126.   
复制代码

798
#71 20-2-5 17:30
这位MPL大佬的脚本同样很难看懂,您可能要去请教下程序员。

使用复制粘贴的方式可以扩展边界,我最开始写的另一份脚本已经实现,但是,处理速度非常慢。
如果有一个可以精确到毫秒的定时器让"粘贴"延时几毫秒执行,那问题应该就解决了。附脚本,我想应该有朋友能继续实现它。

--

插入音符的方式没有问题,不能扩展边界也不是BUG,只是隐藏在了边界之外,往后拉就有。自动扩展边界将会与后面的MIDI块重叠,我更倾向于不要扩展出去,需要时自己拉一下。

--



本帖最后由 再补一刀 于 20-2-5 17:33 编辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

1408
#72 20-2-5 20:08
再补一刀 发表于 20-2-5 17:30
这位MPL大佬的脚本同样很难看懂,您可能要去请教下程序员。

使用复制粘贴的方式可以扩展边界,我最开始 ...

的确是有点慢,点快了还会弹出窗口~~还是用你之前的脚本吧。。让你费心了!

947
#73 20-2-5 22:36
太强大了!!  厉害

379
#74 20-2-6 15:02
提示: 作者被禁止或删除 内容自动屏蔽

955
#75 20-2-7 09:43
汪洋 发表于 20-2-4 21:31
我看到MPL的duplicate脚本也可以自动扩展区域,代码复制过来了,你看看他们是怎么做到的呢?

应该先计算好需要扩展的长度,然后下列代码先把item扩展以后再复制的。
MIDI_SetItemExtents(item, start_qn, end_qn)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

搜索