fceux/output/luaScripts/taseditor/TrackNoise.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);