Skip to content

Tracker player update order

Persune edited this page Jan 24, 2023 · 4 revisions

Documents the player update order of the tracker.

CSoundGen::PlayChannelNotes();
    CSoundGen::PlayNote();
        CSoundGen::EvaluateGlobalEffects();
        CChannelHandler::HandleDelay();
        CChannelHandler::HandleNoteData();
            // (handle echo buffer)
                CChannelHandler::WriteEchoBuffer();
            // (clear note cut and note release)
            // (handle effects)
                CChannelHandler::HandleEffect();
            // (handle volume command and Nxy)
            // (handle instrument command)
            switch (pNoteData->Note) {
                case NONE:
                    HandleEmptyNote();
                    break;
                case HALT:
                    m_bRelease = false;
                    HandleCut();
                    break;
                case RELEASE:
                    HandleRelease();
                    break;
                default:
                    HandleNote(pNoteData->Note, pNoteData->Octave);
                    break;
            }
            // (handle note slide)
            if (new_instrument || note_trigger)
                CChannelHandler::HandleInstrument();
                    if (new_instrument)
                        m_pInstHandler->LoadInstrument(pInstrument);
                    if (note_trigger)
                        m_pInstHandler->TriggerInstrument();
CSoundGen::UpdatePlayer();
CSoundGen::UpdateChannels();  // run instruments, effects, etc.
    CChannelHandler::ProcessChannel();
        UpdateDelay();
        UpdateNoteCut();
        UpdateNoteRelease();
        UpdateNoteVolume();           // // //
        UpdateTranspose();            // // //
        if (m_iVolSlideTarget < 0)    // // !!
            UpdateVolumeSlide();
        else
            UpdateTargetVolumeSlide();
        UpdateVibratoTremolo();
        UpdateEffects();
        if (m_pInstHandler) m_pInstHandler->UpdateInstrument();       // // //
CSoundGen::UpdateAPU();  // write to registers