Ejemplo n.º 1
0
 private void Update()
 {
     if (state == PlayState.Stopped)
     {
         return;
     }
     if (sequencer.Playing)
     {
         sequencer.KeyShift    = clip.Key + keyShift;
         sequencer.VolumeScale = clip.Volume * volume;
         sequencer.TempoScale  = clip.TempoScale * tempoScale;
     }
     if (state == PlayState.Playing)
     {
         if (!sequencer.Playing)
         {
             Stop();
         }
         return;
     }
     if (state != PlayState.Prepareing)
     {
         return;
     }
     if (sequencer.Playing)
     {
         return;
     }
     if (syntheStation == null)
     {
         return;
     }
     if (clip.Dirty)
     {
         syntheStation.PrepareClip(clip);
     }
     if (!clip.Prepared)
     {
         return;
     }
     if (!clip.Ready)
     {
         Stop();
         return;
     }
     for (int i = 0; i < clip.Ports.Length; i++)
     {
         var s = (int)clip.Ports[i];
         if ((s >= 0) && (s <= syntheStation.Synthesizers.Count))
         {
             sequencer.SetSynthesizer(i, syntheStation.Synthesizers[s], clip.VoiceMask);
         }
     }
     sequencer.KeyShift    = clip.Key + keyShift;
     sequencer.VolumeScale = clip.Volume * volume;
     sequencer.TempoScale  = clip.TempoScale * tempoScale;
     sequencer.Play(clip.Unit.Sequence, clip.Unit.ToneMap, fadeInTime, clip.Loop);
     state = PlayState.Playing;
 }
Ejemplo n.º 2
0
            private LinkedList <float[]> generateAudioSamples()
            {
                MyMMLSequencer       seq = station.acgState.sequencer;
                MyMixer              mix = station.acgState.mixer;
                List <MySynthesizer> sss = station.acgState.synthesizers;

                if ((seq == null) || (mix == null) || (sss == null))
                {
                    return(null);
                }
                mix.Reset();
                for (int j = 0; j < sss.Count; j++)
                {
                    seq.SetSynthesizer(j, sss[j], toneSet, toneMap, 0xffffffffU);
                }
                seq.KeyShift    = clip.Key;
                seq.VolumeScale = clip.Volume;
                seq.TempoScale  = clip.Tempo;
                seq.Play(mml, 0.0f, false);

                LinkedList <float[]> temp     = new LinkedList <float[]>();
                const int            workSize = 4096;

                float[] work      = new float[workSize * AudioClipGeneratorState.numChannels];
                bool    zeroCross = false;

                for (;;)
                {
                    if (station.disabled)
                    {
                        return(null);
                    }
                    if (seq.Playing)
                    {
                        mix.Update();
                    }
                    Array.Clear(work, 0, work.Length);
                    int numSamples = mix.Output(work, AudioClipGeneratorState.numChannels, workSize);
                    if (numSamples == 0)
                    {
                        if (!zeroCross)
                        {
                            mix.Update();
                            continue;
                        }
                        break;
                    }
                    {
                        float[] block = new float[numSamples * AudioClipGeneratorState.numChannels];
                        Array.Copy(work, block, numSamples * AudioClipGeneratorState.numChannels);
                        temp.AddLast(block);
                        float v0 = work[(numSamples - 1) * AudioClipGeneratorState.numChannels + 0];
                        float v1 = work[(numSamples - 1) * AudioClipGeneratorState.numChannels + 1];
                        zeroCross = (v0 == 0.0f) && (v1 == 0.0f);
                    }
                }
                return(temp);
            }
Ejemplo n.º 3
0
 void Update()
 {
     if (state == PlayState.Stopped)
     {
         return;
     }
     if (sequencer.Playing)
     {
         sequencer.KeyShift    = clip.Key + keyShift;
         sequencer.VolumeScale = clip.Volume * volume;
         sequencer.TempoScale  = clip.Tempo * tempo;
     }
     if (state == PlayState.Playing)
     {
         if (!sequencer.Playing)
         {
             Stop();
         }
         return;
     }
     if (state != PlayState.Prepareing)
     {
         return;
     }
     if (sequencer.Playing)
     {
         return;
     }
     if (clip.Dirty)
     {
         syntheStation.PrepareClip(clip);
     }
     if (!clip.Prepared)
     {
         return;
     }
     if (!clip.Valid)
     {
         Stop();
         return;
     }
     for (int i = 0; i < clip.Unit.Synthesizers.Count; i++)
     {
         sequencer.SetSynthesizer(i, clip.Unit.Synthesizers[i], clip.Unit.ToneSet, clip.Unit.ToneMap, 0xffffffffU);
     }
     sequencer.AppDataEvent = AppDataEvent;
     sequencer.PlayingEvent = PlayingEvent;
     sequencer.KeyShift     = clip.Key + keyShift;
     sequencer.VolumeScale  = clip.Volume * volume;
     sequencer.TempoScale   = clip.Tempo * tempo;
     sequencer.Play(clip.Unit.Sequence, fadeInTime, false);
     state = PlayState.Playing;
 }
 public void Play(MyMMLSequence mml, List <object> toneSet, Dictionary <int, int> toneMap, float fadeInTime, AppDataEventFunc appDataEventFunc, PlayingEventFunc playingEventFunc)
 {
     if (Sequencer != null)
     {
         Sequencer.PlayingEvent = playingEventFunc;
         Sequencer.AppDataEvent = appDataEventFunc;
         Sequencer.SetSynthesizer(0, Synthesizer, toneSet, toneMap, 0xffffffffU);
         Sequencer.KeyShift    = 0;
         Sequencer.VolumeShift = 0.0f;
         Sequencer.TempoShift  = 0.0f;
         Sequencer.Play(mml, fadeInTime, false);
     }
 }
Ejemplo n.º 5
0
 private void play(MyMMLClip clip)
 {
     if (sequencer == null)
     {
         sequencer = new MyMMLSequencer(syntheStation.TickFrequency);
         syntheStation.AddSequencer(sequencer);
     }
     else
     {
         sequencer.Stop(0.0f);
     }
     for (int j = 0; j < syntheStation.Synthesizers.Count; j++)
     {
         sequencer.SetSynthesizer(j, syntheStation.Synthesizers[j], clip.VoiceMask);
     }
     sequencer.VolumeScale = clip.Volume;
     sequencer.TempoScale  = clip.TempoScale;
     sequencer.KeyShift    = clip.Key;
     sequencer.Play(clip.Unit.Sequence, clip.Unit.ToneMap, 0.0f, false);
 }
    public AudioClip CreateAudioClip(string name, MyMMLSequence mml, List <object> toneSet, Dictionary <int, int> toneMap)
    {
        const int      frequency   = 44100;
        const int      numChannels = 2;
        MyMixer        mix         = new MyMixer(frequency, true);
        MySynthesizer  ss0         = new MySynthesizerPM8(mix);
        MyMMLSequencer seq         = new MyMMLSequencer(mix.TickFrequency);

        mix.TickCallback = () => seq.Tick();

        seq.SetSynthesizer(0, ss0, toneSet, toneMap, 0xffffffffU);
        seq.Play(mml, 0.0f, false);

        int totalSamples              = 0;
        LinkedList <float[]> temp     = new LinkedList <float[]>();
        const int            workSize = 4096;

        float[] work  = new float[workSize * numChannels];
        bool    first = true;

        for (;;)
        {
            Array.Clear(work, 0, work.Length);
            if (seq.Playing)
            {
                mix.Update();
            }
            int numSamples = mix.Output(work, numChannels, workSize);
            if (numSamples == 0)
            {
                break;
            }
            if (first)
            {
                // skip leading zeros.
                for (var i = 0; i < numSamples; i++)
                {
                    if ((work[i * 2 + 0] != 0.0f) || (work[i * 2 + 1] != 0.0f))
                    {
                        first       = false;
                        numSamples -= i;
                        float[] block = new float[numSamples * numChannels];
                        Array.Copy(work, i * 2, block, 0, numSamples * numChannels);
                        temp.AddLast(block);
                        break;
                    }
                }
            }
            else
            {
                float[] block = new float[numSamples * numChannels];
                Array.Copy(work, block, numSamples * numChannels);
                temp.AddLast(block);
            }
            totalSamples += numSamples;
        }
        AudioClip clip = AudioClip.Create(name, totalSamples, numChannels, frequency, false);
        int       pos  = 0;

        foreach (var block in temp)
        {
            clip.SetData(block, pos);
            pos += block.Length / numChannels;
        }
        ss0.Terminate();
        mix.Terminate();
        return(clip);
    }