public void GetSongState(UI.TrackInfo info) { info.Tempo = Tempo; info.Position = position; for (int i = 0; i < NumTracks; i++) { info.Positions[i] = Song.Commands[i][tracks[i].CommandIndex].GetOffset(); info.Delays[i] = tracks[i].Delay; info.Voices[i] = tracks[i].Voice; info.Mods[i] = tracks[i].MODDepth; info.Types[i] = Song.VoiceTable[tracks[i].Voice].GetName(); info.Volumes[i] = tracks[i].GetVolume(); info.Pitches[i] = tracks[i].GetPitch(); info.Pans[i] = tracks[i].GetPan(); var channels = SoundMixer.Instance.GetChannels(i); bool none = channels.Length == 0; info.Lefts[i] = none ? 0 : channels.Select(c => c.GetVolume().FromLeftVol).Max(); info.Rights[i] = none ? 0 : channels.Select(c => c.GetVolume().FromRightVol).Max(); info.Notes[i] = none ? new sbyte[0] : channels.Where(c => c.State < ADSRState.Releasing).Select(c => c.Note.OriginalKey).Distinct().ToArray(); } }
public void GetSongState(UI.TrackInfo info) { info.Tempo = tempo; for (int i = 0; i < 0x10; i++) { Track track = Instance.Tracks[i]; info.Positions[i] = track.DataOffset; info.Delays[i] = track.Delay; info.Voices[i] = track.Voice; info.Mods[i] = track.LFODepth * track.LFORange; info.Types[i] = sbnk.NumInstruments <= track.Voice ? "???" : sbnk.Instruments[track.Voice].Type.ToString(); info.Volumes[i] = track.Volume; info.Pitches[i] = track.GetPitch(); info.Portamentos[i] = track.Portamento ? track.PortamentoTime : (byte)0; info.Pans[i] = track.GetPan(); Channel[] channels = track.Channels.ToArray(); // Copy so adding and removing from the other thread doesn't interrupt (plus Array looping is faster than List looping) if (channels.Length == 0) { info.Notes[i] = new byte[0]; info.Lefts[i] = 0; info.Rights[i] = 0; } else { var lefts = new float[channels.Length]; var rights = new float[channels.Length]; for (int j = 0; j < channels.Length; j++) { Channel c = channels[j]; lefts[j] = (float)(-c.Pan + 0x40) / 0x80 * c.Volume / 0x7F; rights[j] = (float)(c.Pan + 0x40) / 0x80 * c.Volume / 0x7F; } info.Notes[i] = channels.Where(c => c.State != EnvelopeState.Release).Select(c => c.Key).Distinct().ToArray(); info.Lefts[i] = lefts.Max(); info.Rights[i] = rights.Max(); } } }