请问这个脚本的问题应该怎么解决

function Msg(param)
 	reaper.ShowConsoleMsg(tostring(param).."\n")
end
function get_tr_na()
    local cou_tr = reaper.CountSelectedTracks(0)
    if cou_tr == 1--确保只有一个被选轨道
       then local get_tr = reaper.GetSelectedTrack(0, 0)
            local retval, buf = reaper.GetTrackName( get_tr )
            --Msg(buf)
            local pai = string.match(tostring(buf), "%u+")--匹配buf里第一串英文
            if pai == "BPM"
               then answer1 = string.match(tostring(buf), "%d+")--匹配buf里第一串数字
                    answer2 = string.match(tostring(buf), "%d+", 11)--匹配buf里第二串数字
                    answer3 = "4/4"
                    answer4 = "pop"--根据轨道标题做预设
               else answer1 = 60
                    answer2 = 32
                    answer3 = "4/4"
                    answer4 = "pop"--没有轨道标题做预设
            end
       else reaper.ShowMessageBox("请选择一个轨道哦~", "选择轨道错误!", 0)
    end
end

function set_tr_name()
	local cou_tr = reaper.CountSelectedTracks(0)
	if cou_tr == 1--确保只有一个被选轨道
	   then local get_tr = reaper.GetSelectedTrack(0, 0)
			local retval, retvals_csv = reaper.GetUserInputs("请输入想要的数值!", 4, "BPM =,副歌拍数,歌曲几几拍,音乐风格", answer1..","..answer2..","..answer3..","..answer4)  
            if retval == true
               then local bpm = string.match(tostring(retvals_csv), "%d+")--匹配retvals_csv里第一串数字
                    local beats = string.match(tostring(retvals_csv), "%d+", 4)--匹配retvals_csv里第二串数字
                    local sec = string.format("%.3f",60/bpm)--计算每拍多少秒
                    local pai = string.match(tostring(retvals_csv), "%d+.%d+", 7)--匹配retvals_csv里第三串字符
                    local style = string.match(tostring(retvals_csv), "%a+")--匹配retvals_csv里第四串字符
                    --local dir = string.match(tostring(retvals_csv), ".", 7)--匹配retvals_csv里第三串字符
                    if pai == "4/4"
                       then local a = sec*16
                            local b = sec*32
                            local c = sec*48
                            local d = sec*64
                            local e = sec*96
                            local newname = "BPM : "..bpm.."  副歌"..beats.."拍 "..pai.."拍歌曲".." 曲风:"..style.." 每拍"..sec.."秒".." 16拍="..a.."秒".." 32拍="..b.."秒".." 48拍="..c.."秒".." 64拍="..d.."秒".." 96拍="..e.."秒"
                            local _, name = reaper.GetSetMediaTrackInfo_String( get_tr, "P_NAME", newname, true )
                       else local a = sec*24
                            local b = sec*36
                            local c = sec*48
                            local d = sec*60
                            local e = sec*82
                            local newname = "BPM : "..bpm.."  副歌"..beats.."拍 "..pai.."拍歌曲".." 曲风:"..style.." 每拍"..sec.."秒".." 24拍="..a.."秒".." 36拍="..b.."秒".." 48拍="..c.."秒".." 60拍="..d.."秒".." 82拍="..e.."秒"
                            local _, name = reaper.GetSetMediaTrackInfo_String( get_tr, "P_NAME", newname, true )
                    end
                --Msg(pai)
                --reaper.ShowMessageBox(type(pop), "", 0)
                else end
        else reaper.ShowMessageBox("请选择一个轨道哦~", "选择轨道错误!", 0)
    end
end
reaper.Undo_BeginBlock() --Undoblock starts from here
reaper.PreventUIRefresh(1)

get_tr_na()
set_tr_name()

reaper.UpdateArrange()
reaper.Undo_EndBlock("Script name", 0)
reaper.PreventUIRefresh(-1)

脚本里如果BPM的值输入的带有小数点,其他的数值包括BPM都会出错,但是我们需要它BPM带有小数时也能正常。
例如:当我输入BPM = 60.1,其他默认参数,轨道名应该改为BPM : 60.1 副歌32拍 4/4拍歌曲 曲风:pop 每拍1.000秒 16拍=16.0秒 32拍=32.0秒 48拍=48.0秒 64拍=64.0秒 96拍=96.0秒,但是实际上轨道名改成了BPM : 60 副歌1拍 2,4拍歌曲 曲风:pop 每拍1.000秒 24拍=24.0秒 36拍=36.0秒 48拍=48.0秒 60拍=60.0秒 82拍=82.0秒。
我初步认为是在:

local bpm = string.match(tostring(retvals_csv), "%d+")--匹配retvals_csv里第一串数字
                    local beats = string.match(tostring(retvals_csv), "%d+", 4)--匹配retvals_csv里第二串数字
                    local sec = string.format("%.3f",60/bpm)--计算每拍多少秒
                    local pai = string.match(tostring(retvals_csv), "%d+.%d+", 7)--匹配retvals_csv里第三串字符
                    local style = string.match(tostring(retvals_csv), "%a+")--匹配retvals_csv里第四串字符

这里出错了,想请教这个问题应该如何解决。

如果这里要匹配带小数点的数字就应该是"%d+%.%d+"

1 个赞

如果只是这里改成这样的话,那不带小数点的会报错,而且后面的还是会错,请问这要怎么解决呢?

我不太了解 lua,可能错误的地方

如果第一个数值是小数点,如60.1,原来的方式就明显是错误的,因为不是从第7开始。

> retvals_csv = "60.1,32,4/4,pop"
local pai = string.match(tostring(retvals_csv), "%d+.%d+", 7)
print(pai)
2,4

而不是想要的 4/4


我个人更喜欢以英文逗号作为分割点。如第31行后面改成:

ret_t = {}
for v in string.gmatch(retvals_csv, "([^,]+)") do
     table.insert(ret_t, v)
end
local bpm = tonumber(ret_t[1])--匹配retvals_csv里第一串数字
local beats = tonumber(ret_t[2])--匹配retvals_csv里第二串数字
local sec = string.format("%.3f",60/bpm)--计算每拍多少秒
local pai = ret_t[3]--匹配retvals_csv里第三串字符
local style = ret_t[4]--匹配retvals_csv里第四串字符


结果可能就如你所愿:

运行结果

BPM : 60.234 副歌32拍 4/4拍歌曲 曲风:pop 每拍0.996秒 16拍=15.936秒 32拍=31.872秒 48拍=47.808秒 64拍=63.744秒 96拍=95.616秒

1 个赞

谢谢你的解答,解决了我的困惑,万分感谢 :handshake: