Metropoli BBS
VIEWER: player.pas MODE: TEXT (CP437)
{$M 16384,0,384000} {player}
{$G+,S-,I-,A+,Q-,R-,E-,N-,X-,Y-,D+,F-,L-}
program player;

uses oma,sb_det3,textunit,omaems,dos{,memory};

const moduuli:string='ode2ptk'; {default module}
      frequency=45454; {5000-45454}

{{$define ripsamples} {savettaa samplet diskille}
{{$define purkka} {lukee sampledatan filen lopusta, ei 'oikeasta' kohdasta}

{$i loader.pas}
{$i device.pas}
{$i playing.pas}

var i:longint;
    c:integer;
    last:array[1..32] of byte;
    ch:char;
    stri:string;

function strr2(nro:longint):string;
var res:string;
begin
str(nro,res);
strr2:=res;
end;

procedure ulkonako; far;
begin
 text50;
 hidecursor;
 retrace;
 for i:=0 to (80*50-1) do
  mem[$b800:i+i+1]:=4 shl 4;
 for i:=0 to 79 do mem[$b800:i+i+1]:=1 shl 4;
 for i:=0 to 79 do mem[$b800:i+i+1+160*49]:=1 shl 4;

 if length(module.title)>0 then stri:='"'+module.title+'" ' else
  stri:='';
 mwrite(' player, copyright Kaj Björklund 1996. All rights reserved.',0,0,14+1 shl 4);
 mwrite(' BLASTER=A2'+strr2((base-$200) div $10)+'0h I'+strr2(irq)+' D'+strr2(dma)+
        ', playing '+stri+'at '+strr2(playspeed)+'Hz',0,49,14+1 shl 4);

{ mwrite('Name                     Rate     Length   Loop     End',2,16,14+1 shl 4);}
 for i:=1 to 31 do begin
  mwrite(' '+samples[i].name+' ',1,i+16,15+4 shl 4);
  if samples[i].used then begin
   if samples[i].loop.endi>0 then begin
    mwrite(strr2(samples[i].c2spd)+'Hz, vol:'+strr2(samples[i].volume)+', len:'+strr2(samples[i].length)
    +', loop:'+strr2(samples[i].loop.start)+'-'+strr2(samples[i].loop.endi),26,i+16,15+4 shl 4);
   end else
    mwrite(strr2(samples[i].c2spd)+'Hz, vol:'+strr2(samples[i].volume)+', len:'+strr2(samples[i].length),26,i+16,15+4 shl 4);
  end;
 end;
 mwrite('  Channel   Volume    Note      Effect    ',0,3,4 shl 4+14);
 for i:=1 to module.channels do begin
   mwrite('                                 ',1,i+3,7 shl 4);
 end;
end;

begin
 fillchar(last,sizeof(last),0);
 playspeed:=frequency; {5000-45454}

 randomize;
 sw_detect;

 if (got.base=false) or (got.irq=false) or (got.dma=false) then hw_detect;
 if (got.base=false) or (got.irq=false) or (got.dma=false) then begin
  writeln('no sb.');
  halt(1);
 end;

 base:=blaster.base;
 irq:=blaster.irq;
 dma:=blaster.dma;

 if paramcount>0 then moduuli:=paramstr(1);
 if paramcount=2 then begin
  val(paramstr(2),i,c);
  if (i>4999) and (i<45455) then playspeed:=i else playspeed:=22050;
 end;


 if not(load_mod(moduuli)) then halt(0);

 writeln('samplejen yhteiskoko ',(totalsamples+512) div 1024,'kB');
 writeln((memavail+512) div 1024,'kB vapaana.');
 writeln('paina nappulaa..');
 ch:=readkey;

 init;
 initplaying;
 interrupts:=65000;

 ulkonako;
 repeat
  asm sti; end;
  retrace;
  for i:=1 to module.channels do begin
   mwrite(strr2(i),2,i+3,7 shl 4+15);
   mwrite(strr2(channel[i].volume)+' ',12,i+3,7 shl 4);
   if channa[i].note<>132 then
    mwrite(notes[channa[i].note]+' ',22,i+3,7 shl 4)
     else if channa[i].lastnote<132 then
      mwrite(notes[channa[i].lastnote]+' ',22,i+3,8+7 shl 4);
   mwrite(effyt[channa[i].effy],32,i+3,7 shl 4);

   mwrite(' ',0,last[i]+16,4 shl 4);
   if channa[i].instru>0 then begin
    mwrite(#14,0,channa[i].instru+16,4 shl 4+12);
    last[i]:=channa[i].instru;
   end;
  end;
  case (interrupts shr 4 and 3) of
   0:mwrite('|',78,0,15+1 shl 4);
   1:mwrite('/',78,0,15+1 shl 4);
   2:mwrite('-',78,0,15+1 shl 4);
   3:mwrite('\',78,0,15+1 shl 4);
  end;
  case (interrupts shr 3 and 3) of
   0:mwrite('|',77,0,15+1 shl 4);
   1:mwrite('/',77,0,15+1 shl 4);
   2:mwrite('-',77,0,15+1 shl 4);
   3:mwrite('\',77,0,15+1 shl 4);
  end;
  case (interrupts and 3) of
   0:mwrite('|',76,0,15+1 shl 4);
   1:mwrite('/',76,0,15+1 shl 4);
   2:mwrite('-',76,0,15+1 shl 4);
   3:mwrite('\',76,0,15+1 shl 4);
  end;

  mwrite('Row : '+strr2(play.row)+'/64 ',42,4,15+4 shl 4);
  mwrite('Ord : '+strr2(play.order)+'/'+strr2(song.length)+' ',42,5,15+4 shl 4);
  mwrite('Pat : '+strr2(play.physpatta)+'/'+strr2(song.patterns)+' ',42,6,15+4 shl 4);
  mwrite('Spd : '+strr2(play.speed)+' at '+strr2(play.bpm)+'bpm ',42,7,15+4 shl 4);
  mwrite('Gls : '+strr2(byte(glissando)),42,8,15+4 shl 4);

  if keypressed then ch:=readkey;
  if keypressed then begin
   while keypressed do ch:=readkey;
   ch:=#255;
  end;
  case ch of
   'd','D':begin
            text25;
{            setmemtop(heapptr);}
            swapvectors;
            exec(getenv('COMSPEC'),'');
            swapvectors;
{            setmemtop(heapend);}
            while keypressed do ch:=readkey;
            writeln('press any key..');
            ch:=readkey;
            while keypressed do ch:=readkey;
            ch:=#255;
            ulkonako;
           end;
   '+':if master<64 then inc(master,1);
   '-':if master>0 then dec(master,1);
  end;
  if ch<>#27 then ch:=#255;
  mwrite('Master(+/-): '+strr2(master)+' ',0,1,15+4 shl 4);
 until (ch=#27);
 while keypressed do ch:=readkey;

 text25;
 writeln;
 writeln('Usage: PLAYER modfile[.MOD] [hz]');
 writeln;

 deinitplaying;
 deinit;
 free_mod;
end.
[ RETURN TO DIRECTORY ]