AviUtl拡張編集 私的関数備忘録
閉じる
閉じる

AviUtl拡張編集 私的関数備忘録

2018-09-11 11:58

    ただのメモですがお好きにご利用頂けます
    使って何が起きても責任は持てません。
    基本拡張編集に元々ある機能で事足りますが勉強用
    色変換はrikky_moduleをお勧めします
    getsection以外使い道があまり無いような...



    -- HSVをRGBに直接変換
    -- h 0~360
    -- s 0~100
    -- v 0~100

    local function round(x)
    return math.floor(x+0.5)
    end

    function HSVtoRGB(h, s, v)
    h,s,v = h/360, s*0.01, v*0.01
    h = h % 1
    local c = v * s
    local x = c * (1 - math.abs((h*6) % 2 - 1))
    local m = v - c
    local mod = math.floor(h*6) + 1
    local r = ({c, x, 0, 0, x, c})[mod] + m
    local g = ({x, c, c, x, 0, 0})[mod] + m
    local b = ({0, 0, x, c, c, x})[mod] + m
    return round(r*255), round(g*255), round(b*255)
    end


    -- RGB を HSV に変換

    function RGBtoHSV(r, g, b)
    local max = math.max(r,g,b)
    if (max==0) then
    return 0,0,0
    end
    local min = math.min(r,g,b)
    local delta = (max-min)
    if (delta<0.00392) then
    return 0,0,round(max/2.55)
    end
    local H
    if (r>=max) then
    H = 60*((g-b)/delta)
    elseif (g>=max) then
    H = 60*(2+(b-r)/delta)
    else
    H = 60*(4+(r-g)/delta)
    end
    if H<0 then H = H+360 end
    return round(H),round(100*delta/max),round(max/2.55)
    end


    -- 拡張編集の関数 RGB と大体一緒の挙動
    -- HEXtoRGB(255,255,255) 戻り値 0xffffff
    -- HEXtoRGB(0xffffff) 戻り値 255,255,255

    function HEXtoRGB(...)
    local m = {...}
    if (#m == 3) then
    return SHIFT(m[1],16) + SHIFT(m[2],8) + m[3]
    end
    return SHIFT(m[1],-16), SHIFT(m[1],-8)%256, m[1]%256
    end


    -- rikky_moduleを使ったオーディオスペクトラム

    -- num = 戻り値のデータ数 (1 ~ 8192) (精度による)
    -- reso = 精度(0~3)、周波数成分の分解能
    -- mean = 平均化数(0~3)、 1以上だと滑らかな動き
    -- loger = 対数表示(0 or 1)、小さな音でも派手めに変化してくれる

    -- 戻り値は numで指定した要素のテーブルです。中の値は概ね0~1の範囲に収まります

    function audio_spectrum(num,reso,mean,loger)
    require("rikky_module")
    num,reso,mean,loger = (num or 128),(reso or 0),(mean or 0),(loger or 0)

    mean = math.min(mean,3)
    local d = 1 / (mean*2 + 1)
    local k = (loger==0 and 1/10000) or 1
    local m = {}
    for i=-mean,mean do
    m[#m+1] = rikky_module.audiobuffer(i,"SPECTRUM","relative","monaual",num,reso)
    end

    local v = {}
    local peak = 0
    for i=1,num do
    local sum = 0
    for j=1,#m do
    sum = sum + m[j][i]
    end
    v[i] = sum*d*k
    if (v[i] > peak) then
    peak = v[i]
    end
    end

    if (loger~=1) then
    return v, peak
    else
    peak = 0
    local l = 1 / 13.28785687
    for i=1,num do
    v[i] = math.log(1+v[i], 2) * l
    if (v[i] > peak) then
    peak = v[i]
    end
    end
    return v, peak
    end
    end




    -- [[
    中間点の数、現在の中間点区間番号、中間点の有る時間、中間点毎の長さ、区間の進行度、中間点基準の時間
    をまとめて取得します。
    トラックバースクリプトなら関数が用意されているのですがアニメーション効果用には無いので。

    local s = getsection() -- sに結果を渡す
    s.num = 中間点の総数 - 1
    s.keytime = 中間点の打ってある時間をまとめたテーブル (s.keytime[1] = 一つ目の中間点がある時間)
    s.section = 現在いる中間点の区間番号、中間点が無ければ常に0
    s.duration = 現在いる中間点から次の中間点までの長さ、中間点が無ければobj.totaltimeと同じ
    s.ratio = 現在いる中間点から次の中間点までの進行度を(0~1)で表したもの
    s.time = 中間点毎に0から始まる時間、中間点が無ければobj.time同じ
    ]]

    function getsection()
    local num = obj.getoption("section_num")
    local section = 0
    local time = obj.time
    local duration = obj.totaltime
    local ratio = time / duration
    local keytime = {[0]=0}
    if (num==1) then
    return {num=num, section=section, keytime=keytime, duration=duration, ratio=ratio, time=time}
    end
    for i=1,num do
    keytime[i] = obj.getvalue("time",0,i)
    end
    for i=1,num-1 do
    if (obj.time >= keytime[i]) then
    section = i
    time = obj.time - keytime[i]
    duration = keytime[i+1] - keytime[i]
    ratio = time / duration
    end
    end
    return {num=num, section=section, keytime=keytime, duration=duration, ratio=ratio, time=time}
    end






    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。