Пример #1
0
        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();
            }
        }
Пример #2
0
        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();
                }
            }
        }