BBS: Inland Empire Archive Date: 11-30-92 (21:17) Number: 377 From: RICH GELDREICH Refer#: NONE To: ALL Recvd: NO Subj: Mod Player/5 Conf: (2) Quik_Bas
'<<Part 5 Starts Here>>
CASE 1 'Port Down
C.Command(A) = 2
C.PortSpeed(A) = O
CASE 2 'Port Up
C.Command(A) = 3
C.PortSpeed(A) = O
CASE 3 'Port to Note
IF C.Period(A) > C THEN
C.Command(A) = 4
ELSE
C.Command(A) = 5
END IF
C.PortSpeed(A) = o
C.PortDest(A) = C
CASE 10 'Volume Slide
C.Command(A) = 1
IF O AND 15 THEN
C.VolumeSpeed(A) = -(O AND 15)
ELSE
C.VolumeSpeed(A) = O\16
END IF
CASE 11 'Position Jump
IF o<T.Length THEN
T.Pos = o
T.Line = 1
END IF
CASE 13 'Pattern Skip
T.Line = 1
END SELECT
END IF
T.Offset = T.Offset + 2
NEXT
T.ClicksLeft = T.Tempo
T.Line = T.Line - 1:IF T.Line = 0 THEN GOTO NewPattern
RETURN
NewPattern:
T.Pos = T.Pos + 1:IF T.Pos >= T.Length THEN T.Pos = 0
GOSUB StartNewPattern
RETURN
StartNewPattern:
LOCATE ,1
PRINT USING "Playing:###"; (T.Pos*100&)\T.Length;
PRINT "%";
T.Line = 64
PatternSegment = PatternSegment(T.Pos)
T.Offset = 0
RETURN
'=====================================================================
'Main mixer follows. While the assembly routine is playing one buffer,
'this routine mixes the other.
DoMix:
BufferOffset = BufferOffset XOR 512
Tm=0
FOR K = 0 TO 3
IF C.InactiveFlag(K)=False AND ChannelOn(K) THEN
GOSUB Mix
Tm = 1
END IF
NEXT
If Tm=0 then 'If all channels inactive then just clear buffer to
0's.
FOR B = BufferOffset TO BufferOffset + IntsPerClick-1
SampleBuffer(B) = 0
NEXT
END IF
T.ClicksLeft = T.ClicksLeft - 1
'If not time for a new line the process slide commands, if any.
IF T.ClicksLeft = 0 THEN GOSUB DoLine ELSE GOSUB DoCommands
RETURN
'=====================================================================
Mix:
MixesLeftToDo = IntsPerClick
OffsetNow = BufferOffset
'Preload all needed variables for speed.
DEF SEG = C.Segment(K)
o = C.Offset(K) 'current offset into sample
r = C.Remainder(K) 'current remainder(0-255) at
offset
v = C.Volume(K) 'volume(0-64)
h = C.HighStep(K) 'integer step
l = C.LowStep(K) 'remainder step(0-255)
IF C.RepLength(K) THEN
DO
'If sample loops the calculate the number of mixes left until
'we must loop...
PL&=C.LoopEnd(K)-o
'Thanks to QB's lack of unsigned ints, we must do this...
IF PL&<0 THEN PL&=PL&+65536
'<<-Continued On Next Message->>
--- MsgToss 2.0b
* Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)

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