static int _currentPitch = -1; // -1 表示尚未开始 // 初始化音符序列 public static void InitialSequence(int count) { StopCurrent(); var chord = new Chord("C"); int start = (int)Pitch.C4; _sequence = new List <int>(); while (_sequence.Count < count) { // 音符不要越过最大值 // TODO: 试验一下找一个不是特别高的音作为最高音 if (start >= (int)Pitch.G9) { // 保护 if (_sequence.Count == 0) { break; } _sequence.Add(_sequence[_sequence.Count - 1]); // 用最后一个重复填充 } else if (chord.Contains((Pitch)start)) { _sequence.Add(start); } start++; } _sequence.Reverse(); _currentPitch = -1; }
public void Contains() { Chord cmajor = new Chord("C"); Pitch[] cmajorPitches = new Pitch[] { Pitch.C2, Pitch.E2, Pitch.G2 }; Pitch[] cmajorNotPitches = new Pitch[] { Pitch.CSharp2, Pitch.D2, Pitch.DSharp2, Pitch.F2, Pitch.FSharp2, Pitch.GSharp2, Pitch.A2, Pitch.ASharp2 }; foreach (Pitch p in cmajorPitches) { Assert.True(cmajor.Contains(p)); } foreach (Pitch p in cmajorNotPitches) { Assert.False(cmajor.Contains(p)); } Chord bbminor = new Chord("Bbm"); Pitch[] bbminorPitches = new Pitch[] { Pitch.ASharp2, Pitch.CSharp3, Pitch.F3 }; Pitch[] bbminorNotPitches = new Pitch[] { Pitch.B2, Pitch.C3, Pitch.D3, Pitch.DSharp3, Pitch.E3, Pitch.G3, Pitch.FSharp3, Pitch.GSharp3, Pitch.A3 }; foreach (Pitch p in bbminorPitches) { Assert.True(bbminor.Contains(p)); } foreach (Pitch p in bbminorNotPitches) { Assert.False(bbminor.Contains(p)); } }
void PlayChordRun(OutputDevice outputDevice, Chord chord, int millisecondsBetween) { Pitch previousNote = (Pitch)(-1); for (Pitch pitch = Pitch.A0; pitch < Pitch.C8; ++pitch) { if (chord.Contains(pitch)) { if (previousNote != (Pitch)(-1)) { outputDevice.SendNoteOff(Channel.Channel1, previousNote, 80); } outputDevice.SendNoteOn(Channel.Channel1, pitch, 80); Thread.Sleep(millisecondsBetween); previousNote = pitch; } } if (previousNote != (Pitch)(-1)) { outputDevice.SendNoteOff(Channel.Channel1, previousNote, 80); } }
static int _currentPitch = -1; // -1 表示尚未开始 // 初始化音符序列 public static void InitialSequence(int count) { StopCurrent(); var chord = new Chord("C"); int start = (int)Pitch.C4; _sequence = new List <int>(); while (_sequence.Count < count) { if (chord.Contains((Pitch)start)) { _sequence.Add(start); } start++; } _sequence.Reverse(); _currentPitch = -1; }