Skip to content

Commit

Permalink
add metronome sounds
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Dec 30, 2023
1 parent eb29547 commit f59df05
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace OngekiFumenEditor.Kernel.Audio.DefaultCommonImpl.Sound
[Export(typeof(IFumenSoundPlayer))]
public partial class DefaultFumenSoundPlayer : PropertyChangedBase, IFumenSoundPlayer, IDisposable
{
private record MeterAction(TimeSpan Time, TimeSpan BeatInterval, bool isSkip);
private record MeterAction(TimeSpan Time, TimeSpan BeatInterval, int BeatCount, bool isSkip);

private IntervalTree<TimeSpan, DurationSoundEvent> durationEvents = new();
private HashSet<DurationSoundEvent> currentPlayingDurationEvents = new();
Expand Down Expand Up @@ -114,6 +114,8 @@ async Task load(SoundControl sound, string fileName)
await load(SoundControl.BeamPrepare, "beamprepare.wav");
await load(SoundControl.BeamLoop, "beamlooping.wav");
await load(SoundControl.BeamEnd, "beamend.wav");
await load(SoundControl.MetronomeStrongBeat, "metronomeStrongBeat.wav");
await load(SoundControl.MetronomeWeakBeat, "metronomeWeakBeat.wav");

if (!noError)
{
Expand Down Expand Up @@ -313,11 +315,11 @@ void AddDurationSound(SoundControl sound, TGrid tGrid, TGrid endTGrid, int loopI
{
var beatCount = timeSignature.meter.BunShi;
var isSkip = beatCount == 0;
var beatInterval = (isSkip ? default :
var beatInterval = isSkip ? default :
TimeSpan.FromMilliseconds(MathUtils.CalculateBPMLength(TGrid.Zero, oneTGrid, timeSignature.bpm.BPM))
/ beatCount);
/ beatCount;

var action = new MeterAction(timeSignature.audioTime, beatInterval, isSkip);
var action = new MeterAction(timeSignature.audioTime, beatInterval, beatCount, isSkip);
meterActions.AddLast(action);
}
}
Expand Down Expand Up @@ -346,7 +348,7 @@ private void UpdateInternal(CancellationToken token)
if (ct >= 0)
{
//Debug.WriteLine($"diff:{ct:F2}ms, target:{itor.Value}, currentTime:{currentTime}");
ProcessSoundEvent(itor.Value);
PlaySoundsOnce(itor.Value.Sounds);
itor = itor.Next;
}
else
Expand Down Expand Up @@ -384,9 +386,10 @@ private void UpdateInternal(CancellationToken token)
var ct = currentTime.TotalMilliseconds - nextBeatTime.TotalMilliseconds;
if (ct >= 0)
{
Log.LogDebug($"currentMeterHitCount:{currentMeterHitCount}, nextBeatTime:{nextBeatTime}, diff:{ct:F2}ms, meterActionsItor:{meterActionsItor.Value}");
if (editor.IsDesignMode && cacheSounds.TryGetValue(SoundControl.ClickSE, out var soundPlayer))
soundPlayer.PlayOnce();
//Log.LogDebug($"currentMeterHitCount:{currentMeterHitCount}, nextBeatTime:{nextBeatTime}, diff:{ct:F2}ms, meterActionsItor:{meterActionsItor.Value}");
var beatIdx = currentMeterHitCount % meterActionsItor.Value.BeatCount;
var sound = beatIdx == 0 ? SoundControl.MetronomeStrongBeat : SoundControl.MetronomeWeakBeat;
PlaySoundsOnce(sound);
currentMeterHitCount++;
}
else
Expand Down Expand Up @@ -440,10 +443,8 @@ private void OnUpdate(CancellationToken cancel)
}
}

private void ProcessSoundEvent(SoundEvent evt)
private void PlaySoundsOnce(SoundControl sounds)
{
var sounds = evt.Sounds;

void checkPlay(SoundControl subFlag)
{
if (sounds.HasFlag(subFlag) && SoundControl.HasFlag(subFlag) && cacheSounds.TryGetValue(subFlag, out var sound))
Expand All @@ -463,6 +464,8 @@ void checkPlay(SoundControl subFlag)
checkPlay(SoundControl.ClickSE);
checkPlay(SoundControl.BeamPrepare);
checkPlay(SoundControl.BeamEnd);
checkPlay(SoundControl.MetronomeStrongBeat);
checkPlay(SoundControl.MetronomeWeakBeat);
}

public void Seek(TimeSpan msec, bool pause)
Expand Down
4 changes: 3 additions & 1 deletion OngekiFumenEditor/Kernel/Audio/SoundControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ public enum SoundControl
BeamPrepare = HoldEnd * 2,
BeamLoop = BeamPrepare * 2,
BeamEnd = BeamLoop * 2,
MetronomeStrongBeat = BeamEnd * 2,
MetronomeWeakBeat = MetronomeStrongBeat * 2,

All = BeamPrepare | BeamLoop | BeamEnd | HoldEnd | HoldTick | ClickSE | Bell | Beam | Bullet | CriticalFlick | Flick | CriticalWallHold | WallHold | CriticalWallTap | WallTap | CriticalHold | Hold | CriticalTap | Tap
All = MetronomeStrongBeat | MetronomeWeakBeat | BeamPrepare | BeamLoop | BeamEnd | HoldEnd | HoldTick | ClickSE | Bell | Beam | Bullet | CriticalFlick | Flick | CriticalWallHold | WallHold | CriticalWallTap | WallTap | CriticalHold | Hold | CriticalTap | Tap
}
}
6 changes: 6 additions & 0 deletions OngekiFumenEditor/OngekiFumenEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -396,12 +396,18 @@
<None Update="Resources\sounds\holdtick.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\sounds\metronomeStrongBeat.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\sounds\tap.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\sounds\wall.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Resources\sounds\metronomeWeakBeat.wav">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

<ItemGroup>
Expand Down
Binary file not shown.
Binary file not shown.

0 comments on commit f59df05

Please sign in to comment.