void OnGUI()
    {
        GUI.skin = skin;

        if (Event.current.keyCode == KeyCode.Tab)
        {
            if (Event.current.type == EventType.KeyDown)
            {
                m_HideFields = true;
            }
            else
            {
                m_HideFields = false;
            }
        }
        Rect rect = new Rect(new Vector2(padding.x, padding.y), size);

        GUILayout.BeginArea(rect);

        GUILayout.BeginHorizontal( );

        GUILayout.BeginVertical(GUILayout.Width(size.x - volWidth - 32));
        GUILayout.BeginHorizontal( );
        GUILayout.Box("Ins " + keyboard.currentInstrument.ToString("X2"));
        if (GUILayout.Button("<"))
        {
            IncInstrument(-1);
        }
        if (GUILayout.Button(">"))
        {
            IncInstrument(1);
        }
        GUILayout.EndHorizontal( );
        GUILayout.EndVertical( );
        GUILayout.Space(16);
        GUILayout.BeginVertical(GUILayout.Width(volWidth));

        GUILayout.BeginHorizontal( );
        if (GUILayout.Button("Volume"))
        {
            m_CurrentScreen = EditorScreen.Volume;
        }
        if (GUILayout.Button("Note"))
        {
            m_CurrentScreen = EditorScreen.Pitch;
        }
        if (GUILayout.Button("Wave"))
        {
            m_CurrentScreen = EditorScreen.Wave;
        }
        GUILayout.EndHorizontal( );

        switch (m_CurrentScreen)
        {
        case EditorScreen.Volume:
            ArraySlider(instrument.volumeTable, 0, 0xF);

            GUILayout.FlexibleSpace( );
            GUILayout.BeginHorizontal( );
            GUILayout.Box(instrument.volumeTable.Length.ToString("X2"));
            if (GUILayout.Button("-"))
            {
                ChangeVolTableSize(-1);
            }
            if (GUILayout.Button("+"))
            {
                ChangeVolTableSize(1);
            }
            GUILayout.EndHorizontal( );
            break;

        case EditorScreen.Pitch:
            GUILayout.Box("Arpeggio");
            arpEnvelope = TabSafeTextField(arpEnvelope);
            break;

        case EditorScreen.Wave:
            bool samp = instruments.presets [keyboard.currentInstrument].samplePlayback;
            samp = GUILayout.Toggle(samp, "Custom waves");

            if (samp != instruments.presets [keyboard.currentInstrument].samplePlayback)
            {
                Instruments.InstrumentInstance ins = instruments.presets [keyboard.currentInstrument];
                ins.samplePlayback = samp;
                instruments.presets [keyboard.currentInstrument] = ins;
            }

            if (samp)
            {
                GUILayout.BeginHorizontal( );
                WaveButton(Instruments.InstrumentInstance.Wave.Pulse);
                WaveButton(Instruments.InstrumentInstance.Wave.Saw);
                WaveButton(Instruments.InstrumentInstance.Wave.Triangle);
                WaveButton(Instruments.InstrumentInstance.Wave.Sine);
                WaveButton(Instruments.InstrumentInstance.Wave.Sample);
                GUILayout.EndHorizontal( );

                switch (instrument.customWaveform)
                {
                case Instruments.InstrumentInstance.Wave.Pulse:
                    int pwmStart, pwmEnd, pwmSpeed;
                    pwmStart = instrument.pulseWidthMin;
                    pwmEnd   = instrument.pulseWidthMax;
                    pwmSpeed = instrument.pulseWidthPanSpeed;

                    GUILayout.BeginHorizontal( );
                    GUILayout.Box("PWM min", GUILayout.Width(96));
                    pwmStart = (int)GUILayout.HorizontalSlider(pwmStart, 0, 100);
                    GUILayout.Box(pwmStart.ToString(), GUILayout.Width(32));
                    GUILayout.EndHorizontal( );

                    GUILayout.BeginHorizontal( );
                    GUILayout.Box("PWM max", GUILayout.Width(96));
                    pwmEnd = ( int )GUILayout.HorizontalSlider(pwmEnd, 0, 100);
                    GUILayout.Box(pwmEnd.ToString( ), GUILayout.Width(32));
                    GUILayout.EndHorizontal( );

                    GUILayout.BeginHorizontal( );
                    GUILayout.Box("PWM spd", GUILayout.Width(96));
                    pwmSpeed = ( int )GUILayout.HorizontalSlider(pwmSpeed, 0, Instruments.InstrumentInstance.PWMSPEED_MAX - 1);
                    GUILayout.Box(pwmSpeed.ToString( ), GUILayout.Width(32));
                    GUILayout.EndHorizontal( );

                    if (pwmStart != instrument.pulseWidthMin ||
                        pwmEnd != instrument.pulseWidthMax ||
                        pwmSpeed != instrument.pulseWidthPanSpeed)
                    {
                        Instruments.InstrumentInstance ins = instrument;
                        ins.pulseWidthMin      = pwmStart;
                        ins.pulseWidthMax      = pwmEnd;
                        ins.pulseWidthPanSpeed = pwmSpeed;
                        instruments.presets [keyboard.currentInstrument] = ins;
                        FileManagement.fileModified = true;
                    }
                    break;

                case Instruments.InstrumentInstance.Wave.Sample:
                    if (GUILayout.Button("Load sample"))
                    {
                        Instruments.InstrumentInstance ins = instrument;
                        if (fileMan.LoadSample(ref ins.waveTable, ref ins.waveTableSampleRate))
                        {
                            instruments.presets [keyboard.currentInstrument] = ins;
                            FileManagement.fileModified = true;
                        }
                    }

                    if (instrument.waveTable != null && instrument.waveTable.Length > 0)
                    {
                        bool loopSamp = instrument.loopSample;

                        GUILayout.BeginHorizontal( );
                        GUILayout.Box(instrument.waveTable.Length + " samples (" + instrument.waveTableSampleRate + "Hz)");
                        loopSamp = GUILayout.Toggle(loopSamp, "Loop");
                        GUILayout.EndHorizontal( );

                        GUILayout.BeginHorizontal( );

                        int relNote = instrument.sampleRelNote;

                        if (GUILayout.Button("--"))
                        {
                            relNote -= 12;
                        }
                        if (GUILayout.Button("-"))
                        {
                            relNote--;
                        }

                        VirtualKeyboard.Note currNote = (VirtualKeyboard.Note)(relNote % 12 + 1);
                        GUILayout.Box(currNote.ToString().Replace('s', '#') + (relNote / 12).ToString());

                        if (GUILayout.Button("+"))
                        {
                            relNote++;
                        }
                        if (GUILayout.Button("++"))
                        {
                            relNote += 12;
                        }

                        if (instrument.sampleRelNote != relNote || loopSamp)
                        {
                            Instruments.InstrumentInstance ins = instrument;
                            ins.sampleRelNote = relNote;
                            ins.loopSample    = loopSamp;

                            instruments.presets[keyboard.currentInstrument] = ins;
                            FileManagement.fileModified = true;
                        }
                        //GUILayout.Toggle()
                        GUILayout.EndHorizontal( );
                    }

                    break;
                }
            }
            break;
        }

        GUILayout.EndVertical( );

        GUILayout.EndHorizontal( );
        GUILayout.EndArea( );
    }
Beispiel #2
0
    public void OnIrqCallback()
    {
        if (!m_IsPlaying)
        {
            return;
        }

        m_Counter++;

        if (m_Counter >= playbackSpeed)
        {
            if (m_IsStopping)
            {
                m_IsPlaying  = false;
                m_IsStopping = true;
                return;
            }

            m_Counter = 0;
            int patternBreakTarget = -1;

            for (int i = 0; i < data.channels; i++)
            {
                m_PlayingPattern = m_CurrentPattern;
                SongData.ColumnEntry col = data.GetPatternColumn(m_CurrentPattern, i);

                if (col == null)
                {
                    //m_Instruments [ i ].note = VirtualKeyboard.Note.NoteOff;
                    //psg.SetAttenuation ( i, 0 );
                    continue;
                }
                if (mute[i])
                {
                    m_Instruments[i].note = VirtualKeyboard.Note.NoteOff;
                }
                else
                {
                    int volume = col.data[m_CurrentLine, 2];
                    if (volume >= 0)
                    {
                        m_Instruments[i].relativeVolume = volume;
                    }

                    if (col.data[m_CurrentLine, 0] > 0)
                    {
                        VirtualKeyboard.Note note = VirtualKeyboard.GetNote(col.data[m_CurrentLine, 0]);
                        if (note == VirtualKeyboard.Note.NoteOff)
                        {
                            m_Instruments[i].note = VirtualKeyboard.Note.NoteOff;
                            psg.SetAttenuation(i, 0);
                        }
                        else if (col.data[m_CurrentLine, 1] < instruments.presets.Length)
                        {
                            m_PrevInstruments[i]            = m_Instruments[i];
                            m_Instruments[i]                = instruments.presets[col.data[m_CurrentLine, 1]];
                            m_Instruments[i].relativeVolume = volume >= 0 ? volume : 0xF;
                            m_Instruments[i].note           = note;
                            m_Instruments[i].noteOffset     = data.transposeTable[m_CurrentPattern][i];
                            m_Instruments[i].octave         = VirtualKeyboard.GetOctave(col.data[m_CurrentLine, 0]);
                        }
                    }
                }


                int fxVal = col.data [m_CurrentLine, 4];

                if (fxVal >= 0)
                {
                    switch (col.data [m_CurrentLine, 3])
                    {
                    //arpreggio
                    case 0x00:
                        if (fxVal == 0)
                        {
                            m_Instruments [i].arpeggio = new int [0];
                        }
                        else
                        {
                            int hiArp, loArp;
                            SplitByte(fxVal, out hiArp, out loArp);
                            m_Instruments [i].arpeggio = new int [3] {
                                0, loArp, hiArp
                            };
                            m_Instruments[i].arpLoopPoint = 3;
                        }
                        break;

                    case 0x01:
                        m_Instruments [i].portamentoSpeed = fxVal;
                        break;

                    case 0x02:
                        m_Instruments [i].portamentoSpeed = -fxVal;
                        break;

                    case 0x03:
                        if (m_Instruments [i].samplePlayback)
                        {
                            m_Instruments [i].pulseWidth = m_PrevInstruments [i].pulseWidth;
                        }
                        m_Instruments [i].SetAutoPortamento(m_PrevInstruments[i], fxVal);
                        break;

                    case 0x04:
                        int speed, depth;
                        SplitByte(fxVal, out depth, out speed);
                        m_Instruments [i].vibratoDepth = depth;
                        m_Instruments [i].vibratoSpeed = speed;
                        break;

                    case 0x08:
                        int left, right;
                        SplitByte(fxVal, out right, out left);
                        psg.SetStereo(i, left != 0, right != 0);
                        break;

                    case 0x0B:
                        //loop point
                        break;

                    case 0x0D:
                        if (m_CurrentPattern >= data.numPatterns - 1)
                        {
                            break;
                        }

                        if (fxVal < data.patternLength)
                        {
                            m_PatternBreakTarget = fxVal;
                        }
                        else
                        {
                            m_PatternBreakTarget = 0;
                        }

                        patternBreakTarget = m_PatternBreakTarget;
                        break;

                    case 0x0F:
                        playbackSpeed = fxVal;
                        break;

                    case 0x10:
                        m_Instruments [i].noteDelay = fxVal;
                        break;

                    case 0x20:
                        int mode, fb;
                        SplitByte(fxVal, out mode, out fb);

                        int val = (mode << 1) | fb;
                        m_Instruments[i].noiseMode = new int[] { val };
                        break;

                    case 0x40:
                        m_Instruments [i].pulseWidthPanSpeed = fxVal;
                        break;

                    case 0xFF:
                        psg.PSGDirectWrite(fxVal);
                        break;
                    }
                }
            }

            m_MoveLine++;
            if (patternBreakTarget >= 0)
            {
                m_CurrentLine = patternBreakTarget;
                m_CurrentPattern++;
            }
            else
            {
                m_CurrentLine++;
                if (m_CurrentLine >= data.patternLength)
                {
                    m_CurrentLine = 0;
                    m_CurrentPattern++;

                    if (m_CurrentPattern >= data.numPatterns)
                    {
                        m_CurrentPattern = m_PatternLoop;
                        if (m_Loops >= 0)
                        {
                            m_IsStopping = m_Loops == 0;
                            m_Loops--;
                        }
                    }
                }
            }
        }

        for (int i = 0; i < data.channels; i++)
        {
            if (m_Instruments [i].noteDelay > 0)
            {
                m_Instruments [i].noteDelay--;
                m_PrevInstruments [i].UpdatePSG(psg, i);
                m_ChnAttenuation[i] = m_PrevInstruments[i].GetCurrentVol();
            }
            else
            {
                m_Instruments [i].UpdatePSG(psg, i);
                m_ChnAttenuation[i] = m_Instruments[i].GetCurrentVol();
            }

            if (mute[i])
            {
                m_ChnAttenuation[i] = 0;
            }
        }
    }