(*-------------------------------------------------------------------------*)
(*                                                                         *)
(*  Amiga Oberon Interface Module:                    Date: 25-Dec-91      *)
(*                                                                         *)
(*   © 1991 by ph. gressly                                                 *)
(*                                                                         *)
(*-------------------------------------------------------------------------*)

MODULE SmusPlayer;

IMPORT e: Exec,
       S: SYSTEM,
       d: Dos;



CONST  smusplayerName * = "smusplayer.library";

TYPE smusPlayerLibraryPtr * = POINTER TO smusPlayerLibrary;
     smusPlayerLibrary * = STRUCT (LibNode * : e.Library)
                              SysBase*: e.ExecBasePtr;
                              DosBase*: d.DosLibraryPtr;
                              SegList*: e.ListPtr;
                              Flags*: BYTE;
                              BusyFlag*: BYTE;
                              WaitList*: e.List;
                              SignalNum*: INTEGER;
                              SignalMask*: LONGINT;
                              RSWaitList*: e.List;
                           END;


(*********************** SPNote and SNote ***********************)


             SPNotePtr *= POINTER TO SPNote;
             SPNote *= STRUCT
                         iName*: POINTER TO CHAR;
                         SNote*: INTEGER;
                         vol  *: INTEGER;
                         voice*: BYTE;
                         pri*: BYTE;
                      END;

CONST SpDEFAULTINAME* = NIL;
      SpMAXVOL      * = 255;
      SpDYNAMICVOICE* = 0;
      SpPLAYERPRI   * = 0;

CONST (* SNote *)
      noteChord * = 128;       (* chord *)
      noteTieOut* = 64;        (* tied to the next note. *)

      noteN3    * = 16;    (* Tripplet = n/3*)
      noteN5    * = 32;    (* n/5 *)
      noteN7    * = 48;    (* n/7 *)

      dotted    * = 8;

      noteD1    * = 0;   (* full note *)
      noteD2    * = 1;   (* halve note *)
      noteD4    * = 2;   (* 1/4 *)
      noteD8    * = 3;
      noteD16   * = 4;
      noteD32   * = 5;
      noteD64   * = 6;
      noteD128  * = 7;   (* 1/128 note *)


(******************** RefInstrument *****************************)


TYPE RefInstrument = STRUCT
                        Register : BYTE;
                        Type     : BYTE;   (* name = 0; MIDI = 1 *)
                        data1, data2: BYTE;
                        name: POINTER TO CHAR;
                     END;

(******************* vars and procs *****************************)


CONST SpERROR *= -1; (* procedures return -1 on error. *)

VAR smus*: smusPlayerLibraryPtr; (* pointer to library-base *)


PROCEDURE FindInstr   *{smus,-102}(InstNname{8}: S.ADDRESS): S.ADDRESS;
PROCEDURE LoadAux     *{smus, -66}(InstFileName{8}: S.ADDRESS): LONGINT;
PROCEDURE LoadScore   *{smus, -30}(ScoreName{8}: S.ADDRESS;
                                 InstDir{9}  : S.ADDRESS): LONGINT;
PROCEDURE LoadSet     *{smus, -42}(SetFileName{8}: S.ADDRESS): LONGINT;
PROCEDURE PitchBend   *{smus,-120}(d0{0}: LONGINT;d1{1}: LONGINT): LONGINT;
PROCEDURE PlayNote    *{smus, -84}(SPNote{8}: SPNotePtr): LONGINT;
PROCEDURE PlayScore   *{smus, -54}(score{0}:LONGINT;
                                 repeats{1}:LONGINT):LONGINT;
PROCEDURE PlayTone    *{smus, -90}(SPNote{8}: SPNotePtr): LONGINT;
PROCEDURE ReleaseTone *{smus, -96}(voice{0}: LONGINT);
PROCEDURE SetDefault  *{smus, -78}(InstName{8}: S.ADDRESS): LONGINT;
PROCEDURE SetReturnSig*{smus,-108}(SigMask{0}: LONGSET);
PROCEDURE Stop        *{smus, -60}();
PROCEDURE TransTune   *{smus,-114}(d0{0}: LONGINT;d1{1}: LONGINT): LONGINT;
PROCEDURE UnLoadAux   *{smus, -72}(): LONGINT;
PROCEDURE UnLoadScore *{smus, -36}();
PROCEDURE UnLoadSet   *{smus, -48}();


(****************************************************************)


BEGIN  (* SmusPlayer: Open and Close *)
   smus := e.OpenLibrary(smusplayerName, 0);
   IF smus = NIL THEN
     HALT(1)
   END;
CLOSE
   IF smus # NIL THEN
      e.CloseLibrary(smus)
   END
END SmusPlayer.

