|  | 
 
 
 楼主|
发表于 2024-5-28 15:27:07
|
显示全部楼层 
| 这里我们肯定需要一个将"#wait"的指令,转换成function() Metronome:wait(xxx) end的函数,我这里管他叫解码器(decoder)。 
 除了#wait,用这个方法很明显我们还能加入#t+ #t- 开关触发组的功能,#pause #resume 的暂停/继续控制,甚至#print的打印方法。
 
 这是我的默认解码器
 
 
 很简单易懂复制代码    M._commands = {}
    M.register = function(command, handler)
        M._commands[command] = handler
    end
    M.decoder = function(metronome, data)
        runtime.HC.eventBus:raiseEvent('core.metronome.sent',metronome)
        if (#data > 0 and string.sub(data, 1, 1) == '#') then
            local cmd, sep, param = string.match(data, "^#([^ ]+)(%s*)(.-)$")
            if cmd ~= nil then
                if M._commands[cmd] ~= nil then
                    return M._commands[cmd](metronome, param)
                end
            end
        end
        return data
    end
    M.register('wait', function(metronome, param)
        return function(metronome)
            metronome:wait(param / 1000)
        end
    end)
    M.register('pause', function(metronome, param)
        return function(metronome)
            metronome:pause()
        end
    end)
    M.register('resume', function(metronome, param)
        return function(metronome)
            metronome:resume()
        end
    end)
    M.register('print', function(metronome, param)
        return function(metronome)
            print(param)
        end
    end)
    M.register('t+', function(metronome, param)
        return function(metronome)
            runtime.world:enableTriggers(param)
        end
    end)
    M.register('t-', function(metronome, param)
        return function(metronome)
            runtime.world:disableTriggers(param)
        end
    end)
 还提供了一个register方法,能很方便的添加自己的新指令。
 
 使用了这个,我们就能直接发送"n;w;w;#wait 3000;n;e;"的指令了。
 
 | 
 |