--------------------------------------------------------------------------- -- 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);