Mod Player/6

 BBS: Inland Empire Archive
Date: 11-30-92 (21:18)             Number: 378
From: RICH GELDREICH               Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: Mod Player/6                   Conf: (2) Quik_Bas
'<<Part 6 Starts Here>>
            MixesTillRepeat& = (PL& * 256 - (r+256)) \ ((h * 256&) + l)

         'If there is any remainder left, then add 1 to MixesTillRepeat.
            IF ( (PL& * 256 - (r+256)) MOD ((h * 256&) + l) ) THEN
                MixesTillRepeat&=MixesTillRepeat&+1
            END IF

            IF MixesLeftToDo >= MixesTillRepeat& THEN
                MixesToDo      = MixesTillRepeat&
                MixesLeftToDo  = MixesLeftToDo - MixesToDo

                'Mix whatever is left of the sample...
                GOSUB LowLevelMix

               'Throw back our pointer to the loop start.
                IF C.LoopEnd(K)  = C.Length(K) THEN'If first time,setup
                    o            = C.RepStart(K)    'for next loop.
                    C.LoopEnd(K) = C.RepStart(K) + C.RepLength(K)
                ELSE
                    o            = o - C.RepLength(K)
                ENDIF
            ELSE
                EXIT DO
            END IF
        LOOP
    END IF

    'Mix whatever is left.
    MixesToDo = MixesLeftToDo
    Gosub LowLevelMix

    'Store back the offset and its remainder.
    C.Offset(K) = o
    C.Remainder(K) = r

    'If sample doesn't loop, and the offset passed the end of the
sample,
    'then turn off the channel.
    IF C.RepLength(K) = 0 AND UnsignedComp(o, C.Length(K)) > 0 THEN
        C.InactiveFlag(K) = True
    END IF
RETURN

LowLevelMix:
    'Copies the samples from the instruments to the mixing buffer.
    'If this is the first copy (Tm=0), then just store the sample,
    'otherwise add it into the buffer.
    If Tm=0 then
        'Since most channels will have a volume of 64 (max), then only
        'use the volume lookup table (which is slow) when needed...
        IF v <> 64 THEN
            FOR OffsetNow = OffsetNow TO OffsetNow + MixesToDo - 1
                SampleBuffer(OffsetNow) = VolumeTable(v, PEEK(o))
                o = o + h
                'If remainder overflows, then increment the offset by 1
                'and adjust the remainder back down.
                r = r + l: IF r => 0 THEN r = r - 256: o = o + 1
            NEXT
        ELSE
            FOR OffsetNow = OffsetNow TO OffsetNow + MixesToDo - 1
                SampleBuffer(OffsetNow) = PEEK(o)
                o = o + h
                r = r + l: IF r => 0 THEN r = r - 256: o = o + 1
            NEXT
        END IF
    ELSE
        IF v <> 64 THEN
            FOR OffsetNow = OffsetNow TO OffsetNow + MixesToDo - 1
                SampleBuffer(OffsetNow) = SampleBuffer(OffsetNow) + _
VolumeTable(v, PEEK(o))
                o = o + h
                r = r + l: IF r => 0 THEN r = r - 256: o = o + 1
            NEXT
        ELSE
            FOR OffsetNow = OffsetNow TO OffsetNow + MixesToDo - 1
                SampleBuffer(OffsetNow)=SampleBuffer(OffsetNow)+PEEK(o)
                o = o + h
                r = r + l: IF r => 0 THEN r = r - 256: o = o + 1
            NEXT
        END IF
    END IF
RETURN
'=====================================================================
'Process the MOD sliding commands...
DoCommands:
    FOR A=0 TO 3
        IF C.Command(A) THEN
            SELECT CASE C.Command(A)
            CASE 1                      'Volume slide
                C.Volume(A)=C.Volume(A)+C.VolumeSpeed(A)
                IF C.Volume(A)<0 THEN
                    C.Volume(A)=0
                    C.Command(A)=0
                ELSEIF C.Volume(A)>64 THEN
'<<-Continued On Next Message->>

--- MsgToss 2.0b
 * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET