ただのメモですがお好きにご利用頂けます
使って何が起きても責任は持てません。
基本拡張編集に元々ある機能で事足りますが勉強用
色変換は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
-
次の記事これより新しい記事はありません。
-
前の記事2018-06-24 11:53:36ディレイ動画補足2コメ