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

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

( 14 )
 
[收藏]

1408
#1 20-1-18 23:30
请问随机力度和人性化力度这两种功能的处理逻辑是不是差不多的呢?

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

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

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

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

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

好的好的。谢谢谢谢!

1408
#4 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

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

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

1408
#6 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.   
复制代码

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

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

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

1408
#8 20-2-10 18:19
再补一刀 发表于 20-2-9 22:21
MIDI_SetItemExtents 可以解决,脚本更新了。

哇啦啦啦啦!!!!爽翻!!!!多谢多谢!!!

1408
#9 20-2-16 17:09
再补一刀 发表于 20-2-15 20:42
使用 MIDI_SetItemExtents 有一个硬伤,必须选中当前Item。但是,当进行多轨编辑时,会发现Item不一定总是 ...
意思是我用reapack自动更新了这个脚本到新版本,就不能用这个脚本扩展区域了吗?还是这个脚本的版本会保留?新的脚本会用新的命名,例如:Duplicate Events (Within Time Selection)??

另外还有个问题,如果这个小节的第一个音符因为弹奏的不准确,提前了一些到前一个小节,那么duplicate出来的音符就会在后面空一个小节出来,mpl和你的脚本都会这样,但是kawa的脚本就会知道这是弹奏误差,不会空一个小节出来。

不知道我说清楚了没~~~

本帖最后由 汪洋 于 20-2-16 20:51 编辑

1408
#10 20-2-16 18:23
出入三星2012 发表于 19-12-11 20:17
我这里Shift,Ctrl,Alt,各种组合都试了,只能拖拽音符长短,而且上面GIF里的sturm工具鼠标也没变出来, ...

你是怎么成功的?我在鼠标左键拖拽的选项里没有操作列表的选项呢?




本帖子中包含更多资源

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

x

1408
#11 20-2-18 00:30
再补一刀 发表于 20-2-17 22:36
通过计算Item长度来扩展边界的脚本在REAPACK上依然可以下载到,下载时请选择版本,找到1.6的版本下载回来 ...
Duplicate Events (Within Time Selection).lua 应该没有你说的问题,不管第一个音符在哪个位置,只要选中的数据总长度在一小节长度以内,那么不会空出一个小节。


我的意思就是第一个音符不在这个小节内,而因为弹奏的误差提前到前一个小节一点点,这种情况脚本就会识别成为两小节,有没有办法能够兼容这种弹奏误差呢?

1408
#12 20-2-18 22:21
再补一刀 发表于 20-2-18 10:44
上图音符用 Duplicate Events (Within Time Selection) 处理,选中的音符总长度不超出一个 ...

好的。非常感谢你的付出。

请问是否有相同功能针对CC的呢?你平时有没有对CC进行连续拷贝的需求呢?

1408
#13 20-2-19 20:58
再补一刀 发表于 20-2-19 18:37
是的,这个脚本本身就支持两个功能,一个是音符,另一个就是CC。

对CC重复的需求是有的,比如带弯音信 ...

实在是非常感谢你的脚本,很多脚本对我帮助很大!

1408
#14 20-3-31 14:27
谢谢再补一刀持续发功!!!

1408
#15 20-5-15 23:08
溺水鱼 发表于 20-5-15 10:31
  我不是本软件用户,而是Sonar用户,看了看,这个脚本编写与Sonar中的CAL编写非常像。所以我以CAL的编 ...

非常感谢!很惭愧我不会写脚本
您需要登录后才可以回帖 登录 | 注册

本版积分规则

搜索