diff --git a/src/SoundMaker/Sounds/Track.cs b/src/SoundMaker/Sounds/Track.cs index 7aed704..4c731a5 100644 --- a/src/SoundMaker/Sounds/Track.cs +++ b/src/SoundMaker/Sounds/Track.cs @@ -22,13 +22,13 @@ public class Track /// The wave type.
波形タイプ。 /// The sound format.
サウンドフォーマット。 /// The tempo.
テンポ。 - /// The start time in milliseconds.
開始時間(ミリ秒)。 - internal Track(WaveTypeBase waveType, SoundFormat format, int tempo, int startMilliSecond) + /// The start time in index.
開始時間(インデクス)。 + internal Track(WaveTypeBase waveType, SoundFormat format, int tempo, int startIndex) { WaveType = waveType; _format = format; _tempo = tempo; - StartMilliSecond = startMilliSecond; + StartIndex = startIndex; } @@ -58,15 +58,14 @@ public double Pan } internal int EndIndex { get; private set; } - internal int StartIndex { get; private set; } - private int _startMilliSecond; + private int _startIndex; /// - /// Gets or sets the start time in milliseconds.
- /// 開始時間(ミリ秒)を取得または設定するプロパティ。 + /// Gets or sets the start time in index.
+ /// 開始時間(インデクス)を取得または設定するプロパティ。 ///
- internal int StartMilliSecond + internal int StartIndex { - get => _startMilliSecond; + get => _startIndex; set { // 負の数は許可しない @@ -75,11 +74,8 @@ internal int StartMilliSecond value = 0; } - _startMilliSecond = value; - - // 開始ミリ秒が変わると開始時、終了時のインデクスも変わるので、再計算する - var samplingFrequencyMS = (int)_format.SamplingFrequency / 1000.0; - StartIndex = (int)(StartMilliSecond * samplingFrequencyMS); + // 開始インデクスが変わると終了時のインデクスも変わる + _startIndex = value; if (WaveArrayLength == 0) { EndIndex = StartIndex; @@ -103,7 +99,7 @@ public int WaveArrayLength { _waveArrayLength = value; - // 配列の長さが変わると終了時インデクスが変わるので、再計算する + // 配列の長さが変わると終了時インデクスが変わる if (WaveArrayLength == 0) { EndIndex = StartIndex; @@ -245,7 +241,7 @@ public void Import(IEnumerable components) /// A new instance of the track with the same properties.
同じプロパティを持つトラックの新しいインスタンス。
internal Track Clone() { - var copy = new Track(WaveType.Clone(), _format, _tempo, StartMilliSecond) + var copy = new Track(WaveType.Clone(), _format, _tempo, StartIndex) { WaveArrayLength = WaveArrayLength, _soundComponents = _soundComponents.Select(component => component.Clone()).ToList() diff --git a/src/SoundMaker/Sounds/TrackBaseSound.cs b/src/SoundMaker/Sounds/TrackBaseSound.cs index c371d06..14fabd5 100644 --- a/src/SoundMaker/Sounds/TrackBaseSound.cs +++ b/src/SoundMaker/Sounds/TrackBaseSound.cs @@ -36,13 +36,13 @@ public class TrackBaseSound(SoundFormat format, int tempo) /// Creates a new track with the specified wave type and start time.
/// 指定された波の種類と開始時間で新しいトラックを作成するメソッド。 /// - /// The start time in milliseconds.
開始時間(ミリ秒)。 + /// The start time in index.
開始時間(インデクス)。 /// The type of wave.
波の種類。 /// A new instance of the track.
新しいトラックのインスタンス。
- public Track CreateTrack(int startMilliSecond, WaveTypeBase waveType) + public Track CreateTrack(int startIndex, WaveTypeBase waveType) { - var track = new Track(waveType, Format, Tempo, startMilliSecond); - InsertTrack(startMilliSecond, track); + var track = new Track(waveType, Format, Tempo, startIndex); + InsertTrack(startIndex, track); return track; } @@ -50,11 +50,11 @@ public Track CreateTrack(int startMilliSecond, WaveTypeBase waveType) /// Removes all tracks at the specified start time.
/// 指定された開始時間のすべてのトラックを削除するメソッド。 /// - /// The start time in milliseconds.
開始時間(ミリ秒)。 + /// The start time in index.
開始時間(インデクス)。 /// True if tracks were removed; otherwise, false.
トラックが削除された場合は true、それ以外の場合は false。
- public bool RemoveTracksAt(int startMilliSecond) + public bool RemoveTracksAt(int startIndex) { - return _tracksTimeMap.Remove(startMilliSecond); + return _tracksTimeMap.Remove(startIndex); } /// @@ -65,7 +65,7 @@ public bool RemoveTracksAt(int startMilliSecond) /// True if the track was removed; otherwise, false.
トラックが削除された場合は true、それ以外の場合は false。
public bool RemoveTrack(Track track) { - if (_tracksTimeMap.TryGetValue(track.StartMilliSecond, out var tracks)) + if (_tracksTimeMap.TryGetValue(track.StartIndex, out var tracks)) { var ok = tracks.Remove(track); if (!ok) @@ -75,7 +75,7 @@ public bool RemoveTrack(Track track) if (tracks.Count == 0) { - return _tracksTimeMap.Remove(track.StartMilliSecond); + return _tracksTimeMap.Remove(track.StartIndex); } return true; @@ -88,7 +88,7 @@ public bool RemoveTrack(Track track) /// Gets the list of tracks at the specified start time.
/// 指定された開始時間のトラックのリストを取得するメソッド。 ///
- /// The start time in milliseconds.
開始時間(ミリ秒)。 + /// The start time in index.
開始時間(インデクス)。 /// /// A list of tracks.
/// トラックのリスト。 @@ -96,9 +96,9 @@ public bool RemoveTrack(Track track) /// 失敗時は空リスト。 ///
- public List GetTracks(int startMilliSecond) + public List GetTracks(int startIndex) { - if (_tracksTimeMap.TryGetValue(startMilliSecond, out var tracks)) + if (_tracksTimeMap.TryGetValue(startIndex, out var tracks)) { return tracks; } @@ -124,12 +124,12 @@ public IEnumerable GetAllTracks() /// Tries to get the list of tracks at the specified start time.
/// 指定された開始時間のトラックのリストを取得しようとするメソッド。 /// - /// The start time in milliseconds.
開始時間(ミリ秒)。 + /// The start time in index.
開始時間(インデクス)。 /// The list of tracks.
トラックのリスト。 /// True if tracks were found; otherwise, false.
トラックが見つかった場合は true、それ以外の場合は false。
- public bool TryGetTracks(int startMilliSecond, out List tracks) + public bool TryGetTracks(int startIndex, out List tracks) { - if (_tracksTimeMap.TryGetValue(startMilliSecond, out var foundTracks)) + if (_tracksTimeMap.TryGetValue(startIndex, out var foundTracks)) { tracks = foundTracks; return true; @@ -145,17 +145,17 @@ public bool TryGetTracks(int startMilliSecond, out List tracks) /// Inserts a track at the specified start time.
/// 指定された開始時間にトラックを挿入するメソッド。 /// - /// The start time in milliseconds.
開始時間(ミリ秒)。 + /// The start time in index.
開始時間(インデクス)。 /// The track to insert.
挿入するトラック。 - private void InsertTrack(int startMilliSecond, Track track) + private void InsertTrack(int startIndex, Track track) { - if (_tracksTimeMap.TryGetValue(startMilliSecond, out var tracks)) + if (_tracksTimeMap.TryGetValue(startIndex, out var tracks)) { tracks.Add(track); } else { - _tracksTimeMap[startMilliSecond] = [track]; + _tracksTimeMap[startIndex] = [track]; } } @@ -164,14 +164,14 @@ private void InsertTrack(int startMilliSecond, Track track) /// トラックを新しい開始時間に移動するメソッド。 /// /// The track to move.
移動するトラック。 - /// The new start time in milliseconds.
新しい開始時間(ミリ秒)。 + /// The new start time in index.
新しい開始時間(インデクス)。 /// True if the track was moved; otherwise, false.
トラックが移動された場合は true、それ以外の場合は false。
- public bool MoveTrack(Track track, int newStartMilliSecond) + public bool MoveTrack(Track track, int newStartIndex) { if (RemoveTrack(track)) { - InsertTrack(newStartMilliSecond, track); - track.StartMilliSecond = newStartMilliSecond; + InsertTrack(newStartIndex, track); + track.StartIndex = newStartIndex; return true; } return false; @@ -182,13 +182,13 @@ public bool MoveTrack(Track track, int newStartMilliSecond) /// 指定されたトラックのコピーを新しい開始時間に作成するメソッド。 /// /// The track to copy.
コピーするトラック。 - /// The new start time in milliseconds.
新しい開始時間(ミリ秒)。 + /// The new start time in index.
新しい開始時間(インデクス)。 /// A new instance of the copied track.
コピーされたトラックの新しいインスタンス。
- public Track CopyTrack(Track sourceTrack, int newStartMilliSecond) + public Track CopyTrack(Track sourceTrack, int newStartIndex) { var newTrack = sourceTrack.Clone(); - newTrack.StartMilliSecond = newStartMilliSecond; - InsertTrack(newStartMilliSecond, newTrack); + newTrack.StartIndex = newStartIndex; + InsertTrack(newStartIndex, newTrack); return newTrack; } @@ -216,6 +216,7 @@ public MonauralWave GenerateMonauralWave() // 最大の終了時インデクスを取得する var maxEndIndex = _tracksTimeMap .SelectMany(pair => pair.Value) + .Where(track => track.Count != 0) .Max(track => track.EndIndex); var wave = new double[maxEndIndex + 1]; @@ -256,6 +257,7 @@ public StereoWave GenerateStereoWave() // 最大の終了時インデクスを取得する var maxEndIndex = _tracksTimeMap .SelectMany(pair => pair.Value) + .Where(track => track.Count != 0) .Max(track => track.EndIndex); var right = new double[maxEndIndex + 1]; @@ -321,13 +323,13 @@ public void Import(IEnumerable from) var map = new Dictionary>(); foreach (var track in from) { - if (map.TryGetValue(track.StartMilliSecond, out var tracks)) + if (map.TryGetValue(track.StartIndex, out var tracks)) { tracks.Add(track); } else { - map.Add(track.StartMilliSecond, [track]); + map.Add(track.StartIndex, [track]); } } diff --git a/test/UnitTests/Sounds/TrackBaseSoundTest.cs b/test/UnitTests/Sounds/TrackBaseSoundTest.cs index d5f6bda..050642e 100644 --- a/test/UnitTests/Sounds/TrackBaseSoundTest.cs +++ b/test/UnitTests/Sounds/TrackBaseSoundTest.cs @@ -26,7 +26,7 @@ public void GetAllTracks() Assert.True(track2.Equals(actual[1])); } - [Fact(DisplayName = "指定したミリ秒から開始するトラックをすべて削除できるか")] + [Fact(DisplayName = "指定したインデクスから開始するトラックをすべて削除できるか")] public void RemoveTracksAt() { var format = FormatBuilder.Create() @@ -34,7 +34,7 @@ public void RemoveTracksAt() .WithBitDepth(8) .WithChannelCount(1) .ToSoundFormat(); - // 0ミリ秒開始のトラックを削除する対象とする + // 0インデクス開始のトラックを削除する対象とする var targetStartMS = 0; var sound = new TrackBaseSound(format, 100); var wave = new SquareWave(SquareWaveRatio.Point25); @@ -73,7 +73,7 @@ public void RemoveTrack() Assert.False(maybeFail); } - [Fact(DisplayName = "指定したミリ秒から開始するトラックをすべて取得できるか")] + [Fact(DisplayName = "指定したインデクスから開始するトラックをすべて取得できるか")] public void GetTracks() { var format = FormatBuilder.Create() @@ -85,7 +85,7 @@ public void GetTracks() var wave = new SquareWave(SquareWaveRatio.Point25); var track1 = sound.CreateTrack(0, wave); - var tracks = sound.GetTracks(track1.StartMilliSecond); + var tracks = sound.GetTracks(track1.StartIndex); Assert.Contains(track1, tracks); } @@ -116,7 +116,7 @@ public void TryGetTracks() var wave = new SquareWave(SquareWaveRatio.Point25); var track1 = sound.CreateTrack(0, wave); - Assert.True(sound.TryGetTracks(track1.StartMilliSecond, out var tracks)); + Assert.True(sound.TryGetTracks(track1.StartIndex, out var tracks)); Assert.Contains(track1, tracks); Assert.False(sound.TryGetTracks(1000, out _)); @@ -135,8 +135,8 @@ public void Insert() var track1 = sound.CreateTrack(0, wave); var track2 = sound.CreateTrack(1000, wave); - Assert.Equal(track1, sound.GetTracks(track1.StartMilliSecond)[0]); - Assert.Equal(track2, sound.GetTracks(track2.StartMilliSecond)[0]); + Assert.Equal(track1, sound.GetTracks(track1.StartIndex)[0]); + Assert.Equal(track2, sound.GetTracks(track2.StartIndex)[0]); } [Fact(DisplayName = "トラックの移動を行えるか")] diff --git a/test/UnitTests/Sounds/TrackTest.cs b/test/UnitTests/Sounds/TrackTest.cs index a195ac8..fa5ed4f 100644 --- a/test/UnitTests/Sounds/TrackTest.cs +++ b/test/UnitTests/Sounds/TrackTest.cs @@ -7,7 +7,7 @@ namespace SoundMakerTests.UnitTests.Sounds; file class SoundComponentDouble : ISoundComponent { - public static readonly int DefinedGenerateWaveLength = 1; + public static readonly int DefinedGenerateWaveLength = 2; public ISoundComponent Clone() { @@ -21,7 +21,7 @@ public short[] GenerateWave(SoundFormat format, int tempo, int length, WaveTypeB public short[] GenerateWave(SoundFormat format, int tempo, WaveTypeBase waveType) { - return [0]; + return [0, 1]; } public int GetWaveArrayLength(SoundFormat format, int tempo) @@ -138,14 +138,14 @@ public void Clear() } [Fact(DisplayName = "開始位置を変更した際にインデクス関連のプロパティが正しく変更されるか")] - public void ChangeStartMilliSecond() + public void ChangeStartIndex() { var track = CreateTrack(); var oldStartIndex = track.StartIndex; var oldEndIndex = track.EndIndex; - var diffIndex = _samplingFrequency; - // 1000ミリ秒減らす - track.StartMilliSecond -= 1000; + var diffIndex = 1; + // 1減らす + track.StartIndex -= diffIndex; var expectedEndIndex = oldEndIndex - diffIndex; Assert.Equal(expectedEndIndex, track.EndIndex); @@ -158,7 +158,7 @@ private Track CreateTrack() .WithBitDepth(16) .WithChannelCount(2) .ToSoundFormat(); - return new Track(new TriangleWave(), format, 100, 1000); + return new Track(new TriangleWave(), format, 100, 1); } private void AssertEndIndex(Track track)