83 lines
3.2 KiB
Lua
83 lines
3.2 KiB
Lua
|
---------------------------------------------------------------------------
|
||
|
-- Tracking Noise channel volume peaks
|
||
|
-- by AnS, 2012
|
||
|
---------------------------------------------------------------------------
|
||
|
-- Showcases following functions:
|
||
|
-- * sound.get()
|
||
|
-- * taseditor.markedframe()
|
||
|
-- * taseditor.getmarker()
|
||
|
-- * taseditor.setmarker()
|
||
|
-- * taseditor.getnote()
|
||
|
-- * taseditor.setnote()
|
||
|
---------------------------------------------------------------------------
|
||
|
-- Usage:
|
||
|
-- Run the script, unpause emulation.
|
||
|
-- When the "Auto function" checkbox is checked, the script will
|
||
|
-- automatically create Markers on various frames according to ingame music.
|
||
|
-- These Markers should help you see music patterns,
|
||
|
-- so you can adjust input precisely creating nice Tool-Assisted dances.
|
||
|
--
|
||
|
-- This script uses Noise channel volume as an indicator for setting Markers,
|
||
|
-- but it's possible to use any other property of sound channels
|
||
|
-- as a factor to decide whether to set Marker on current frame.
|
||
|
--
|
||
|
-- The script was tested on Super Mario Bros, Megaman and Duck Tales.
|
||
|
-- You may want to see it in slow-mo. Use -/= hotkeys to change emulation speed.
|
||
|
--
|
||
|
-- To create customized script for your game, first use SoundDisplay.lua
|
||
|
-- to collect and analyse statistics about ingame music. Then choose
|
||
|
-- which channel you want to sync your input to. Finally, change this script
|
||
|
-- so that Markers will be created using new set of rules.
|
||
|
---------------------------------------------------------------------------
|
||
|
|
||
|
NOISE_VOL_THRESHOLD = 0.35;
|
||
|
|
||
|
function track_changes()
|
||
|
if (taseditor.engaged()) then
|
||
|
current_frame = movie.framecount();
|
||
|
if (last_frame ~= current_frame) then
|
||
|
-- Playback has moved
|
||
|
-- Get current value of indicator for current_frame
|
||
|
snd = sound.get();
|
||
|
indicator = snd.rp2a03.noise.volume;
|
||
|
-- If Playback moved 1 frame forward, this was probably Frame Advance
|
||
|
if (last_frame == current_frame - 1) then
|
||
|
-- Looks like we advanced one frame from the last time
|
||
|
-- Decide whether to set Marker
|
||
|
if (indicator > NOISE_VOL_THRESHOLD and last_frame_indicator_value == 0) then
|
||
|
-- this was a peak in volume! ____/\____
|
||
|
-- Set Marker and show frequency of noise+triangle in its Note
|
||
|
SetSoundMarker(current_frame - 1, "Sound: " .. (snd.rp2a03.noise.regs.frequency + snd.rp2a03.triangle.regs.frequency));
|
||
|
end
|
||
|
end
|
||
|
last_frame = current_frame;
|
||
|
last_frame_indicator_value = indicator;
|
||
|
end
|
||
|
else
|
||
|
gui.text(1, 9, "TAS Editor is not engaged.");
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SetSoundMarker(frame, new_note)
|
||
|
if (taseditor.markedframe(frame)) then
|
||
|
-- this frame is already marked
|
||
|
old_note = taseditor.getnote(taseditor.getmarker(frame));
|
||
|
-- check if the Note of the Marker already contains new_note text
|
||
|
if (string.find(old_note, new_note) == nil) then
|
||
|
-- append new_note text to the Marker's Note
|
||
|
taseditor.setnote(taseditor.getmarker(frame), old_note .. " " .. new_note);
|
||
|
end
|
||
|
else
|
||
|
-- this frame isn't marked
|
||
|
-- create new Marker here
|
||
|
new_marker = taseditor.setmarker(frame);
|
||
|
taseditor.setnote(new_marker, new_note);
|
||
|
end
|
||
|
end
|
||
|
|
||
|
last_frame = 0;
|
||
|
last_frame_indicator_value = 0;
|
||
|
|
||
|
taseditor.registerauto(track_changes);
|
||
|
|