home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 4: The Falcon Archive / nf_archive_four_v1.0.iso / ARCHIVE / WORK / MSX / GTK08777.ZIP / GTK.DEV / SOURCES.NEW / GT2PLAYR.S < prev    next >
Text File  |  1996-08-02  |  120KB  |  3,970 lines

  1. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  2. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  3. *                            *
  4. *               DSP-replay routine            *
  5. *        for Graoumf Tracker modules (.GT2)        *
  6. *            Falcon 030                *
  7. *            Code 68030                *
  8. *                            *
  9. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  10. *                            *
  11. *    Routines du soundtracker                *
  12. *    Constantes devant être déjà définies:            *
  13. *    - NBRTRACK_MAXI (sauf si NBRVOIES_MAXI est défini)        *
  14. *    - CONST_T. Si celui-ci est non nul:            *
  15. *        USER_T                        *
  16. *        TOTAL_T                    *
  17. *    Macros devant être déjà définies:            *
  18. *    - sndkernel                    *
  19. *                            *
  20. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  21. * Version     : 2/8/1996, v0.862                    *
  22. * Tab setting : 11                        *
  23. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈(C)oderight L. de Soras 1994-96*
  24. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  25.  
  26.  
  27.  
  28.     opt    p=68030
  29.     opt    s-        ; Pas de table des symboles
  30.  
  31.  
  32.  
  33. *~~~ Constantes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  34.  
  35. ;--- Contrôle du Soundtracker ------------------------------------------------
  36. NBRSAMPLES_MAXI:    Equ    1+255    ; Nombre maximum de samples (+1 vide)
  37. NBRINSTR_MAXI:    Equ    1+255    ; Nombre maximum d'instruments (+1 vide)
  38. NBRPATTERNS_MAXI:    Equ    256+1    ; Nombre maximum de patterns (+1 vide)
  39. NBRVOLENV_MAXI:    Equ    1+63    ; Nombre maximum d'enveloppes de volume (+1 vide)
  40. NBRTONENV_MAXI:    Equ    1+63    ; Nombre maximum d'enveloppes de tonalité (+1 vide)
  41. NBRPANENV_MAXI:    Equ    1+63    ; Nombre maximum d'enveloppes de panning (+1 vide)
  42.  
  43.         IfD    NBRVOIES_MAXI
  44.         IfND    NBRTRACK_MAXI
  45. NBRTRACK_MAXI:    Equ    NBRVOIES_MAXI    ; Par défaut, nbr de pistes = nbr de voies
  46.         EndC
  47.         EndC
  48.  
  49. CHECK:        Equ    2    ; 0 = aucune vérification (un peu + rapide, - fiable)
  50.                 ; 1 = vérifie lors de chaque opération que les
  51.                 ;     résultats sont bien dans les bons intervalles
  52.                 ; 2 = Idem que 1 mais vérifie aussi l'intégrité
  53.                 ;     des paramètres donnés.
  54.  
  55.         IfNe    CHECK
  56. PERIOD_MAXI:    Equ    32575
  57. PERIOD_MINI:    Equ    71
  58.         EndC
  59.  
  60. HANDLE_ENVELOPES:    Equ    1    ; 1 = gestion des enveloppes
  61.                 ; 0 = pas de gestion (plus rapide)
  62.  
  63.         IfNe    HANDLE_ENVELOPES
  64.           IfNe    CHECK>1
  65. ENV_COMMANDMAX:    Equ    16    ; Nombre de commandes maximum par tick
  66.                 ; dans une enveloppe (permet d'éviter
  67.                 ; un blocage si une enveloppe a une
  68.                 ; boucle sans fin sans commande Wait).
  69.           EndC
  70.         EndC
  71.  
  72. ;--- Numéros des commandes des enveloppes ------------------------------------
  73. ENV_COM_END:    Equ    $00
  74. ENV_COM_JUMP:    Equ    $01
  75. ENV_COM_WAIT:    Equ    $02
  76. ENV_COM_SET_COUNTER:    Equ    $03
  77. ENV_COM_LOOP:    Equ    $04
  78. ENV_COM_KEY_OFF:    Equ    $05
  79.  
  80. ENV_COM_SET_VOLUME:    Equ    $80
  81. ENV_COM_SET_VOL_STEP    Equ    $81
  82. ENV_COM_SET_VOL_SPD    Equ    $82
  83. ENV_COM_TREMOLO_ON    Equ    $83
  84. ENV_COM_TREMOLO_OFF    Equ    $84
  85. ENV_COM_SET_TRM_WID:    Equ    $85
  86. ENV_COM_SET_TRM_SPD:    Equ    $86
  87. ENV_COM_TREMOR_ON:    Equ    $87
  88. ENV_COM_TREMOR_OFF:    Equ    $88
  89. ENV_COM_SET_TREMOR_1:    Equ    $89
  90. ENV_COM_SET_TREMOR_2:    Equ    $8A
  91.  
  92. ENV_COM_SET_TONE:    Equ    $A0
  93. ENV_COM_SET_TON_STEP:    Equ    $A1
  94. ENV_COM_SET_TON_SPD:    Equ    $A2
  95. ENV_COM_VIBRATO_ON:    Equ    $A3
  96. ENV_COM_VIBRATO_OFF:    Equ    $A4
  97. ENV_COM_SET_VIB_WID:    Equ    $A5
  98. ENV_COM_SET_VIB_SPD:    Equ    $A6
  99.  
  100. ENV_COM_SET_PANNING:    Equ    $C0
  101. ENV_COM_SET_PAN_STEP:    Equ    $C1
  102. ENV_COM_SET_PAN_SPD:    Equ    $C2
  103.  
  104.  
  105.  
  106. *~~~ Macros ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  107.  
  108. ;≡≡≡ Pour le soundtracker ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  109.  
  110. ;--- Initialisation des enveloppes -------------------------------------------
  111. env_initialisation:    Macro
  112.     ; Paramètres :
  113.     ; 1) Registre d'adresse pointant sur le descripteur de la voie
  114.     ; 2) 0 si aucune enveloppe à mettre, sinon paramètre 3 pris en compte
  115.     ; 3) Registre d'adresse pointant sur le nouvel instrument
  116.  
  117.     IfEq    \2
  118.  
  119.     clr.w    nevol_t(\1)    ; Efface les numéros d'enveloppe
  120.     clr.w    neton_t(\1)
  121.     clr.w    nepan_t(\1)
  122.  
  123.     Else            ; Réinitialise tous les paramètres
  124.  
  125.     move.w    volenv_i(\3),nevol_t(\1)    ; Enveloppe de volume
  126.     beq.s    .suite1\@
  127.     env_volume_init    \1
  128. .suite1\@:
  129.     move.w    tonenv_i(\3),neton_t(\1)    ; Enveloppe de tonalité
  130.     beq.s    .suite2\@
  131.     env_tone_init    \1
  132. .suite2\@:
  133.     move.w    panenv_i(\3),nepan_t(\1)    ; Enveloppe de panning
  134.     beq.s    .suite3\@
  135.     env_panning_init    \1
  136. .suite3\@:
  137.     EndC
  138.  
  139.     EndM
  140.  
  141. env_volume_init:    Macro
  142.     ; Paramètres:
  143.     ; 1) Registre d'adresse pointant sur le descripteur de la voie
  144.     clr.w    ev_waitcpt_t(\1)
  145.     clr.w    ev_loopcpt_t(\1)
  146.     move.w    #$4000,ev_volume_t(\1)
  147.     clr.w    ev_volstep_t(\1)
  148.     move.w    #1,ev_volspeed_t(\1)
  149.     clr.w    ev_volcpt_t(\1)
  150.     clr.b    ev_tremoloflag_t(\1)
  151.     clr.b    ev_tremorflag_t(\1)
  152.     clr.b    ev_tremolospeed_t(\1)
  153.     clr.b    ev_tremolowidth_t(\1)
  154.     clr.b    ev_tremolocpt_t(\1)
  155.     clr.b    ev_tremolotype_t(\1)
  156.     move.b    #3,ev_tremortime1_t(\1)
  157.     move.b    #3,ev_tremortime2_t(\1)
  158.     clr.b    ev_tremorsection_t(\1)
  159.     clr.b    ev_tremorcpt_t(\1)
  160.     clr.w    pevol_t(\1)    ; Position dans l'enveloppe à 0
  161.     move.w    #data_e,devol_t(\1)    ; Pointeur sur les section courante (Normale ici)
  162.     EndM
  163.  
  164. env_tone_init:    Macro
  165.     ; Paramètres:
  166.     ; 1) Registre d'adresse pointant sur le descripteur de la voie
  167.     clr.w    et_waitcpt_t(\1)
  168.     clr.w    et_loopcpt_t(\1)
  169.     move.w    #$1000,et_tone_t(\1)
  170.     clr.w    et_tonestep_t(\1)
  171.     move.w    #1,et_tonespeed_t(\1)
  172.     clr.w    et_tonecpt_t(\1)
  173.     clr.b    et_vibratoflag_t(\1)
  174.     clr.b    et_vibratospeed_t(\1)
  175.     clr.b    et_vibratowidth_t(\1)
  176.     clr.b    et_vibratocpt_t(\1)
  177.     clr.b    et_vibratotype_t(\1)
  178.     clr.w    peton_t(\1)    ; Position dans l'enveloppe à 0
  179.     move.w    #data_e,deton_t(\1)    ; Pointeur sur les section courante (Normale ici)
  180.     EndM
  181.  
  182. env_panning_init:    Macro
  183.     ; Paramètres:
  184.     ; 1) Registre d'adresse pointant sur le descripteur de la voie
  185.     clr.w    ep_waitcpt_t(\1)
  186.     clr.w    ep_loopcpt_t(\1)
  187.     move.w    #$800,ep_pan_t(\1)
  188.     clr.w    ep_panstep_t(\1)
  189.     move.w    #1,ep_panspeed_t(\1)
  190.     clr.w    ep_pancpt_t(\1)
  191.     clr.w    peton_t(\1)    ; Position dans l'enveloppe à 0
  192.     move.w    #data_e,deton_t(\1)    ; Pointeur sur les section courante (Normale ici)
  193.     EndM
  194.  
  195.  
  196.  
  197. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  198.  
  199.     Section    Text
  200.  
  201.  
  202.  
  203. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  204.  
  205. ******************************************************************************
  206. **                                  **
  207. *    Bibliothèque des fonctions de contrôle du soundtracker        *
  208. **                                  **
  209. ******************************************************************************
  210.  
  211.  
  212.  
  213. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  214. *    Installe le player de .GTK                *
  215. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  216. gtkpl_player_on:
  217.     movem.l    d1-a5,-(sp)
  218.     tst.w    gtkpl_flag_installed
  219.     bne    .error        ; Déjà installé
  220.  
  221.     move.w    #$ffff,-(sp)
  222.     sndkernel    reserve_track
  223.     addq.l    #2,sp
  224.     tst.w    d0
  225.     bmi    .error2
  226.     move.w    d0,gtkpl_num_track
  227.  
  228. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  229. ; Initialise les données principales du module
  230.     lea    gtkpl_module_inf2,a0    ; a0 pointe sur les infos du mod
  231.     lea    gtkpl_module_inf1,a1    ; a1 pointe sur les adr du mod
  232.  
  233.     move.w    #1,mod_nbrtrack(a0)
  234.     move.w    #1,mod_songlen(a0)
  235.     clr.w    mod_songrep(a0)
  236.     clr.w    mod_songpos(a0)
  237.     move.w    #NBRPATTERNS_MAXI-1,mod_numpat(a0)    ; Le pattern bidon
  238.     clr.w    mod_linepos(a0)
  239.     clr.w    mod_cursongpos(a0)
  240.     clr.w    mod_curlinepos(a0)
  241.     move.w    #6,mod_speed(a0)
  242.     clr.w    mod_patrep(a0)
  243.     move.w    #-1,mod_nbrticks(a0)
  244.     move.w    #1,mod_vblnumber(a0)
  245.     clr.w    mod_vblcpt(a0)
  246.     move.w    #125,-(sp)
  247.     bsr    gtkpl_set_tempo    ; Fixe le tempo par défaut: 125 BPM
  248.     addq.l    #2,sp
  249.  
  250.     move.l    #gtkpl_song_bidon,adr_song(a1)
  251.     move.l    #gtkpl_pat_bidon,adr_pattern(a1)
  252.  
  253. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  254. ; Initialise par défaut les adresse des principaux chunks
  255.     lea    gtkpl_sample_bidon,a3    ; Les samples
  256.     lea    adr_samples(a1),a2
  257.     move.w    #NBRSAMPLES_MAXI-1,d1
  258. .loop1:    move.l    a3,(a2)+
  259.     dbra    d1,.loop1
  260.     lea    gtkpl_zone_vide,a3    ; et leurs buffers de bouclage
  261.     lea    adr_repbuf(a1),a2
  262.     move.w    #NBRSAMPLES_MAXI-1,d1
  263. .loop2:    move.l    a3,(a2)+
  264.     dbra    d1,.loop2
  265.  
  266.     lea    gtkpl_instr_bidon,a3    ; Les instruments
  267.     lea    adr_instrset(a1),a2
  268.     move.w    #NBRINSTR_MAXI-1,d1
  269. .loop3:    move.l    a3,(a2)+
  270.     dbra    d1,.loop3
  271.  
  272.     lea    gtkpl_volenv_bidon,a3    ; Les enveloppes de volume
  273.     lea    adr_evol(a1),a2
  274.     move.w    #NBRVOLENV_MAXI-1,d1
  275. .loop4:    move.l    a3,(a2)+
  276.     dbra    d1,.loop4
  277.  
  278.     lea    gtkpl_tonenv_bidon,a3    ; Les enveloppes de tonalité
  279.     lea    adr_eton(a1),a2
  280.     move.w    #NBRTONENV_MAXI-1,d1
  281. .loop5:    move.l    a3,(a2)+
  282.     dbra    d1,.loop5
  283.  
  284.     lea    gtkpl_panenv_bidon,a3    ; Les enveloppes de panning
  285.     lea    adr_epan(a1),a2
  286.     move.w    #NBRPANENV_MAXI-1,d1
  287. .loop6:    move.l    a3,(a2)+
  288.     dbra    d1,.loop6
  289.  
  290.     lea    gtkpl_pat_bidon,a3    ; Les patterns
  291.     lea    adr_pattern(a1),a2
  292.     move.w    #NBRPATTERNS_MAXI-1,d1
  293. .loop7:    move.l    a3,(a2)+
  294.     dbra    d1,.loop7
  295.  
  296. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  297.     sndkernel    get_track_adr        ; On cherche l'adresse de info_track
  298.     move.l    d0,gtkpl_adr_info_track    ; Les données sont ainsi plus rapidement accessibles
  299.  
  300.     move.w    #1,gtkpl_flag_installed
  301.     move.l    #gtkpl_gestion_partition,-(sp)    ; Installe la routine dans le noyau
  302.     sndkernel    add_routine
  303.     addq.l    #4,sp
  304.  
  305.     moveq    #0,d0
  306.     bra.s    .fin
  307.  
  308. .error:    moveq    #-1,d0        ; Déjà installé
  309.     bra.s    .fin
  310. .error2:    moveq    #-2,d0        ; Plus de piste libre
  311.  
  312. .fin:    movem.l    (sp)+,d1-a5
  313.     rts
  314.  
  315.  
  316.  
  317. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  318. *    Désinstalle le player de .GTK                *
  319. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  320. gtkpl_player_off:
  321.     movem.l    d1-a5,-(sp)
  322.     tst.w    gtkpl_flag_installed
  323.     beq.s    .error        ; Pas installé
  324.  
  325.     bsr    gtkpl_reset_sndtrk_tracks
  326.  
  327.     move.l    #gtkpl_gestion_partition,-(sp)
  328.     sndkernel    remove_routine
  329.     addq.l    #4,sp
  330.  
  331.     clr.w    gtkpl_flag_installed
  332.     move.w    gtkpl_module_inf2+mod_nbrtrack,d1    ; Libère les voies
  333.     subq.w    #1,d1
  334.     lea    gtkpl_num_track,a0
  335.  
  336. .loop:    move.w    (a0)+,-(sp)
  337.     sndkernel    free_track
  338.     addq.l    #2,sp
  339.     dbra    d1,.loop
  340.  
  341.     moveq    #0,d0
  342.     bra.s    .fin
  343.  
  344. .error:    moveq    #-1,d0
  345.  
  346. .fin:    movem.l    (sp)+,d1-a5
  347.     rts
  348.  
  349.  
  350.  
  351. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  352. *    Reset des voies de soundtrack                *
  353. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  354. gtkpl_reset_sndtrk_tracks:
  355.     movem.l    d1-a5,-(sp)
  356.     move.w    #1,gtkpl_flag_stop_vcs
  357. .wait:    tst.w    gtkpl_flag_stop_vcs    ; Arrête le module en cours et réinitialise les voies
  358.     bne.s    .wait
  359.     moveq    #0,d0
  360.     movem.l    (sp)+,d1-a5
  361.     rts
  362.  
  363.  
  364.  
  365. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  366. *    Convertit un module GT2 en module GT2 version 3 minimum.    *
  367. *    Tous les samples, patterns, etc. sont dépackés (versions futures)    *
  368. *    Paramètres :                    *
  369. *    - W type : Type de module à convertir. 0 = GT2 pour l'instant    *
  370. *    - L adrmod : Adresse du module à convertir            *
  371. *    - L adrconv : Adresse du module converti            *
  372. *    Renvoie la taille du module converti dans d0.        *
  373. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  374. gtkpl_convert_module:
  375.     CArgs    #52+4,f105.type.w,f105.adrmod.l,f105.adrconv.l
  376.  
  377.     movem.l    d1-a5,-(sp)
  378.     move.l    f105.adrmod(sp),a0    ; ≡≡≡> a0 = adresse du module à convertir
  379.     move.l    f105.adrconv(sp),a5    ; ≡≡≡> a5 = adresse du module converti
  380.     move.w    f105.type(sp),d0    ; d0 = type de module
  381.     tst.w    d0        ; 0 : .GT2
  382.     beq.s    .cm_gt2
  383.     bra    .error1
  384.  
  385.  
  386.  
  387. ;≡≡≡ Conversion d'un module .GT2 ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  388.  
  389. .cm_gt2:
  390.     move.l    (a0),d1
  391.     move.l    d1,d3
  392.     and.l    #255,d3        ; ≡≡≡> d3 = numéro de version
  393.     lsr.l    #8,d1
  394.     cmp.l    #'GT2',d1
  395.     bne    .error4
  396.     move.l    a5,a4        ; ≡≡≡> a4 pointe au début du module converti
  397.  
  398. ;--- Copie les chunks --------------------------------------------------------
  399. .copychk:
  400.     move.l    4(a0),d1
  401.     subq.l    #1,d1
  402.     swap    d1
  403. .ccloop1a:    swap    d1
  404. .ccloop1b:    move.b    (a0)+,(a5)+
  405.     dbra    d1,.ccloop1b
  406.     swap    d1
  407.     dbra    d1,.ccloop1a
  408.  
  409. ;--- Détection de la fin -----------------------------------------------------
  410. .newchunk:
  411.     move.l    (a0),d1
  412.     cmp.l    #'ENDC',d1        ; Chunk de fin ?
  413.     beq.s    .finmod        ; Oui, c'est fini
  414.     cmp.w    #3,d3
  415.     bge.s    .copychk        ; Si version ≥ 3, il DOIT y avoir un chunk de fin
  416.  
  417.     lea    gtkpl_gt2_chunknames,a1    ; Sinon, on teste pour voir si on a pas dépassé la fin
  418. .tcloop:    move.l    (a1)+,d2        ; Regarde dans la liste des noms de chunk
  419.     beq.s    .finmod        ; On n'a pas reconnu le nom, ça doit être la fin
  420.     cmp.l    d1,d2        ; Cherche si le nom du chunk est connu
  421.     bne.s    .tcloop        ; C'est pas celui-là, teste le suivant
  422.     bra.s    .copychk        ; Chunk identifié, on peut le copier
  423.  
  424. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  425. .finmod:
  426.     cmp.w    #3,d3        ; Teste le numéro de version
  427.     bge.s    .endchunk
  428.     move.b    #3,3(a4)        ; On en est au moins à la No 3 maintenant
  429.  
  430. .endchunk:    move.l    #'ENDC',(a5)+    ; Crée le chunk de fin s'il n'y en a pas
  431.     move.l    #12,(a5)+
  432.     move.l    a5,d0        ; Et calcule la longueur totale du module.
  433.     sub.l    a4,d0
  434.     addq.l    #4,d0
  435.     move.l    d0,(a5)+
  436.     bra.s    .fin
  437.  
  438.  
  439.  
  440. ;≡≡≡ Les erreurs ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  441.  
  442. .error1:
  443.     moveq    #-1,d0        ; -1 : Type de module invalide
  444.     bra.s    .fin
  445. .error4:
  446.     moveq    #-4,d0        ; -4 : Format de module invalide
  447.  
  448. .fin:
  449.     movem.l    (sp)+,d1-a5
  450.     rts
  451.  
  452.  
  453.  
  454. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  455. *    Effectue le bouclage de tous les samples d'un module au    *
  456. *    format interne.                    *
  457. *    Paramètres :                    *
  458. *    - L adrmod : Adresse du module                *
  459. *    - L adrbuf : Adresse d'une zone pour les buffers (256Ko maxi)    *
  460. *    - L adradrbuf : Adresse d'un tableau de NBRSAMPLES_MAXI Longs    *
  461. *        destiné à contenir les adresses des buffers. Si     *
  462. *        cette adresse est nulle, les buffers sont directement    *
  463. *        assignés au module en cours de replay, ainsi que    *
  464. *        les adresses des samples.            *
  465. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  466. gtkpl_make_rb_module:
  467.     CArgs    #52+4,f106.adrmod.l,f106.adrbuf.l,f106.adradrbuf.l
  468.  
  469.     movem.l    d1-a5,-(sp)
  470.     move.l    f106.adrmod(sp),a0    ; a0 = adresse du module
  471.  
  472.     move.l    (a0),d1        ; Teste si le module est un GT2
  473.     lsr.l    #8,d1        ; dont le numéro de version est
  474.     cmp.l    #'GT2',d1        ; supérieur ou égal à 3
  475.     bne    .error1
  476.     cmp.b    #3,3(a0)
  477.     blt    .error1
  478.  
  479.     move.l    f106.adrbuf(sp),a1    ; a1 = adresse des buffers
  480.     move.l    f106.adradrbuf(sp),d1    ; a2 = adresse du bloc d'adresses des buffers
  481.     bne.s    .aabufok
  482.     move.l    #gtkpl_module_inf1+adr_repbuf,d1    ; Assigne les pointeurs au module
  483. .aabufok:    move.l    d1,a2
  484.     lea    gtkpl_zone_vide,a3    ; a3 pointe sur une zone vide (unique buffer pour les samples vides)
  485.  
  486.     move.w    #NBRSAMPLES_MAXI-1,d1
  487. .fill:    move.l    #gtkpl_sample_bidon,adr_samples-adr_repbuf(a2)
  488.     move.l    a3,(a2)+        ; Par défaut, tous les buffers sont vides
  489.     dbra    d1,.fill
  490.     lea    -NBRSAMPLES_MAXI*4(a2),a2
  491.  
  492. ;--- Recherche des samples dans le module et bouclage de ces samples ---------
  493. .chunk_loop:
  494.     cmp.l    #'ENDC',(a0)    ; C'était le dernier chunk ?
  495.     beq.s    .module_end    ; Oui, c'est fini
  496.     cmp.l    #'SAMP',(a0)    ; C'est un sample ?
  497.     bne.s    .next_chunk    ; Non, suivant
  498.  
  499.     move.w    number_s(a0),d1    ; d1 = numéro du sample
  500.     cmp.w    #NBRSAMPLES_MAXI-1,d1
  501.     bgt.s    .error2        ; Trop de samples!
  502.     move.l    a0,(adr_samples-adr_repbuf,a2,d1.w*4)    ; Stoque l'adresse du sample
  503.     tst.l    length_s(a0)
  504.     beq.s    .finboucle        ; Sample vide, pas de bouclage à faire
  505.     move.l    a1,(a2,d1.w*4)    ; Sinon stoque l'adresse du buffer dans la table
  506.     move.w    nbits_s(a0),d2
  507.     lsr.w    #3,d2        ; Bits => Octets: 8 => 1 et 16 => 2
  508.     move.w    d2,-(sp)
  509.     move.l    replen_s(a0),-(sp)
  510.     move.l    repeat_s(a0),-(sp)
  511.     move.l    length_s(a0),-(sp)
  512.     move.l    a1,-(sp)
  513.     move.l    a0,-(sp)        ; \
  514.     add.l    #data_s,(sp)    ; / Adresse des données du sample
  515.     sndkernel    make_rbuffer    ; Bouclage
  516.     lea    22(sp),sp
  517.     add.w    #1024,a1        ; Adresse du buffer suivant
  518. .finboucle:
  519.  
  520. .next_chunk:
  521.     add.l    4(a0),a0        ; Adresse du chunk suivant
  522.     bra.s    .chunk_loop
  523.  
  524. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  525. .module_end:
  526.     moveq    #0,d0        ; Aucune erreur détectée.
  527.     bra.s    .fin
  528.  
  529. .error1:    moveq    #-1,d0        ; Ce n'est pas un module au format interne
  530.     bra.s    .fin
  531.  
  532. .error2:    moveq    #-2,d0        ; Trop de samples
  533.  
  534. .fin:    movem.l    (sp)+,d1-a5
  535.     rts
  536.  
  537.  
  538.  
  539. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  540. *    Demande les adresses des samples et des buffers de bouclage    *
  541. *    du module en cours. Attention, les adresses de samples sont    *
  542. *    en fait les adresses CHUNKS des samples. Les données se trouvent    *
  543. *    data_s octets plus loin.                *
  544. *    Paramètres :                    *
  545. *    - L ptr : Pointe sur une zone de 256 L + 256 L qui recevra    *
  546. *        les adresses des samples et les adresses des buffers    *
  547. *        de bouclage. (256 à remplacer par NBRSAMPLES_MAXI    *
  548. *        évidemment).                *
  549. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  550. gtkpl_get_adr_samples:
  551.     CArgs    #52+4,f107.ptr.l
  552.  
  553.     movem.l    d1-a5,-(sp)
  554.     move.l    f107.ptr(sp),a0    ; a0 = pointeur
  555.     lea    gtkpl_module_inf1+adr_samples,a1
  556.     moveq    #NBRSAMPLES_MAXI/2-1,d1    ; Les adresses des samples
  557. .loop1:    move.l    (a1)+,(a0)+
  558.     move.l    (a1)+,(a0)+
  559.     dbra    d1,.loop1
  560.     moveq    #0,d0
  561.     lea    gtkpl_module_inf1+adr_repbuf,a1
  562.     moveq    #NBRSAMPLES_MAXI/2-1,d1    ; Puis celles de leurs buffers
  563. .loop2:    move.l    (a1)+,(a0)+
  564.     move.l    (a1)+,(a0)+
  565.     dbra    d1,.loop2
  566.     moveq    #0,d0
  567.     movem.l    (sp)+,d1-a5
  568.     rts
  569.  
  570.  
  571.  
  572. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  573. *    Fixe les adresses des samples et des buffers de bouclage    *
  574. *    du module en cours. Si une des adresse est nulle, elle        *
  575. *    n'est pas modifiée. De même que pour la fonction précédente,    *
  576. *    il s'agit des CHUNKS des samples et non des données elles-même.    *
  577. *    Paramètres :                    *
  578. *    - L ptr : Pointe sur une zone de 256 L + 256 L qui contient    *
  579. *        les adresses des samples et les adresses des buffers    *
  580. *        de bouclage. (256 à remplacer par NBRSAMPLES_MAXI    *
  581. *        évidemment).                *
  582. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  583. gtkpl_set_adr_samples:
  584.     CArgs    #52+4,f108.ptr.l
  585.  
  586.     movem.l    d1-a5,-(sp)
  587.     move.l    f108.ptr(sp),a0    ; a0 = pointeur
  588.  
  589.     lea    gtkpl_module_inf1+adr_samples,a1
  590.     move.w    #NBRSAMPLES_MAXI-1,d1    ; Les adresses des samples
  591. .loop1:    move.l    (a0)+,d2
  592.     beq.s    .null1
  593.     move.l    d1,(a1)
  594. .null1:    addq.l    #4,a1
  595.     dbra    d1,.loop1
  596.  
  597.     lea    gtkpl_module_inf1+adr_repbuf,a1
  598.     move.w    #NBRSAMPLES_MAXI-1,d1    ; Puis celles de leurs buffers
  599. .loop2:    move.l    (a0)+,d2
  600.     beq.s    .null2
  601.     move.l    d1,(a1)
  602. .null2:    addq.l    #4,a1
  603.     dbra    d1,.loop2
  604.  
  605.     moveq    #0,d0
  606.     movem.l    (sp)+,d1-a5
  607.     rts
  608.  
  609.  
  610.  
  611. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  612. *    Initialise un module au format interne et commence le replay    *
  613. *    Paramètres :                    *
  614. *    - L adrmod : Adresse du module                *
  615. *    - L repbuf : Adresse des buffers de répétition des samples    *
  616. *        destinés à être calculés (1 Ko/sample, 256 Ko maxi).    *
  617. *        Si cette adresse est nulle, rien n'est changé, les    *
  618. *        buffers ne sont pas recalculés.            *
  619. *    - W songpos : Position de départ                *
  620. *    - W linepos : Ligne de départ                *
  621. *    *** Utilise gtkpl_temp_data                *
  622. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  623. gtkpl_new_module:
  624.     CArgs    #52+4,f109.adrmod.l,f109.repbuf.l,f109.songpos.w,f109.linepos.w
  625.  
  626.     movem.l    d1-a5,-(sp)
  627.     move.l    f109.adrmod(sp),a0    ; a0 = adresse du module
  628.  
  629.     move.l    (a0),d1        ; Teste si le module est un GT2
  630.     lsr.l    #8,d1        ; dont le numéro de version est
  631.     cmp.l    #'GT2',d1        ; supérieur ou égal à 3
  632.     bne    .error1
  633.     cmp.b    #3,3(a0)
  634.     blt    .error1
  635.  
  636.     lea    gtkpl_module_inf1,a1    ; a1 pointe sur les adr du mod
  637.     lea    gtkpl_module_inf2,a2    ; a2 pointe sur les infos du mod
  638.  
  639.     bsr    gtkpl_stop_module    ; Arrête ce qu'il y avait avant
  640.  
  641.     move.l    f109.repbuf(sp),d1
  642.     beq.s    .calcbuffin
  643.     pea    0.l
  644.     move.l    d1,-(sp)
  645.     pea    (a0)
  646.     bsr    gtkpl_make_rb_module
  647.     lea    12(sp),sp
  648. .calcbuffin:
  649.  
  650. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  651. ; Réservation des pistes
  652.     move.l    a0,a4        ; Recherche le chunk Pattern Set
  653. .pscloop:    cmp.l    #'ENDC',(a4)
  654.     beq    .error3        ; Fin du module atteinte et pas de Pattern Set!
  655.     cmp.l    #'PATS',(a4)
  656.     beq.s    .pscfound
  657.     add.l    4(a4),a4        ; Chunk suivant
  658.     bra.s    .pscloop
  659.  
  660. .pscfound:    move.w    8(a4),d7        ; ≡≡≡> d7 = nombre de pistes
  661.     cmp.w    #NBRTRACK_MAXI,d7
  662.     bgt    .error5        ; Trop de pistes!
  663.     move.w    d7,d1        ; Nombre de pistes à réserver
  664.     subq.w    #2,d1
  665.     moveq    #1,d2        ; d2 = compteur de pistes déjà réservées
  666.     bmi.s    .ok        ; 1 piste, elle est déjà réservée
  667.     lea    gtkpl_num_track+2,a3
  668.  
  669. .loop:    move.w    #$ffff,-(sp)
  670.     sndkernel    reserve_track
  671.     addq.l    #2,sp
  672.     tst.w    d0
  673.     bmi    .error2
  674.     move.w    d0,(a3)+        ; Piste réservée
  675.     addq.w    #1,d2
  676.     move.w    d2,mod_nbrtrack(a2)
  677.     dbra    d1,.loop
  678. .ok:    move.w    d7,mod_nbrtrack(a2)
  679.  
  680. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  681. ; Fixe les balances
  682.     lea    gtkpl_num_track,a3
  683.     lea    234(a0),a4
  684.     move.w    (a4)+,d1        ; Nombre de piste dont on a le panning
  685.     beq.s    .finbal        ; Y en a pas ?
  686.     cmp.w    d7,d1        ; Y en a trop ?
  687.     ble.s    .ok2
  688.     move.w    d7,d1        ; Oui, on se limite aux piste des patterns
  689. .ok2:    subq.w    #1,d1        ; d1 = compteur de pistes
  690. .loopbal:
  691.     move.w    (a3)+,d0        ; Numéro de piste pour cette voie
  692.     mulu.w    #next_t,d0
  693.     move.w    (a4)+,([gtkpl_adr_info_track],d0.l,bal_t)
  694.     eor.w    #$fff,d3        ; Ca permet de faire changer la
  695.     eor.w    d3,d2        ; balance que 1 voie sur 2 (0 / FFF)
  696.     dbra    d1,.loopbal
  697. .finbal:
  698.  
  699. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  700. ; Trouve tous les chunks des instruments
  701.     move.l    a0,a4
  702. .insloop:    cmp.l    #'ENDC',(a4)
  703.     beq.s    .insend        ; Fin du module atteinte, plus d'instrument
  704.     cmp.l    #'INST',(a4)
  705.     bne.s    .next_ins
  706.     move.w    8(a4),d1        ; Numéro de l'instrument
  707.     cmp.w    #NBRINSTR_MAXI-1,d1
  708.     bgt    .error7        ; Trop d'instrument!
  709.     move.l    a4,(adr_instrset,a1,d1.w*4)    ; Stoque son adresse
  710. .next_ins:
  711.     add.l    4(a4),a4        ; Chunk suivant
  712.     bra.s    .insloop
  713. .insend:
  714.  
  715. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  716. ; Trouve tous les chunks des enveloppes
  717.     move.l    a0,a4
  718. .venvloop:    cmp.l    #'ENDC',(a4)
  719.     beq.s    .venvend        ; Fin du module atteinte, plus d'enveloppe de volume
  720.     cmp.l    #'VENV',(a4)
  721.     bne.s    .next_venv
  722.     move.w    number_e(a4),d1    ; Numéro de l'enveloppe
  723.     cmp.w    #NBRVOLENV_MAXI-1,d1
  724.     bgt    .error8        ; Trop d'enveloppes!
  725.     move.l    a4,(adr_evol,a1,d1.w*4)    ; Stoque son adresse
  726. .next_venv:
  727.     add.l    chunksz_e(a4),a4        ; Chunk suivant
  728.     bra.s    .venvloop
  729. .venvend:
  730.     move.l    a0,a4
  731. .tenvloop:    cmp.l    #'ENDC',(a4)
  732.     beq.s    .tenvend        ; Fin du module atteinte, plus d'enveloppe de tonalité
  733.     cmp.l    #'TENV',(a4)
  734.     bne.s    .next_tenv
  735.     move.w    number_e(a4),d1    ; Numéro de l'enveloppe
  736.     cmp.w    #NBRTONENV_MAXI-1,d1
  737.     bgt    .error8        ; Trop d'enveloppes!
  738.     move.l    a4,(adr_evol,a1,d1.w*4)    ; Stoque son adresse
  739. .next_tenv:
  740.     add.l    chunksz_e(a4),a4        ; Chunk suivant
  741.     bra.s    .tenvloop
  742. .tenvend:
  743.     move.l    a0,a4
  744. .penvloop:    cmp.l    #'ENDC',(a4)
  745.     beq.s    .penvend        ; Fin du module atteinte, plus d'enveloppe de panning
  746.     cmp.l    #'PENV',(a4)
  747.     bne.s    .next_penv
  748.     move.w    number_e(a4),d1        ; Numéro de l'enveloppe
  749.     cmp.w    #NBRPANENV_MAXI-1,d1
  750.     bgt    .error8        ; Trop d'enveloppes!
  751.     move.l    a4,(adr_evol,a1,d1.w*4)    ; Stoque son adresse
  752. .next_penv:
  753.     add.l    chunksz_e(a4),a4        ; Chunk suivant
  754.     bra.s    .penvloop
  755. .penvend:
  756.  
  757. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  758. ; Trouve le chunk de la song
  759.     move.l    a0,a4
  760. .scloop:    cmp.l    #'ENDC',(a4)
  761.     beq    .error4        ; Fin du module atteinte et pas de Song Chunk!
  762.     cmp.l    #'SONG',(a4)
  763.     beq.s    .scfound
  764.     add.l    4(a4),a4        ; Chunk suivant
  765.     bra.s    .scloop
  766.  
  767. .scfound:    move.l    a4,a5        ; ≡≡≡> a5 sert plus tard
  768.     add.w    #12,a4        ; Stoque l'adresse de la song, pas du chunk
  769.     move.l    a4,gtkpl_temp_data    ; Dans un buffer provisoire
  770.  
  771. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  772. ; Trouve tous les chunks des patterns
  773.     move.l    a0,a4
  774. .ploop:    cmp.l    #'ENDC',(a4)
  775.     beq.s    .pend        ; Fin du module atteinte, plus de pattern
  776.     cmp.l    #'PATD',(a4)
  777.     bne.s    .next_pat
  778.     move.w    8(a4),d1        ; Numéro du pattern
  779.     cmp.w    #NBRPATTERNS_MAXI-1-1,d1
  780.     bgt    .error6        ; Trop de patterns!
  781.     move.l    a4,(adr_pattern,a1,d1.w*4)    ; Stoque son adresse
  782. .next_pat:
  783.     add.l    4(a4),a4        ; Chunk suivant
  784.     bra.s    .ploop
  785. .pend:
  786.  
  787. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  788.     bsr    gtkpl_reset_sndtrk_tracks    ; Reset les pistes réservées
  789.  
  790.     move.w    8(a5),mod_songlen(a2)
  791.     move.w    10(a5),mod_songrep(a2)
  792.     move.w    f109.songpos(sp),d1
  793.     move.w    d1,mod_songpos(a2)
  794.     move.w    f109.linepos(sp),mod_linepos(a2)
  795.     move.w    d1,mod_cursongpos(a2)
  796.     move.w    f109.linepos(sp),mod_curlinepos(a2)
  797.     move.l    gtkpl_temp_data,adr_song(a1)
  798.     move.w    ([adr_song,a1],d1.w*2),mod_numpat(a2)
  799.     clr.w    mod_patrep(a2)
  800.     move.w    #-1,mod_nbrticks(a2)
  801.     clr.w    mod_vblcpt(a2)
  802.     move.w    228(a0),mod_speed(a2)    ; Speed dans le 1er chunk
  803.     move.w    230(a0),-(sp)
  804.     bsr    gtkpl_set_tempo    ; Fixe le tempo
  805.     addq.l    #2,sp
  806.     move.w    232(a0),-(sp)
  807.     sndkernel    set_master_vol    ; Fixe le master volume
  808.     addq.l    #2,sp
  809.     moveq    #0,d0        ; Pas d'erreur visiblement
  810.     bra.s    .fin
  811.  
  812. .error1:    moveq    #-1,d0        ; Le module n'est pas au format interne
  813.     bra.s    .fin
  814.  
  815. .error2:    moveq    #-2,d0        ; Il n'y a pas assez de voies libre
  816.     bsr    gtkpl_stop_module
  817.     bra.s    .fin
  818.  
  819. .error3:    moveq    #-3,d0        ; Chunk de Pattern Set manquant
  820.     bsr    gtkpl_stop_module
  821.     bra.s    .fin
  822.  
  823. .error4:    moveq    #-4,d0        ; Chunk de Song manquant
  824.     bsr    gtkpl_stop_module
  825.     bra.s    .fin
  826.  
  827. .error5:    moveq    #-5,d0        ; Trop de pistes
  828.     bra.s    .fin
  829.  
  830. .error6:    moveq    #-6,d0        ; Trop de patterns
  831.     bsr    gtkpl_stop_module
  832.     bra.s    .fin
  833.  
  834. .error7:    moveq    #-7,d0        ; Trop d'instruments
  835.     bsr    gtkpl_stop_module
  836.     bra.s    .fin
  837.  
  838. .error8:    moveq    #-8,d0        ; Trop d'enveloppes
  839.     bsr    gtkpl_stop_module
  840.  
  841. .fin:    movem.l    (sp)+,d1-a5
  842.     rts
  843.  
  844.  
  845.  
  846. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  847. *    Arrête de jouer le module en cours. Un nouveau module devra    *
  848. *    être réinitialisé si on veut jouer quelque chose après.    *
  849. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  850. gtkpl_stop_module:
  851.     movem.l    d1-a5,-(sp)
  852.  
  853.     lea    gtkpl_module_inf2,a0    ; a0 pointe sur les infos du mod
  854.     lea    gtkpl_module_inf1,a1    ; a1 pointe sur les adr du mod
  855.  
  856.     bsr    gtkpl_reset_sndtrk_tracks
  857.  
  858.     move.w    gtkpl_module_inf2+mod_nbrtrack,d1    ; Libère les voies sauf la 1ère
  859.     subq.w    #2,d1
  860.     bmi.s    .ok
  861.     lea    gtkpl_num_track+2,a2
  862.  
  863. .loop:    move.w    (a2)+,-(sp)
  864.     sndkernel    free_track
  865.     addq.l    #2,sp
  866.     dbra    d1,.loop
  867.  
  868. .ok:    move.w    #1,mod_nbrtrack(a0)    ; On lui fait jouer un module bidon
  869.     move.w    #1,mod_songlen(a0)
  870.     clr.w    mod_songrep(a0)
  871.     clr.w    mod_songpos(a0)
  872.     move.w    #NBRPATTERNS_MAXI-1,mod_numpat(a0)    ; Le pattern bidon
  873.     clr.w    mod_linepos(a0)
  874.     clr.w    mod_cursongpos(a0)
  875.     clr.w    mod_curlinepos(a0)
  876.     clr.w    mod_patrep(a0)
  877.     clr.w    mod_vblcpt(a0)
  878.     move.w    #1,mod_vblnumber(a0)
  879.     move.l    #gtkpl_song_bidon,adr_song(a1)
  880.     move.l    #gtkpl_pat_bidon,adr_pattern(a1)
  881.     move.w    #-1,mod_nbrticks(a0)
  882.     move.w    #6,mod_speed(a0)
  883.  
  884.     moveq    #0,d0
  885.     movem.l    (sp)+,d1-a5
  886.     rts
  887.  
  888.  
  889.  
  890. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  891. *    Mets le module en cours en pause                *
  892. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  893. gtkpl_pause_module:
  894.     movem.l    d1-a5,-(sp)
  895.     cmp.w    #2,gtkpl_flag_stop_vcs
  896.     beq.s    .error
  897.     cmp.w    #3,gtkpl_flag_stop_vcs
  898.     beq.s    .error
  899.  
  900. .wait:    tst.w    gtkpl_flag_stop_vcs    ; Attend qu'on soit bien en phase normale
  901.     bne.s    .wait
  902.     move.w    #2,gtkpl_flag_stop_vcs    ; Ordre de pause
  903. .wait2:    cmp.w    #3,gtkpl_flag_stop_vcs    ; Attend que l'ordre ait été reçu
  904.     bne.s    .wait2
  905.     moveq    #0,d0
  906.     bra.s    .fin
  907.  
  908. .error:    moveq    #-1,d0        ; On était déjà en pause
  909.  
  910. .fin    movem.l    (sp)+,d1-a5
  911.     rts
  912.  
  913.  
  914.  
  915. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  916. *    Remet un module en pause en marche            *
  917. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  918. gtkpl_cont_module:
  919.     movem.l    d1-a5,-(sp)
  920.  
  921. .wait:    cmp.w    #3,gtkpl_flag_stop_vcs    ; Déjà totalement en pause ?
  922.     beq.s    .ok        ; Oui, c'est bon, on peut donner l'ordre de reprise
  923.     cmp.w    #2,gtkpl_flag_stop_vcs
  924.     bne.s    .error        ; Bah on n'était même pas en pause
  925.     bra.s    .wait        ; On avait donné l'ordre de pause, mais il n'est
  926.                 ; pas encore reçu par le tracker, on attend un peu.
  927.  
  928. .ok:    move.w    #4,gtkpl_flag_stop_vcs
  929. .wait2:    tst.w    gtkpl_flag_stop_vcs
  930.     bne.s    .wait2
  931.     moveq    #0,d0
  932.     bra.s    .fin
  933.  
  934. .error:    moveq    #-1,d0        ; On n'était pas en pause
  935.  
  936. .fin    movem.l    (sp)+,d1-a5
  937.     rts
  938.  
  939.  
  940.  
  941. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  942. *    Change la position d'un module en cours de replay        *
  943. *    Paramètres :                    *
  944. *    - W songpos : Nouvelle position                 *
  945. *    - W linepos : Nouvelle ligne                *
  946. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  947. gtkpl_change_modpos:
  948.     CArgs    #52+4,f10d.songpos.w,f10d.linepos.w
  949.  
  950.     movem.l    d1-a5,-(sp)
  951.  
  952.     lea    gtkpl_module_inf1,a1    ; a1 pointe sur les adr du mod
  953.     lea    gtkpl_module_inf2,a2    ; a2 pointe sur les infos du mod
  954.  
  955. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  956. ; Position
  957.     move.w    f10d.songpos(sp),d1
  958.     cmp.w    mod_songlen(a2),d1
  959.     bge.s    .error1
  960.     move.w    d1,mod_songpos(a2)
  961.     move.w    d1,mod_cursongpos(a2)
  962.  
  963. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  964. ; Ligne
  965.     move.w    ([adr_song,a1],d1.w*2),d1    ; Cherche l'adresse du pattern
  966.     move.l    (adr_pattern,a1,d1.w*4),a3    ; de la nouvelle position
  967.     move.w    f10d.linepos(sp),d1
  968.     cmp.w    nlines_p(a3),d1
  969.     bge.s    .error2
  970.     move.w    d1,mod_linepos(a2)
  971.     move.w    d1,mod_curlinepos(a2)
  972.  
  973. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  974. ; Force le tracker à redémarer à ce point le plus tôt possible
  975.     move.w    ([adr_song,a1],d1.w*2),mod_numpat(a2)
  976.     clr.w    mod_patrep(a2)    ; Pas de Pattern delay
  977.     move.w    #-1,mod_nbrticks(a2)    ; Le prochain tick, on attaque la nouvelle ligne
  978.     clr.w    mod_vblcpt(a2)    ; Nouveau tick
  979.     moveq    #0,d0
  980.     bra.s    .fin
  981.  
  982. .error1:    moveq    #-1,d0        ; Position hors de la song
  983.     bra.s    .fin
  984.  
  985. .error2:    moveq    #-2,d0        ; Numéro de ligne hors du pattern
  986.  
  987. .fin:    movem.l    (sp)+,d1-a5
  988.     rts
  989.  
  990.  
  991.  
  992. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  993. *    Demande la position d'un module en cours de replay.        *
  994. *    Résultat dans d0                    *
  995. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  996. gtkpl_get_modsongpos:
  997.     moveq    #0,d0
  998.     move.w    gtkpl_module_inf2+mod_cursongpos,d0
  999.     rts
  1000.  
  1001.  
  1002.  
  1003. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1004. *    Demande le numéro de la ligne courante dans un module en cours    *
  1005. *    de replay.                        *
  1006. *    Résultat dans d0                    *
  1007. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1008. gtkpl_get_modlinepos:
  1009.     moveq    #0,d0
  1010.     move.w    gtkpl_module_inf2+mod_curlinepos,d0
  1011.     rts
  1012.  
  1013.  
  1014.  
  1015. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1016. *    Fixe le tempo pour le module                *
  1017. *    Paramètre :                    *
  1018. *    - W Tempo : Tempo en BPM                *
  1019. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1020. gtkpl_set_tempo:
  1021.     CArgs    #52+4,f111.tempo.w
  1022.  
  1023.     movem.l    d1-a5,-(sp)
  1024.  
  1025.     move.w    f111.tempo(sp),d4
  1026.     move.w    d4,gtkpl_module_inf2+mod_tempo
  1027.     mulu.w    #4*6,d4
  1028.     sndkernel    get_replay_freq
  1029.     mulu.w    #60,d0
  1030.     divu.w    d4,d0        ; d0 = freq.repl * 60 s / (tempo * 4 lig * 6 ticks)
  1031.     move.l    d0,d3        ;    = nombre de spl par tick
  1032.     clr.w    d3
  1033.     divu.w    d4,d3        ; d3 = nbr de spl par tick, frac
  1034.     swap    d3
  1035.     move.w    d0,d3
  1036.     swap    d3        ; d3 = nbr de spl par tick * $10000
  1037.     move.l    #1200-1,d4
  1038.     add.w    d0,d4
  1039.     divu.w    #1200,d4        ; d4 = splpartick/1200 arrondi par excès
  1040.     ext.l    d4
  1041.     divu.l    d4,d3        ; d3 = Nbr de spl par VBL * $10000
  1042.     move.l    d3,gtkpl_vblsize_int        ; Stoque d'un coup les parties entière et fractionnaire
  1043.     move.w    d4,gtkpl_module_inf2+mod_vblnumber
  1044.     swap    d3
  1045.     move.w    d3,-(sp)
  1046.     sndkernel    set_vblsize
  1047.     addq.l    #2,sp
  1048.     moveq    #0,d0
  1049.  
  1050.     movem.l    (sp)+,d1-a5
  1051.     rts
  1052.  
  1053.  
  1054.  
  1055. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1056. *    Permet de savoir le tempo du module dans d0 (en BPM).        *
  1057. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1058. gtkpl_get_tempo:
  1059.     movem.l    d1-a5,-(sp)
  1060.  
  1061.     moveq    #0,d0
  1062.     move.w    gtkpl_module_inf2+mod_tempo,d0
  1063.  
  1064.     movem.l    (sp)+,d1-a5
  1065.     rts
  1066.  
  1067.  
  1068.  
  1069. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1070. *    Demande l'adresse du flag de synchro pour démos                   *
  1071. *    Résultat dans d0                    *
  1072. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1073. gtkpl_get_synchro_adr:
  1074.     move.l    #gtkpl_demo_synchro,d0
  1075.     rts
  1076.  
  1077.  
  1078.  
  1079. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1080. *    Gestion de la partition pour modules .GT2            *
  1081. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1082. *    Cette routine est appelée sous interruption, par l'intermédiaire    *
  1083. *    du noyau.                        *
  1084. *≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈*
  1085. gtkpl_gestion_partition:
  1086.  
  1087.     movem.l    d0-a6,-(sp)
  1088.  
  1089.     lea    gtkpl_module_inf2,a0    ; a0 pointe sur le bloc 2 d'informations (mod)
  1090.     lea    gtkpl_module_inf1,a1    ; a1 pointe sur le bloc 1 d'informations (adr)
  1091.  
  1092.     addq.w    #1,mod_vblcpt(a0)    ; Compteur de VBL pour faire un tick
  1093.     move.w    mod_vblnumber(a0),d0
  1094.     cmp.w    mod_vblcpt(a0),d0
  1095.     bgt    gtkpl_fin_gestion_partition    ; Tick pas fini : rien à faire
  1096.     clr.w    mod_vblcpt(a0)
  1097.  
  1098.     lea    gtkpl_per_table,a5    ; a5 pointe sur la table des périodes
  1099.  
  1100. ;--- Demande d'arrêt de toutes les voies ? -----------------------------------
  1101.     tst.w    gtkpl_flag_stop_vcs
  1102.     beq    gtkpl_new_vbl
  1103.     cmp.w    #1,gtkpl_flag_stop_vcs    ; Ordre d'arrêt
  1104.     beq.s    .stop
  1105.     cmp.w    #2,gtkpl_flag_stop_vcs    ; Ordre de pause (volume à 0)
  1106.     beq    .pause
  1107.     cmp.w    #4,gtkpl_flag_stop_vcs    ; Ordre de fin de pause
  1108.     beq    .finpause
  1109.     bra    gtkpl_fin_gestion_partition        ; Déjà en pause, on ne fait rien
  1110.  
  1111. ;--- Réinitialise les voies --------------------------------------------------
  1112. .stop:    move.w    mod_nbrtrack(a0),d0
  1113.     subq.w    #1,d0
  1114.     lea    gtkpl_zone_vide,a2
  1115.     lea    gtkpl_num_track,a3
  1116. .loop:
  1117.     move.w    (a3)+,d1
  1118.     mulu.w    #next_t,d1
  1119.     lea    ([gtkpl_adr_info_track],d1.l),a4
  1120.     clr.w    vol_t(a4)
  1121. ;    move.w    #$800,bal_t(a4)    ; La balance n'est cependant pas réinitialisée
  1122.     move.l    a2,adrsam_t(a4)
  1123.     clr.l    pos_t(a4)
  1124.     clr.w    finepos_t(a4)
  1125.     clr.l    reppos_t(a4)
  1126.     move.l    #2,replen_t(a4)
  1127.     move.l    #gtkpl_zone_vide,rbuffer_t(a4)
  1128.     clr.w    c_n_t(a4)
  1129.     clr.w    c_i_t(a4)
  1130.     clr.w    c_e_t(a4)
  1131.     clr.w    c_v_t(a4)
  1132.     move.w    #0,ninstr_t(a4)
  1133.     clr.w    norm_f_t(a4)
  1134.     clr.w    norm_v_t(a4)
  1135.     move.w    #48,curnote_t(a4)
  1136.     move.w    #$1ac0,pernote_t(a4)
  1137.     clr.w    vollnot_t(a4)
  1138.     clr.w    volenot_t(a4)
  1139.     clr.w    portspd_t(a4)
  1140.     move.w    #48,note2sl_t(a4)
  1141.     move.w    #$1ac0,per2sl_t(a4)
  1142.     clr.b    vibspd_t(a4)
  1143.     clr.b    vibcpt_t(a4)
  1144.     clr.b    vibamp_t(a4)
  1145.     clr.b    vibwav_t(a4)
  1146.     clr.b    tremspd_t(a4)
  1147.     clr.b    tremcpt_t(a4)
  1148.     clr.b    tremamp_t(a4)
  1149.     clr.b    tremwav_t(a4)
  1150.     clr.w    tremorc_t(a4)
  1151.     move.b    #3,tremor1_t(a4)
  1152.     move.b    #6,tremor2_t(a4)
  1153.     clr.w    ploopp_t(a4)
  1154.     clr.w    ploops_t(a4)
  1155.     clr.w    ploopn_t(a4)
  1156.     env_initialisation    a4,0
  1157.     clr.w    flag_autotempo_t(a4)
  1158.     clr.w    flag_autoperiod_t(a4)
  1159.     dbra    d0,.loop
  1160.     clr.w    gtkpl_flag_stop_vcs    ; On a fini le nettoyage
  1161.     bra    gtkpl_fin_gestion_partition
  1162.  
  1163. ;--- Mise en pause -----------------------------------------------------------
  1164. .pause:    move.w    mod_nbrtrack(a0),d0
  1165.     subq.w    #1,d0
  1166.     lea    gtkpl_pause_backup,a2
  1167.     lea    gtkpl_num_track,a3
  1168. .loop2:
  1169.     move.w    (a3)+,d1
  1170.     mulu.w    #next_t,d1
  1171.     lea    ([gtkpl_adr_info_track],d1.l),a4
  1172.     move.l    pos_t(a4),(a2)+
  1173.     move.l    reppos_t(a4),(a2)+
  1174.     move.w    vol_t(a4),(a2)+
  1175.     clr.l    pos_t(a4)
  1176.     clr.l    reppos_t(a4)
  1177.     clr.w    vol_t(a4)
  1178.     dbra    d0,.loop2
  1179.     move.w    #3,gtkpl_flag_stop_vcs    ; Signale qu'on est bien en pause
  1180.     bra    gtkpl_fin_gestion_partition
  1181.  
  1182. ;--- Reprise après une pause -------------------------------------------------
  1183. .finpause:    move.w    mod_nbrtrack(a0),d0
  1184.     subq.w    #1,d0
  1185.     lea    gtkpl_pause_backup,a2
  1186.     lea    gtkpl_num_track,a3
  1187. .loop3:
  1188.     move.w    (a3)+,d1
  1189.     mulu.w    #next_t,d1
  1190.     lea    ([gtkpl_adr_info_track],d1.l),a4
  1191.     move.l    (a2)+,pos_t(a4)
  1192.     move.l    (a2)+,reppos_t(a4)
  1193.     move.w    (a2)+,vol_t(a4)
  1194.     dbra    d0,.loop3
  1195.     clr.w    gtkpl_flag_stop_vcs    ; Signale qu'on est bien reparti
  1196.  
  1197. ;≡≡≡ Nouvelle VBL, teste si on a une nouvelle ligne, position etc ≡≡≡≡≡≡≡≡≡≡≡≡
  1198. gtkpl_new_vbl:
  1199.     move.w    mod_nbrticks(a0),d0    ; Nouvelle vbl
  1200.     addq.w    #1,d0
  1201.     cmp.w    mod_speed(a0),d0    ; Fin de la ligne courante ?
  1202.     blt    .suite_ligne
  1203.     moveq    #0,d0
  1204.     tst.w    mod_patrep(a0)    ; Répétition de la ligne ?
  1205.     beq.s    .newline        ; Non, on s'en fout
  1206.  
  1207.     subq.w    #1,mod_patrep(a0)    ; Répétition -1
  1208.     move.w    d0,mod_nbrticks(a0)
  1209.     move.w    mod_nbrtrack(a0),d7
  1210.     subq.w    #1,d7        ; d7 = compteur de voie
  1211.     bra    gtkpl_pas_seulement_1ere_vbl    ; ... puis on passe à la suite
  1212.  
  1213. .newline:    move.w    mod_songpos(a0),mod_cursongpos(a0)    ; Actualise la position
  1214.     move.w    mod_linepos(a0),mod_curlinepos(a0)
  1215.     clr.w    mod_flagnewpos(a0)    ; Indique que la position reste la même pour le moment
  1216.     move.w    mod_numpat(a0),d3    ; Met dans chaque descripteur de voie une partie de la ligne
  1217.     move.l    (adr_pattern,a1,d3.w*4),a4    ; a4 pointe sur le chunk du pattern
  1218.     move.w    mod_linepos(a0),d1
  1219.     move.w    mod_nbrtrack(a0),d3
  1220.     mulu.w    #5,d3
  1221.     mulu.w    d1,d3
  1222.     lea    data_p(a4,d3.l),a2    ; a2 contient l'adresse de la nouvelle ligne
  1223.     move.w    mod_nbrtrack(a0),d3
  1224.     subq.w    #1,d3        ; d3 contient le nombre de voies -1
  1225.     move.l    a4,-(sp)        ; Sauve a4 (chunk du pattern)
  1226.     lea    gtkpl_num_track,a4
  1227. .loop:
  1228.     move.w    (a4)+,d4
  1229.     mulu.w    #next_t,d4
  1230.     lea    ([gtkpl_adr_info_track],d4.l),a3    ; a3 pointe le descripteur de voie
  1231.     move.b    (a2)+,c_n_t+1(a3)    ; Recopie la note
  1232.     move.b    (a2)+,c_i_t+1(a3)    ; Recopie l'instrument
  1233.     move.w    (a2)+,c_e_t(a3)    ; Recopie l'effet
  1234.     move.b    (a2)+,c_v_t+1(a3)    ; Recopie la commande de volume
  1235.     add.w    #next_t,a3        ; Voie suivante
  1236.     dbra    d3,.loop
  1237.     move.l    (sp)+,a4        ; Récupère a4 (chunk du pattern)
  1238.  
  1239.     addq.w    #1,d1        ; Calcule la prochaine ligne
  1240.     cmp.w    nlines_p(a4),d1    ; Fin du pattern ?
  1241.     blt.s    .suite_pos
  1242.     moveq    #0,d1
  1243.     move.w    mod_songpos(a0),d2    ; Oui, nouvelle position
  1244.     addq.w    #1,d2
  1245.     cmp.w    mod_songlen(a0),d2    ; Fin de la song ?
  1246.     blt.s    .suite_song
  1247.     move.w    mod_songrep(a0),d2    ; Oui, bouclage
  1248. .suite_song:
  1249.     move.w    d2,mod_songpos(a0)
  1250.     move.w    ([adr_song,a1],d2.w*2),mod_numpat(a0)    ; Trouve le nouveau pattern
  1251. .suite_pos:
  1252.     move.w    d1,mod_linepos(a0)    ; Pointe sur la ligne suivante
  1253. .suite_ligne:
  1254.     move.w    d0,mod_nbrticks(a0)
  1255.  
  1256. ;≡≡≡ Passe aux crible toutes les voies ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  1257.     move.w    mod_nbrtrack(a0),d7
  1258.     subq.w    #1,d7        ; d7 = compteur de voie
  1259.     tst.w    d0        ; C'est la première VBL ?
  1260.     bne    gtkpl_pas_seulement_1ere_vbl
  1261.     tst.w    mod_patrep(a0)    ; Sinon, c'est en cours de répétition ?
  1262.     bne    gtkpl_pas_seulement_1ere_vbl
  1263.  
  1264. gtkpl_premvbl_loop:            ; Boucle de test si c'est la première vbl
  1265. ;--- Décode les différentes parties d'une ligne -----------------------------
  1266.     move.w    mod_nbrtrack(a0),d0
  1267.     subq.w    #1,d0
  1268.     sub.w    d7,d0
  1269.     lea    gtkpl_num_track,a3
  1270.     move.w    (a3,d0.w*2),d0
  1271.     mulu.w    #next_t,d0
  1272.     lea    ([gtkpl_adr_info_track],d0.l),a3    ; a3 pointe sur les informations des voies
  1273.  
  1274.     move.w    c_n_t(a3),d0    ; d0 = note
  1275.     move.w    c_i_t(a3),d1    ; d1 = instrument
  1276.     move.w    c_e_t(a3),d2    ; d2 = effet
  1277.  
  1278.     tst.w    d1
  1279.     bne.s    gtkpl_instrum    ; S'il y a instrument
  1280.     tst.w    d0
  1281.     bne    gtkpl_pas_instrument    ; S'il y a note sans instr
  1282.     tst.w    d2
  1283.     bne    gtkpl_effets1    ; Seulement l'effet
  1284.     tst.w    c_v_t(a3)
  1285.     beq    fx_fin1        ; Pas de volume on se tire
  1286.     bra    gtkpl_effets1
  1287.     
  1288. ;--- Instrument détecté ------------------------------------------------------
  1289. gtkpl_instrum:
  1290.     move.w    d2,d3
  1291.     and.w    #$FF00,d3        ; d3 = numéro de l'effet 2 chiffres
  1292.     cmp.w    #$900,d3        ; Note delay, on s'en va directos
  1293.     beq    gtkpl_effets1_no_vol
  1294.  
  1295.     tst.w    d1        ; Y a-t-il un instrument ?
  1296.     beq.s    gtkpl_pas_instrument
  1297.     move.w    d1,instr_t(a3)    ; Oui, il devient l'instrument courant
  1298.     move.l    (adr_instrset,a1,d1.w*4),a2    ; a2 pointe sur l'instrument
  1299.     move.w    vol_i(a2),d3    ; Prend le volume dans d3
  1300.     move.w    curnote_t(a3),d4    ; Recherche le sample qui va avec la note courante
  1301.     move.b    transp_i(a2,d4.w*2),d1
  1302.     ext.w    d1
  1303.     move.w    d1,transp_t(a3)    ; Transposition
  1304.     moveq    #0,d1
  1305.     move.b    splnum_i(a2,d4.w*2),d1
  1306. .fin_s:    move.w    d1,ninstr_t(a3)    ; Il devient le sample courant
  1307.     lea    ([adr_samples,a1,d1.w*4],vol_s),a2
  1308.     move.w    (a2),volsam_t(a3)    ; Le volume propre du sample
  1309.     move.w    d3,norm_v_t(a3)    ; Recopie le volume de l'instrument dans la voie
  1310.     move.w    2(a2),norm_f_t(a3)
  1311.     move.w    autobal_s-vol_s(a2),d3
  1312.     bmi.s    .pasbalnc
  1313.     move.w    d3,curbal_t(a3)    ; Avec la balance
  1314. .pasbalnc:    move.w    norm_v_t(a3),d3
  1315.     lea    gtkpl_vlin_2_exp,a4
  1316.     move.w    (a4,d3.w*2),volenot_t(a3)    ; Sans oublier le volume exponentiel
  1317.     lsl.w    #3,d3
  1318.     move.w    d3,vollnot_t(a3)    ; Volume courant aussi
  1319.  
  1320. ;--- Note --------------------------------------------------------------------
  1321. gtkpl_pas_instrument:
  1322.     tst.w    d0
  1323.     beq    gtkpl_effets1    ; S'il n'y a pas de note on s'en va
  1324.     move.w    d2,d3
  1325.     and.w    #$FF00,d3        ; d3 = numéro de l'effet 2 chiffres
  1326.     cmp.w    #$300,d3
  1327.     beq.s    gtkpl_tone_p
  1328.     cmp.w    #$500,d3
  1329.     beq.s    gtkpl_tone_p
  1330.     cmp.w    #$600,d3
  1331.     beq.s    gtkpl_tone_p
  1332.     cmp.w    #$AB00,d3
  1333.     beq.s    gtkpl_tone_p
  1334.     cmp.w    #$1800,d3
  1335.     blt.s    gtkpl_pas_tone_p
  1336.     cmp.w    #$1B00,d3
  1337.     bgt.s    gtkpl_pas_tone_p
  1338. gtkpl_tone_p:            ; S'il y a un tone portamento (3,5,6,ab,18,19,1a ou 1b)
  1339.     move.w    d0,note2sl_t(a3)
  1340.     move.w    d0,d3
  1341.     add.w    transp_t(a3),d3    ; Transposition du sample courant
  1342.     sub.w    #24,d3
  1343.  
  1344.     IfNe    CHECK
  1345.     bpl.s    .check1ok
  1346.     moveq    #24,d3
  1347. .check1ok:    cmp.w    #127,d3
  1348.     ble.s    .check2ok
  1349.     moveq    #127,d3
  1350. .check2ok:
  1351.     EndC
  1352.  
  1353.     lsl.w    #3,d3
  1354.     add.w    norm_f_t(a3),d3
  1355.     move.w    (a5,d3.w*2),per2sl_t(a3)    ; on met la période de côté
  1356.     move.w    c_v_t(a3),d3        ; Commande de volume ?
  1357.     beq    fx_fin1
  1358.     lea    gtkpl_vlin_2_exp,a4
  1359.     move.w    (a4,d3.w*2),volenot_t(a3)    ; Volume exponentiel
  1360.     lsl.w    #3,d3
  1361.     move.w    d3,vollnot_t(a3)        ; Volume courant ajusté
  1362.     bra    fx_fin1
  1363.  
  1364. gtkpl_pas_tone_p:
  1365.     move.w    d0,curnote_t(a3)
  1366.     move.w    d0,note2sl_t(a3)
  1367.     move.w    d0,d3
  1368.     move.w    instr_t(a3),d1
  1369.     move.l    (adr_instrset,a1,d1.w*4),a2    ; a2 pointe sur l'instrument
  1370.     env_initialisation    a3,1,a2        ; Initialise les enveloppes
  1371.     move.w    curnote_t(a3),d4        ; Recherche le sample qui va avec la note courante
  1372.     move.b    transp_i(a2,d4.w*2),d1
  1373.     ext.w    d1
  1374.     move.w    d1,transp_t(a3)        ; Transposition
  1375.     add.w    d1,d3            ; Sur la note
  1376.     moveq    #0,d1
  1377.     move.b    splnum_i(a2,d4.w*2),d1
  1378.     move.w    d1,ninstr_t(a3)        ; Il devient le sample courant
  1379.     move.w    ([adr_samples,a1,d1.w*4],vol_s),volsam_t(a3)    ; Recopie le volume du sample
  1380.     move.w    ([adr_samples,a1,d1.w*4],autobal_s),d4
  1381.     bmi.s    .pas_autb
  1382.     move.w    d4,curbal_t(a3)        ; Recopie la balance du sample
  1383. .pas_autb:    sub.w    #24,d3
  1384.  
  1385.     IfNe    CHECK
  1386.     bpl.s    .check1ok
  1387.     moveq    #24,d3
  1388. .check1ok:    cmp.w    #127,d3
  1389.     ble.s    .check2ok
  1390.     moveq    #127,d3
  1391. .check2ok:
  1392.     EndC
  1393.  
  1394.     lsl.w    #3,d3
  1395.     add.w    norm_f_t(a3),d3
  1396.     add.w    d3,d3
  1397.     move.w    (a5,d3.w),pernote_t(a3)    ; Sinon c'est une note normale
  1398.     move.w    (a5,d3.w),per2sl_t(a3)
  1399.  
  1400. gtkpl_fin_tone_p:
  1401.     moveq    #0,d3        ; d3 position dans le sample (au début)
  1402.     move.w    d2,d4
  1403.     and.w    #$F000,d4        ; d4 numéro de l'effet 1 chiffre
  1404.     cmp.w    #$9000,d4        ; On doit jouer à partir d'un certain point ?
  1405.     bne.s    .ofsplfin
  1406.     move.w    d2,d3        ; Sample Offset
  1407.     sub.w    #$9000,d3
  1408.     lsl.l    #8,d3
  1409. .ofsplfin:
  1410.     move.l    d3,pos_t(a3)
  1411.     clr.w    finepos_t(a3)
  1412.     clr.w    tremorc_t(a3)
  1413.     move.w    ninstr_t(a3),d1
  1414.     move.l    (adr_samples,a1,d1.w*4),a4
  1415.     move.l    a4,adrsam_t(a3)    ; Recopie l'adresse du sample
  1416.     add.l    #data_s,adrsam_t(a3)
  1417.     move.l    (adr_repbuf,a1,d1.w*4),rbuffer_t(a3)    ; l'adresse du buffer de répétition,
  1418.     move.w    nbits_s(a4),d3    ; Nombre de bits
  1419.     lsr.w    #3,d3
  1420.     move.w    d3,nbits_t(a3)
  1421.     move.w    fech_s(a4),fech_t(a3)    ; Fréquence d'échantillonnage
  1422.     lea    repeat_s(a4),a4
  1423.     move.l    (a4)+,d3        ; le point de répétition,
  1424.     move.l    (a4),d4        ; et la taille de la boucle
  1425.     move.l    d4,d5
  1426.     add.l    d3,d5
  1427.     cmp.l    #2,d5
  1428.     bgt.s    .finsi
  1429.     move.l    -replen_s+length_s(a4),d3    ; Si pas de bouclage
  1430.     moveq    #2,d4
  1431.     subq.l    #2,d3
  1432.     tst.l    d3
  1433.     bpl.s    .finsi
  1434.     moveq    #0,d3
  1435. .finsi:
  1436.     move.l    d3,reppos_t(a3)
  1437.     move.l    d4,replen_t(a3)
  1438.  
  1439. ;≡≡≡ Là on gère les effets qui n'agissent qu'en début de note ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  1440.  
  1441. gtkpl_effets1:
  1442.     move.w    c_v_t(a3),d3    ; Commande de volume ?
  1443.     beq.s    gtkpl_effets1_no_vol
  1444.     lea    gtkpl_vlin_2_exp,a4
  1445.     move.w    (a4,d3.w*2),volenot_t(a3)    ; Volume exponentiel
  1446.     lsl.w    #3,d3
  1447.     move.w    d3,vollnot_t(a3)    ; Volume courant ajusté
  1448. gtkpl_effets1_no_vol:
  1449.     move.w    d2,d3
  1450.     lsr.w    #8,d3        ; d3 = numéro d'effet
  1451.     move.w    d2,d4
  1452.     cmp.w    #$20,d3        ; section 00xx - 1fxx
  1453.     blt.s    .saute
  1454.     cmp.w    #$a0,d3
  1455.     blt.s    .ef1ch
  1456.     cmp.w    #$bf,d3        ; section a0xx - bfxx
  1457.     bgt.s    .ef1ch
  1458.     sub.w    #$80,d3        ; transforme en 20xx - 3fxx
  1459. .saute:    and.w    #$FF,d4        ; d4 = paramètre 8 bits
  1460.     jmp    ([fx_table_de_sauts1,d3.w*4])    ; On saute dans la bonne routine
  1461.  
  1462. .ef1ch:    lsr.b    #4,d3        ; Pour les effets à 1 chiffre
  1463.     and.w    #$FFF,d4        ; d4 = paramètre 12 bits
  1464.     jmp    ([fx_table_de_sauts1b,d3.w*4])    ; Hop on y va!
  1465.  
  1466. fx_fin1:
  1467.     dbra    d7,gtkpl_premvbl_loop
  1468.     move.w    mod_nbrtrack(a0),d7
  1469.     subq.w    #1,d7        ; d7 = compteur de voie
  1470.  
  1471. ;≡≡≡ Ici on exécute les effets qui agissent pendant toute la durée de la note ≡≡≡
  1472.  
  1473. gtkpl_pas_seulement_1ere_vbl:
  1474.     move.w    mod_nbrtrack(a0),d0
  1475.     subq.w    #1,d0
  1476.     sub.w    d7,d0
  1477.     lea    gtkpl_num_track,a3
  1478.     move.w    (a3,d0.w*2),d0
  1479.     mulu.w    #next_t,d0
  1480.     lea    ([gtkpl_adr_info_track],d0.l),a3    ; a3 pointe sur les informations de la voie
  1481.  
  1482.     move.w    c_n_t(a3),d0
  1483.     move.w    c_i_t(a3),d1
  1484.     move.w    c_e_t(a3),d2
  1485.     beq    fx_fin_normale    ; Si pas d'effet
  1486.     move.w    d2,d3
  1487.     lsr.w    #8,d3
  1488.     move.w    d2,d4        ; d4 paramètre de l'effet
  1489.     cmp.w    #$20,d3        ; section 00xx - 1fxx
  1490.     blt.s    .saute
  1491.     cmp.w    #$a0,d3
  1492.     blt.s    .ef1ch2
  1493.     cmp.w    #$bf,d3        ; section a0xx - bfxx
  1494.     bgt.s    .ef1ch2
  1495.     sub.w    #$80,d3        ; transforme en 20xx - 3fxx
  1496. .saute    and.w    #$FF,d4
  1497.     jmp    ([fx_table_de_sauts2,d3.w*4])    ; On saute dans la bonne routine
  1498.  
  1499. .ef1ch2:    lsr.b    #4,d3        ; Encore une fois, les effets à 1 chiffre
  1500.     and.w    #$FFF,d4
  1501.  
  1502.     cmp.b    #7,d3
  1503.     beq    fx_roll_7        ; Roll (simple)
  1504.     cmp.b    #8,d3
  1505.     beq    fx_roll_and_vsl    ; Roll + vol slide + set bal
  1506.  
  1507. fx_fin_normale:            ; C'est l'adresse normale de retour.
  1508.     move.w    vollnot_t(a3),vol_t(a3)    ; Les routines qui modifient normalement
  1509.     move.w    pernote_t(a3),per_t(a3)    ; les paramètres passent par là.
  1510.     move.w    curbal_t(a3),bal_t(a3)
  1511. fx_fin_speciale:
  1512.     move.w    vol_t(a3),d5    ; Tout à la fin, il faut aussi
  1513.     mulu.w    volsam_t(a3),d5    ; tenir compte du volume propre
  1514.     lsr.l    #8,d5        ; du sample.
  1515.     move.w    d5,vol_t(a3)
  1516.  
  1517. ;≡≡≡ Gestion des enveloppes ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  1518.  
  1519.     IfNe    HANDLE_ENVELOPES
  1520.  
  1521. ;--- Gestion de l'enveloppe de volume ----------------------------------------
  1522. gtkpl_gestion_env_volume:
  1523.     move.w    nevol_t(a3),d0    ; d0 = Numéro d'enveloppe
  1524.     beq    gtkpl_gestion_env_tone    ; Pas d'enveloppe de volume
  1525.     tst.w    ev_waitcpt_t(a3)    ; On est sur un Wait ?
  1526.     bgt    .enveloppe_wait    ; Oui, alors on le continue
  1527.     move.w    ev_volume_t(a3),d1
  1528.     tst.w    pevol_t(a3)    ; Position négative ?
  1529.     bmi    .env_set_volume    ; Oui, l'enveloppe est finie
  1530.     lea    ([gtkpl_module_inf1+adr_evol,d0.w*4]),a4
  1531.     add.w    devol_t(a3),a4    ; a4 pointe sur la section courante
  1532.     moveq    #0,d6        ; d6 = Nombre de commandes exécutées à la file.
  1533.                 ; Limite car si l'utilisateur oublie les Waits
  1534.                 ; on peut avoir des problèmes de boucles infinies
  1535.     move.w    pevol_t(a3),d0    ; d0 = position dans la section courante
  1536.  
  1537. .comloop:    move.b    (a4,d0.w),d2    ; d2 = numéro de commande
  1538.     beq    .c_end
  1539.     addq.w    #1,d0        ; Pointe maintenant sur le paramètre
  1540.     cmp.b    #ENV_COM_JUMP,d2
  1541.     beq    .c_jump
  1542.     cmp.b    #ENV_COM_WAIT,d2
  1543.     beq    .c_wait
  1544.     cmp.b    #ENV_COM_SET_COUNTER,d2
  1545.     beq    .c_set_counter
  1546.     cmp.b    #ENV_COM_LOOP,d2
  1547.     beq    .c_loop
  1548.     cmp.b    #ENV_COM_KEY_OFF,d2
  1549.     beq    .c_key_off
  1550.     cmp.b    #ENV_COM_SET_VOLUME,d2
  1551.     beq    .c_volume
  1552.     cmp.b    #ENV_COM_SET_VOL_STEP,d2
  1553.     beq    .c_vol_step
  1554.     cmp.b    #ENV_COM_SET_VOL_SPD,d2
  1555.     beq    .c_vol_speed
  1556.     cmp.b    #ENV_COM_TREMOLO_ON,d2
  1557.     beq    .c_tremolo_on
  1558.     cmp.b    #ENV_COM_TREMOLO_OFF,d2
  1559.     beq    .c_tremolo_off
  1560.     cmp.b    #ENV_COM_SET_TRM_WID,d2
  1561.     beq    .c_tremolo_width
  1562.     cmp.b    #ENV_COM_SET_TRM_SPD,d2
  1563.     beq    .c_tremolo_speed
  1564.     cmp.b    #ENV_COM_TREMOR_ON,d2
  1565.     beq    .c_tremor_on
  1566.     cmp.b    #ENV_COM_TREMOR_OFF,d2
  1567.     beq    .c_tremor_off
  1568.     cmp.b    #ENV_COM_SET_TREMOR_1,d2
  1569.     beq    .c_tremor_time1
  1570.     cmp.b    #ENV_COM_SET_TREMOR_2,d2
  1571.     beq    .c_tremor_time2
  1572.                 ; ??? Commande inconnue, on passe à la suite
  1573. .comsuite:
  1574.     IfNe    CHECK>1
  1575.  
  1576.     addq.w    #1,d6        ; Une commande de plus
  1577.     cmp.w    #ENV_COMMANDMAX,d6
  1578.     ble    .comloop        ; Tout baigne, prochaine commande
  1579.     move.w    ev_volume_t(a3),d1    ; Sinon on arrête pour ce tick
  1580.     move.w    d0,pevol_t(a3)
  1581.     bra    .env_set_volume
  1582.  
  1583.     Else
  1584.  
  1585.     bra    .comloop
  1586.  
  1587.     EndC
  1588.  
  1589. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1590. .c_end:
  1591.     move.w    #-1,pevol_t(a3)    ; Signale qu'on s'arrête
  1592.     move.w    ev_volume_t(a3),d1
  1593.     bra    .env_set_volume
  1594. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1595. .c_wait:
  1596.     move.w    (a4,d0.w),ev_waitcpt_t(a3)
  1597.     addq.w    #2,d0
  1598.     move.w    d0,pevol_t(a3)
  1599.     bra    .enveloppe_wait
  1600. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1601. .c_jump:
  1602.     move.w    (a4,d0.w),d0
  1603.     bra.s    .comsuite
  1604. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1605. .c_set_counter:
  1606.     moveq    #0,d2
  1607.     move.b    (a4,d0.w),d2
  1608.     move.w    d2,ev_loopcpt_t(a3)
  1609.     addq.w    #1,d0
  1610.     bra.s    .comsuite
  1611. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1612. .c_loop:
  1613.     addq.w    #2,d0
  1614.     subq.w    #1,ev_loopcpt_t(a3)
  1615.     ble.s    .comsuite
  1616.     move.w    -2(a4,d0.w),d0
  1617.     bra.s    .comsuite
  1618. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1619. .c_key_off:
  1620.     move.w    neton_t(a3),d0
  1621.     lea    ([gtkpl_module_inf1+adr_eton,d0.w*4]),a4
  1622.     move.w    keyoffoffset_e(a4),d2
  1623.     add.w    #data_e,d2
  1624.     move.w    d2,deton_t(a3)
  1625.     clr.w    peton_t(a3)
  1626.     clr.w    et_waitcpt_t(a3)
  1627.     move.w    nepan_t(a3),d0
  1628.     lea    ([gtkpl_module_inf1+adr_epan,d0.w*4]),a4
  1629.     move.w    keyoffoffset_e(a4),d2
  1630.     add.w    #data_e,d2
  1631.     move.w    d2,depan_t(a3)
  1632.     clr.w    pepan_t(a3)
  1633.     clr.w    ep_waitcpt_t(a3)
  1634.     move.w    nevol_t(a3),d0
  1635.     lea    ([gtkpl_module_inf1+adr_evol,d0.w*4]),a4
  1636.     move.w    keyoffoffset_e(a4),d2
  1637.     add.w    #data_e,d2
  1638.     move.w    d2,devol_t(a3)
  1639.     add.w    d2,a4
  1640.     moveq    #0,d0
  1641.     moveq    #0,d6
  1642.     bra    .comsuite
  1643. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1644. .c_volume:
  1645.     move.w    (a4,d0.w),ev_volume_t(a3)
  1646.     addq.w    #2,d0
  1647.     bra    .comsuite
  1648. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1649. .c_vol_step:
  1650.     move.w    (a4,d0.w),ev_volstep_t(a3)
  1651.     addq.w    #2,d0
  1652.     bra    .comsuite
  1653. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1654. .c_vol_speed:
  1655.     moveq    #0,d2
  1656.     move.b    (a4,d0.w),d2
  1657.     move.w    d2,ev_volspeed_t(a3)
  1658.     clr.w    ev_volcpt_t(a3)
  1659.     addq.w    #1,d0
  1660.     bra    .comsuite
  1661. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1662. .c_tremolo_on:
  1663.     move.b    #1,ev_tremoloflag_t(a3)
  1664.     clr.b    ev_tremolocpt_t(a3)
  1665.     bra    .comsuite
  1666. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1667. .c_tremolo_off:
  1668.     clr.b    ev_tremoloflag_t(a3)
  1669.     bra    .comsuite
  1670. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1671. .c_tremolo_width:
  1672.     move.b    (a4,d0.w),ev_tremolowidth_t(a3)
  1673.     addq.w    #1,d0
  1674.     bra    .comsuite
  1675. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1676. .c_tremolo_speed:
  1677.     move.b    (a4,d0.w),ev_tremolospeed_t(a3)
  1678.     addq.w    #1,d0
  1679.     bra    .comsuite
  1680. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1681. .c_tremor_on:
  1682.     move.b    #1,ev_tremorflag_t(a3)
  1683.     clr.b    ev_tremorcpt_t(a3)
  1684.     clr.b    ev_tremorsection_t(a3)
  1685.     bra    .comsuite
  1686. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1687. .c_tremor_off:
  1688.     clr.b    ev_tremorflag_t(a3)
  1689.     bra    .comsuite
  1690. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1691. .c_tremor_time1:
  1692.     move.b    (a4,d0.w),ev_tremortime1_t(a3)
  1693.     addq.w    #1,d0
  1694.     bra    .comsuite
  1695. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1696. .c_tremor_time2:
  1697.     move.b    (a4,d0.w),ev_tremortime2_t(a3)
  1698.     addq.w    #1,d0
  1699.     bra    .comsuite
  1700.  
  1701. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1702. .enveloppe_wait:
  1703.     subq.w    #1,ev_waitcpt_t(a3)    ; On décrémente le Wait
  1704.     move.w    ev_volcpt_t(a3),d0    ; Montée de volume ?
  1705.     bne.s    .noincvol
  1706.  
  1707.     IfNe    CHECK
  1708.  
  1709.     moveq    #0,d1
  1710.     move.w    ev_volume_t(a3),d1
  1711.     move.w    ev_volstep_t(a3),d2
  1712.     ext.l    d2
  1713.     add.l    d2,d1
  1714.     bpl.s    .incvols1
  1715.     moveq    #0,d1
  1716. .incvols1:    cmp.l    #32767,d1
  1717.     ble.s    .incvols2
  1718.     move.w    #32767,d1
  1719. .incvols2:    move.w    d1,ev_volume_t(a3)
  1720.  
  1721.     Else
  1722.  
  1723.     move.w    ev_volstep_t(a3),d1
  1724.     add.w    d1,ev_volume_t(a3)
  1725.  
  1726.     EndC
  1727.  
  1728. .noincvol:    addq.w    #1,d0        ; On incrémente le compteur de volume
  1729.     cmp.w    ev_volspeed_t(a3),d0
  1730.     blt.s    .volcptok
  1731.     moveq    #0,d0
  1732. .volcptok:    move.w    d0,ev_volcpt_t(a3)
  1733.  
  1734. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1735.     moveq    #0,d1
  1736.     move.w    ev_volume_t(a3),d1
  1737.     tst.b    ev_tremoloflag_t(a3)
  1738.     beq.s    .tremor
  1739.     moveq    #0,d3
  1740.     move.b    ev_tremolocpt_t(a3),d3
  1741.     lea    gtkpl_sin_table,a4
  1742.     lsr.w    #2,d3
  1743.     and.w    #$3f,d3        ; d3 = offset dans la table de sinus
  1744.     move.w    (a4,d3.w*2),d3    ; d3 = sinus
  1745.     move.b    ev_tremolowidth_t(a3),d4
  1746.     and.w    #$ff,d4
  1747.     muls.w    d4,d3        ; Multiplie par l'amplitude
  1748.     asr.w    #2,d3
  1749.     add.l    d3,d1        ; Additionne au volume
  1750.  
  1751.     IfNe    CHECK
  1752.     bpl.s    .tremolo1
  1753.     moveq    #0,d1
  1754. .tremolo1:    cmp.l    #32767,d1
  1755.     ble.s    .tremolo2
  1756.     move.w    #32767,d1
  1757. .tremolo2:
  1758.     EndC
  1759.  
  1760.     move.b    ev_tremolospeed_t(a3),d2
  1761.     add.b    d2,ev_tremolocpt_t(a3)
  1762.  
  1763. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1764. .tremor:    tst.b    ev_tremorflag_t(a3)
  1765.     beq.s    .env_set_volume
  1766.     move.b    ev_tremorcpt_t(a3),d2
  1767.     addq.b    #1,d2
  1768.     tst.b    ev_tremorsection_t(a3)    ; Volume On ou Off ?
  1769.     beq.s    .tremors1
  1770.     moveq    #0,d1            ; Volume à 0
  1771.     cmp.b    ev_tremortime2_t(a3),d2
  1772.     blt.s    .tremors2
  1773.     moveq    #0,d2
  1774.     clr.b    ev_tremorsection_t(a3)
  1775.     bra.s    .tremors2
  1776. .tremors1:    cmp.b    ev_tremortime1_t(a3),d2    ; Plein volume
  1777.     blt.s    .tremors2
  1778.     moveq    #0,d2
  1779.     move.b    #1,ev_tremorsection_t(a3)
  1780. .tremors2:    move.b    d2,ev_tremorcpt_t(a3)
  1781.  
  1782. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1783. .env_set_volume:
  1784.     mulu.w    vol_t(a3),d1
  1785.     add.l    d1,d1
  1786.     add.l    d1,d1
  1787.     swap    d1
  1788.     move.w    d1,vol_t(a3)
  1789.  
  1790. ;--- Gestion de l'enveloppe de tonalité --------------------------------------
  1791. gtkpl_gestion_env_tone:
  1792.     move.w    neton_t(a3),d0    ; d0 = Numéro d'enveloppe
  1793.     beq    gtkpl_gestion_env_panning
  1794.     tst.w    et_waitcpt_t(a3)    ; On est sur un Wait ?
  1795.     bgt    .enveloppe_wait    ; Oui, alors on le continue
  1796.     move.w    et_tone_t(a3),d1
  1797.     tst.w    peton_t(a3)    ; Position négative ?
  1798.     bmi    .env_set_tone    ; Oui, l'enveloppe est finie
  1799.     lea    ([gtkpl_module_inf1+adr_eton,d0.w*4]),a4
  1800.     add.w    deton_t(a3),a4    ; a4 pointe sur la section courante
  1801.     moveq    #0,d6        ; d6 = Nombre de commandes exécutées à la file.
  1802.                 ; Limite car si l'utilisateur oublie les Waits
  1803.                 ; on peut avoir des problèmes de boucles infinies
  1804.     move.w    peton_t(a3),d0    ; d0 = position dans la section courante
  1805.  
  1806. .comloop:    move.b    (a4,d0.w),d2    ; d2 = numéro de commande
  1807.     beq.s    .c_end
  1808.     addq.w    #1,d0        ; Pointe maintenant sur le paramètre
  1809.     cmp.b    #ENV_COM_JUMP,d2
  1810.     beq    .c_jump
  1811.     cmp.b    #ENV_COM_WAIT,d2
  1812.     beq.s    .c_wait
  1813.     cmp.b    #ENV_COM_SET_COUNTER,d2
  1814.     beq    .c_set_counter
  1815.     cmp.b    #ENV_COM_LOOP,d2
  1816.     beq    .c_loop
  1817.     cmp.b    #ENV_COM_KEY_OFF,d2
  1818.     beq    .c_key_off
  1819.     cmp.b    #ENV_COM_SET_TONE,d2
  1820.     beq    .c_tone
  1821.     cmp.b    #ENV_COM_SET_TON_STEP,d2
  1822.     beq    .c_tone_step
  1823.     cmp.b    #ENV_COM_SET_TON_SPD,d2
  1824.     beq    .c_tone_speed
  1825.     cmp.b    #ENV_COM_VIBRATO_ON,d2
  1826.     beq    .c_vibrato_on
  1827.     cmp.b    #ENV_COM_VIBRATO_OFF,d2
  1828.     beq    .c_vibrato_off
  1829.     cmp.b    #ENV_COM_SET_VIB_WID,d2
  1830.     beq    .c_vibrato_width
  1831.     cmp.b    #ENV_COM_SET_VIB_SPD,d2
  1832.     beq    .c_vibrato_speed
  1833.                 ; ??? Commande inconnue, on passe à la suite
  1834. .comsuite:
  1835.  
  1836.     IfNe    CHECK>1
  1837.  
  1838.     addq.w    #1,d6        ; Une commande de plus
  1839.     cmp.w    #ENV_COMMANDMAX,d6
  1840.     ble.s    .comloop        ; Tout baigne, prochaine commande
  1841.     move.w    et_tone_t(a3),d1    ; Sinon on arrête pour ce tick
  1842.     move.w    d0,peton_t(a3)
  1843.     bra    .env_set_tone
  1844.  
  1845.     Else
  1846.  
  1847.     bra    .comloop
  1848.  
  1849.     EndC
  1850.  
  1851. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1852. .c_end:
  1853.     move.w    #-1,peton_t(a3)    ; Signale qu'on s'arrête
  1854.     move.w    et_tone_t(a3),d1
  1855.     bra    .env_set_tone
  1856. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1857. .c_wait:
  1858.     move.w    (a4,d0.w),et_waitcpt_t(a3)
  1859.     addq.w    #2,d0
  1860.     move.w    d0,peton_t(a3)
  1861.     bra    .enveloppe_wait
  1862. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1863. .c_jump:
  1864.     move.w    (a4,d0.w),d0
  1865.     bra.s    .comsuite
  1866. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1867. .c_set_counter:
  1868.     moveq    #0,d2
  1869.     move.b    (a4,d0.w),d2
  1870.     move.w    d2,et_loopcpt_t(a3)
  1871.     addq.w    #1,d0
  1872.     bra.s    .comsuite
  1873. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1874. .c_loop:
  1875.     addq.w    #2,d0
  1876.     subq.w    #1,et_loopcpt_t(a3)
  1877.     ble.s    .comsuite
  1878.     move.w    -2(a4,d0.w),d0
  1879.     bra.s    .comsuite
  1880. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1881. .c_key_off:
  1882.     move.w    nevol_t(a3),d0
  1883.     lea    ([gtkpl_module_inf1+adr_evol,d0.w*4]),a4
  1884.     move.w    keyoffoffset_e(a4),d2
  1885.     add.w    #data_e,d2
  1886.     move.w    d2,devol_t(a3)
  1887.     clr.w    pevol_t(a3)
  1888.     clr.w    ev_waitcpt_t(a3)
  1889.     move.w    nepan_t(a3),d0
  1890.     lea    ([gtkpl_module_inf1+adr_epan,d0.w*4]),a4
  1891.     move.w    keyoffoffset_e(a4),d2
  1892.     add.w    #data_e,d2
  1893.     move.w    d2,depan_t(a3)
  1894.     clr.w    pepan_t(a3)
  1895.     clr.w    ep_waitcpt_t(a3)
  1896.     move.w    neton_t(a3),d0
  1897.     lea    ([gtkpl_module_inf1+adr_eton,d0.w*4]),a4
  1898.     move.w    keyoffoffset_e(a4),d2
  1899.     add.w    #data_e,d2
  1900.     move.w    d2,deton_t(a3)
  1901.     add.w    d2,a4
  1902.     moveq    #0,d0
  1903.     moveq    #0,d6
  1904.     bra    .comsuite
  1905. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1906. .c_tone:
  1907.     move.w    (a4,d0.w),et_tone_t(a3)
  1908.     addq.w    #2,d0
  1909.     bra    .comsuite
  1910. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1911. .c_tone_step:
  1912.     move.w    (a4,d0.w),et_tonestep_t(a3)
  1913.     addq.w    #2,d0
  1914.     bra    .comsuite
  1915. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1916. .c_tone_speed:
  1917.     moveq    #0,d2
  1918.     move.b    (a4,d0.w),d2
  1919.     move.w    d2,et_tonespeed_t(a3)
  1920.     clr.w    et_tonecpt_t(a3)
  1921.     addq.w    #1,d0
  1922.     bra    .comsuite
  1923. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1924. .c_vibrato_on:
  1925.     move.b    #1,et_vibratoflag_t(a3)
  1926.     clr.b    et_vibratocpt_t(a3)
  1927.     bra    .comsuite
  1928. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1929. .c_vibrato_off:
  1930.     clr.b    et_vibratoflag_t(a3)
  1931.     bra    .comsuite
  1932. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1933. .c_vibrato_width:
  1934.     move.b    (a4,d0.w),et_vibratowidth_t(a3)
  1935.     addq.w    #1,d0
  1936.     bra    .comsuite
  1937. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1938. .c_vibrato_speed:
  1939.     move.b    (a4,d0.w),et_vibratospeed_t(a3)
  1940.     addq.w    #1,d0
  1941.     bra    .comsuite
  1942.  
  1943. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1944. .enveloppe_wait:
  1945.     subq.w    #1,et_waitcpt_t(a3)    ; On décrémente le Wait
  1946.     move.w    et_tonecpt_t(a3),d0    ; Montée de période ?
  1947.     bne.s    .noincton
  1948.  
  1949.     IfNe    CHECK
  1950.  
  1951.     moveq    #0,d1
  1952.     move.w    et_tone_t(a3),d1
  1953.     move.w    et_tonestep_t(a3),d2
  1954.     ext.l    d2
  1955.     add.l    d2,d1
  1956.     bpl.s    .inctons1
  1957.     moveq    #0,d1
  1958. .inctons1:    cmp.l    #32767,d1
  1959.     ble.s    .inctons2
  1960.     move.w    #32767,d1
  1961. .inctons2:    move.w    d1,et_tone_t(a3)
  1962.  
  1963.     Else
  1964.  
  1965.     move.w    et_tonestep_t(a3),d1
  1966.     add.w    d1,et_tone_t(a3)
  1967.  
  1968.     EndC
  1969.  
  1970. .noincton:    addq.w    #1,d0        ; On incrémente le compteur de tonalité
  1971.     cmp.w    et_tonespeed_t(a3),d0
  1972.     blt.s    .toncptok
  1973.     moveq    #0,d0
  1974. .toncptok:    move.w    d0,et_tonecpt_t(a3)
  1975.  
  1976. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  1977.     moveq    #0,d1
  1978.     move.w    et_tone_t(a3),d1
  1979.     tst.b    et_vibratoflag_t(a3)
  1980.     beq.s    .env_set_tone
  1981.     moveq    #0,d3
  1982.     move.b    et_vibratocpt_t(a3),d3
  1983.     lea    gtkpl_sin_table,a4
  1984.     lsr.w    #2,d3
  1985.     and.w    #$3f,d3        ; d3 = offset dans la table de sinus
  1986.     move.w    (a4,d3.w*2),d3    ; d3 = sinus
  1987.     move.b    et_vibratowidth_t(a3),d4
  1988.     and.w    #$ff,d4
  1989.     muls.w    d4,d3        ; Multiplie par l'amplitude
  1990.     asr.w    #5,d3
  1991.     add.l    d3,d1        ; Additionne à la période
  1992.  
  1993.     IfNe    CHECK
  1994.     bpl.s    .vibrato1
  1995.     moveq    #0,d1
  1996. .vibrato1:    cmp.l    #32767,d1
  1997.     ble.s    .vibrato2
  1998.     move.w    #32767,d1
  1999. .vibrato2:
  2000.     EndC
  2001.  
  2002.     move.b    et_vibratospeed_t(a3),d2
  2003.     add.b    d2,et_vibratocpt_t(a3)
  2004.  
  2005. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2006. .env_set_tone:
  2007.     mulu.w    per_t(a3),d1
  2008.     lsl.l    #4,d1
  2009.  
  2010.     IfNe    CHECK
  2011.  
  2012.     clr.w    d1
  2013.     swap    d1
  2014.     cmp.l    #PERIOD_MINI,d1
  2015.     bge.s    .setton1
  2016.     move.w    #PERIOD_MINI,d1
  2017. .setton1:    cmp.l    #PERIOD_MAXI,d1
  2018.     ble.s    .setton2
  2019.     move.w    #PERIOD_MAXI,d1
  2020.  
  2021.     Else
  2022.  
  2023.     swap    d1
  2024.  
  2025.     EndC
  2026.  
  2027. .setton2:    move.w    d1,per_t(a3)
  2028.  
  2029. ;--- Gestion de l'enveloppe de panning ---------------------------------------
  2030. gtkpl_gestion_env_panning:
  2031.     move.w    nepan_t(a3),d0    ; d0 = Numéro d'enveloppe
  2032.     beq    gtkpl_fin_gestion_enveloppes
  2033.     tst.w    ep_waitcpt_t(a3)    ; On est sur un Wait ?
  2034.     bgt    .enveloppe_wait    ; Oui, alors on le continue
  2035.     move.w    ep_pan_t(a3),d1
  2036.     tst.w    pepan_t(a3)    ; Position négative ?
  2037.     bmi    .env_set_pan    ; Oui, l'enveloppe est finie
  2038.     lea    ([gtkpl_module_inf1+adr_epan,d0.w*4]),a4
  2039.     add.w    depan_t(a3),a4    ; a4 pointe sur la section courante
  2040.     moveq    #0,d6        ; d6 = Nombre de commandes exécutées à la file.
  2041.                 ; Limite car si l'utilisateur oublie les Waits
  2042.                 ; on peut avoir des problèmes de boucles infinies
  2043.     move.w    pepan_t(a3),d0    ; d0 = position dans la section courante
  2044.  
  2045. .comloop:    move.b    (a4,d0.w),d2    ; d2 = numéro de commande
  2046.     beq.s    .c_end
  2047.     addq.w    #1,d0        ; Pointe maintenant sur le paramètre
  2048.     cmp.b    #ENV_COM_JUMP,d2
  2049.     beq.s    .c_jump
  2050.     cmp.b    #ENV_COM_WAIT,d2
  2051.     beq.s    .c_wait
  2052.     cmp.b    #ENV_COM_SET_COUNTER,d2
  2053.     beq.s    .c_set_counter
  2054.     cmp.b    #ENV_COM_LOOP,d2
  2055.     beq.s    .c_loop
  2056.     cmp.b    #ENV_COM_KEY_OFF,d2
  2057.     beq.s    .c_key_off
  2058.     cmp.b    #ENV_COM_SET_PANNING,d2
  2059.     beq    .c_pan
  2060.     cmp.b    #ENV_COM_SET_PAN_STEP,d2
  2061.     beq    .c_pan_step
  2062.     cmp.b    #ENV_COM_SET_PAN_SPD,d2
  2063.     beq    .c_pan_speed
  2064.                 ; ??? Commande inconnue, on passe à la suite
  2065. .comsuite:
  2066.     IfNe    CHECK>1
  2067.  
  2068.     addq.w    #1,d6        ; Une commande de plus
  2069.     cmp.w    #ENV_COMMANDMAX,d6
  2070.     ble.s    .comloop        ; Tout baigne, prochaine commande
  2071.     move.w    ep_pan_t(a3),d1    ; Sinon on arrête pour ce tick
  2072.     move.w    d0,pepan_t(a3)
  2073.     bra    .env_set_pan
  2074.  
  2075.     Else
  2076.  
  2077.     bra    .comloop
  2078.  
  2079.     EndC
  2080.  
  2081.  
  2082. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2083. .c_end:
  2084.     move.w    #-1,pepan_t(a3)    ; Signale qu'on s'arrête
  2085.     move.w    ep_pan_t(a3),d1
  2086.     bra    .env_set_pan
  2087. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2088. .c_wait:
  2089.     move.w    (a4,d0.w),ep_waitcpt_t(a3)
  2090.     addq.w    #2,d0
  2091.     move.w    d0,pepan_t(a3)
  2092.     bra    .enveloppe_wait
  2093. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2094. .c_jump:
  2095.     move.w    (a4,d0.w),d0
  2096.     bra.s    .comsuite
  2097. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2098. .c_set_counter:
  2099.     moveq    #0,d2
  2100.     move.b    (a4,d0.w),d2
  2101.     move.w    d2,ep_loopcpt_t(a3)
  2102.     addq.w    #1,d0
  2103.     bra.s    .comsuite
  2104. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2105. .c_loop:
  2106.     addq.w    #2,d0
  2107.     subq.w    #1,ep_loopcpt_t(a3)
  2108.     ble.s    .comsuite
  2109.     move.w    -2(a4,d0.w),d0
  2110.     bra.s    .comsuite
  2111. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2112. .c_key_off:
  2113.     move.w    nevol_t(a3),d0
  2114.     lea    ([gtkpl_module_inf1+adr_evol,d0.w*4]),a4
  2115.     move.w    keyoffoffset_e(a4),d2
  2116.     add.w    #data_e,d2
  2117.     move.w    d2,devol_t(a3)
  2118.     clr.w    pevol_t(a3)
  2119.     clr.w    ev_waitcpt_t(a3)
  2120.     move.w    neton_t(a3),d0
  2121.     lea    ([gtkpl_module_inf1+adr_eton,d0.w*4]),a4
  2122.     move.w    keyoffoffset_e(a4),d2
  2123.     add.w    #data_e,d2
  2124.     move.w    d2,deton_t(a3)
  2125.     clr.w    peton_t(a3)
  2126.     clr.w    et_waitcpt_t(a3)
  2127.     move.w    nepan_t(a3),d0
  2128.     lea    ([gtkpl_module_inf1+adr_epan,d0.w*4]),a4
  2129.     move.w    keyoffoffset_e(a4),d2
  2130.     add.w    #data_e,d2
  2131.     move.w    d2,depan_t(a3)
  2132.     add.w    d2,a4
  2133.     moveq    #0,d0
  2134.     moveq    #0,d6
  2135.     bra    .comsuite
  2136. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2137. .c_pan:
  2138.     move.w    (a4,d0.w),ep_pan_t(a3)
  2139.     addq.w    #2,d0
  2140.     bra    .comsuite
  2141. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2142. .c_pan_step:
  2143.     move.w    (a4,d0.w),ep_panstep_t(a3)
  2144.     addq.w    #2,d0
  2145.     bra    .comsuite
  2146. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2147. .c_pan_speed:
  2148.     moveq    #0,d2
  2149.     move.b    (a4,d0.w),d2
  2150.     move.w    d2,ep_panspeed_t(a3)
  2151.     clr.w    ep_pancpt_t(a3)
  2152.     addq.w    #1,d0
  2153.     bra    .comsuite
  2154.  
  2155. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2156. .enveloppe_wait:
  2157.     subq.w    #1,ep_waitcpt_t(a3)    ; On décrémente le Wait
  2158.     move.w    ep_pancpt_t(a3),d0    ; Montée de période ?
  2159.     bne.s    .noincpan
  2160.  
  2161.     IfNe    CHECK
  2162.  
  2163.     moveq    #0,d1
  2164.     move.w    ep_pan_t(a3),d1
  2165.     move.w    ep_panstep_t(a3),d2
  2166.     ext.l    d2
  2167.     add.l    d2,d1
  2168.     bpl.s    .incpans1
  2169.     moveq    #0,d1
  2170. .incpans1:    cmp.l    #$FFF,d1
  2171.     ble.s    .incpans2
  2172.     move.w    #$FFF,d1
  2173. .incpans2:    move.w    d1,ep_pan_t(a3)
  2174.  
  2175.     Else
  2176.  
  2177.     move.w    ep_panstep_t(a3),d1
  2178.     add.w    d1,ep_pan_t(a3)
  2179.  
  2180.     EndC
  2181.  
  2182. .noincpan:    addq.w    #1,d0        ; On incrémente le compteur de tonalité
  2183.     cmp.w    ep_panspeed_t(a3),d0
  2184.     blt.s    .pancptok
  2185.     moveq    #0,d0
  2186. .pancptok:    move.w    d0,ep_pancpt_t(a3)
  2187.     move.w    ep_pan_t(a3),d1
  2188.  
  2189. ; -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
  2190. .env_set_pan:
  2191.     move.w    bal_t(a3),d2
  2192.     sub.w    #$800,d2
  2193.     bmi.s    .envsetp1
  2194.     neg.w    d2        ; d2 = -abs(PanPos-2048)
  2195. .envsetp1:    add.w    #$800,d2
  2196.     sub.w    #$800,d1        ; d1 = PanEnv-2048
  2197.     muls.w    d2,d1        ; Multiplication signée
  2198.     asl.l    #5,d1        ; Divise par 2048 (*32/65536)
  2199.     swap    d1
  2200.     add.w    d1,bal_t(a3)    ; PanPos + (PanEnv-2048)*(2048-abs(PanPos-2048))/2048
  2201.  
  2202. gtkpl_fin_gestion_enveloppes:
  2203.     EndC
  2204.  
  2205. ;--- Voie suivante... --------------------------------------------------------
  2206.     dbra    d7,gtkpl_pas_seulement_1ere_vbl
  2207.  
  2208. gtkpl_fin_gestion_partition:
  2209.  
  2210. ;--- Mise à jour du nombre de spl par vbl ------------------------------------
  2211.     moveq    #0,d2
  2212.     move.w    gtkpl_vblsize_int,d0
  2213.     move.w    gtkpl_vblsize_frac,d1
  2214.     add.w    gtkpl_vblsize_count,d1
  2215.     addx.w    d2,d0
  2216.     move.w    d1,gtkpl_vblsize_count
  2217.     move.w    d0,-(sp)
  2218.     sndkernel    set_vblsize    ; *** d0 n'est pas sauvé
  2219.     addq.l    #2,sp
  2220.  
  2221.     movem.l    (sp)+,d0-a6
  2222.     rts
  2223.  
  2224.  
  2225.  
  2226. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  2227. ;    Effets agissant seulement au début d'une note
  2228. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  2229.  
  2230. ;-----------------------------------------------------------------------------
  2231. ;    Set Linear Volume
  2232. ;-----------------------------------------------------------------------------
  2233. fx_set_lin_volume:
  2234.     IfNe    CHECK=2
  2235.     cmp.w    #$100,d4
  2236.     ble.s    .ok2
  2237.     move.w    #$100,d4
  2238.     EndC
  2239.  
  2240. .ok2:    lea    gtkpl_vlin_2_exp,a4
  2241.     move    (a4,d4.w*2),volenot_t(a3)
  2242.     lsl.w    #3,d4
  2243.     move.w    d4,vollnot_t(a3)
  2244.     bra    fx_fin1
  2245.  
  2246. ;-----------------------------------------------------------------------------
  2247. ;    Set Exponential Volume
  2248. ;-----------------------------------------------------------------------------
  2249. fx_set_exp_volume:
  2250.     IfNe    CHECK=2
  2251.     cmp.w    #$800,d4
  2252.     ble.s    .ok3
  2253.     move.w    #$800,d4
  2254.     EndC
  2255.  
  2256. .ok3:    move.w    d4,volenot_t(a3)
  2257.     lea    gtkpl_vexp_2_lin,a4
  2258.     move.w    (a4,d4.w*2),vollnot_t(a3)
  2259.     bra    fx_fin1
  2260.  
  2261. ;-----------------------------------------------------------------------------
  2262. ;    Set Balance
  2263. ;-----------------------------------------------------------------------------
  2264. fx_set_balance:
  2265.     move.w    d4,curbal_t(a3)
  2266.     bra    fx_fin1
  2267.  
  2268. ;-----------------------------------------------------------------------------
  2269. ;    Set Linear Master Volume
  2270. ;-----------------------------------------------------------------------------
  2271. fx_set_lin_master_vol:
  2272.     IfNe    CHECK=2
  2273.     cmp.w    #$FFF,d4
  2274.     ble.s    .ok5
  2275.     move.w    #$FFF,d4
  2276.     EndC
  2277.  
  2278. .ok5:    move.w    d4,-(sp)
  2279.     sndkernel    set_master_vol    ; *** d0 n'est pas sauvé
  2280.     addq.l    #2,sp
  2281.     bra    fx_fin1
  2282.  
  2283. ;-----------------------------------------------------------------------------
  2284. ;    Set Exponential Master Volume
  2285. ;-----------------------------------------------------------------------------
  2286. fx_set_exp_master_vol:
  2287.     lea    gtkpl_vexp_2_lin_mst,a4
  2288.     move.w    (a4,d4.w*2),-(sp)
  2289.     sndkernel    set_master_vol    ; *** d0 n'est pas sauvé
  2290.     addq.l    #2,sp
  2291.     bra    fx_fin1
  2292.  
  2293. ;-----------------------------------------------------------------------------
  2294. ;    Roll (initialisation)
  2295. ;-----------------------------------------------------------------------------
  2296. fx_roll_7_init:
  2297.     move.w    d4,d5
  2298.     and.w    #$FF,d5        ; d5 = nbr de coups maxi
  2299.     bne.s    .pl7
  2300.     moveq    #-1,d5        ; Si d5 = 0, répétitions infinies
  2301. .pl7:    move.w    d5,rollnbr_t(a3)
  2302.     lsr.w    #8,d4        ; d4 = vitesse
  2303.     beq    fx_fin1        ; Si vitesse = 0, répétitions continues
  2304.     move.b    d4,rollspd_t(a3)
  2305.     clr.b    rollcpt_t(a3)
  2306.     bra    fx_fin1
  2307.  
  2308. ;-----------------------------------------------------------------------------
  2309. ;    Arpeggio (initialisation)
  2310. ;-----------------------------------------------------------------------------
  2311. fx_arpeggio_init:
  2312.     clr.w    arpegcpt_t(a3)    ; Compteur à 0
  2313.     bra    fx_fin1
  2314.  
  2315. ;-----------------------------------------------------------------------------
  2316. ;    Detune
  2317. ;-----------------------------------------------------------------------------
  2318. fx_set_ftune:
  2319.     move.w    d4,d5
  2320.     and.w    #$F,d4
  2321.     lsr.w    #4,d5
  2322.     sub.w    d4,d5
  2323.     move.w    d5,norm_f_t(a3)    ; nouveau finetune
  2324.     tst.w    d0
  2325.     beq    fx_fin1        ; On s'en va si il n'y a pas de note à côté
  2326.     move.w    d0,d3
  2327.     add.w    transp_t(a3),d3
  2328.     sub.w    #24,d3
  2329.     lsl.w    #3,d3
  2330.     add.w    d5,d3
  2331.     move.w    (a5,d3.w*2),pernote_t(a3)    ; Sinon on corrige la note
  2332.     bra    fx_fin1
  2333.  
  2334. ;-----------------------------------------------------------------------------
  2335. ;    Note cut, initialisation
  2336. ;-----------------------------------------------------------------------------
  2337. fx_note_precut:
  2338.     move.w    d4,cut_del_t(a3)
  2339.     bra    fx_fin1
  2340.  
  2341. ;-----------------------------------------------------------------------------
  2342. ;    Position Jump
  2343. ;-----------------------------------------------------------------------------
  2344. fx_pos_jump:
  2345.     IfNe    CHECK
  2346.     cmp.w    mod_songlen(a0),d4
  2347.     bge    fx_fin1
  2348.     EndC
  2349.  
  2350.     move.w    d4,mod_songpos(a0)    ; Nouvelle position
  2351.     move.w    ([adr_song,a1],d4.w*2),mod_numpat(a0)    ; Trouve le nouveau pattern
  2352.     move.w    #-1,mod_flagnewpos(a0)    ; On signale que la position a été modifiée
  2353.     bra    fx_fin1
  2354.  
  2355. ;-----------------------------------------------------------------------------
  2356. ;    Set vibrato wave
  2357. ;-----------------------------------------------------------------------------
  2358. fx_set_vib_wave:
  2359.     IfNe    CHECK=2
  2360.     and.b    #3,d4
  2361.     EndC
  2362.  
  2363.     move.b    d4,vibwav_t(a3)
  2364.     bra    fx_fin1
  2365.  
  2366. ;-----------------------------------------------------------------------------
  2367. ;    Set tremolo wave
  2368. ;-----------------------------------------------------------------------------
  2369. fx_set_trem_wave:
  2370.     IfNe    CHECK=2
  2371.     and.b    #3,d4
  2372.     EndC
  2373.  
  2374.     move.b    d4,tremwav_t(a3)
  2375.     bra    fx_fin1
  2376.  
  2377. ;-----------------------------------------------------------------------------
  2378. ;    Break pattern & jump to line
  2379. ;-----------------------------------------------------------------------------
  2380. fx_break_pat:
  2381.     tst.w    mod_flagnewpos(a0)    ; La position a déjà été changée ?
  2382.     bne.s    .np_end        ; Oui, on ne le refait pas.
  2383.     move.w    mod_cursongpos(a0),d3
  2384.     addq.w    #1,d3        ; Nouvelle position
  2385.     cmp.w    mod_songlen(a0),d3    ; Fin de la song ?
  2386.     blt.s    .s_song
  2387.     move.w    mod_songrep(a0),d3    ; Oui, bouclage
  2388. .s_song:    move.w    d3,mod_songpos(a0)
  2389.     move.w    ([adr_song,a1],d3.w*2),mod_numpat(a0)    ; Trouve le nouveau pattern
  2390. .np_end:
  2391.     IfNe    CHECK=2
  2392.     move.w    mod_numpat(a0),d5
  2393.     move.l    (adr_pattern,a1,d5.w*4),a4
  2394.     cmp.w    nlines_p(a4),d4
  2395.     blt.s    .ok
  2396.     moveq    #0,d4        ; Si la nouvelle ligne est en dehors du pattern
  2397.     EndC
  2398.  
  2399. .ok:    move.w    d4,mod_linepos(a0)    ; Pointe sur la nouvelle ligne du pattern
  2400.     bra    fx_fin1
  2401.  
  2402. ;-----------------------------------------------------------------------------
  2403. ;    Pattern loop
  2404. ;-----------------------------------------------------------------------------
  2405. fx_pattern_loop:
  2406.     tst.b    d4        ; Début de boucle ?
  2407.     bne.s    .doloop        ; Non, c'est la fin de la boucle alors
  2408.     tst.w    ploopn_t(a3)
  2409.     bne    fx_fin1        ; C'est pas la 1ère fois, on fait rien
  2410.     move.w    mod_curlinepos(a0),ploopp_t(a3)    ; Sinon, on mémorise la position de bouclage
  2411.     move.w    mod_cursongpos(a0),ploops_t(a3)
  2412.     bra    fx_fin1
  2413. .doloop:    tst.w    ploopn_t(a3)    ; Déjà dans une boucle ?
  2414.     beq.s    .suite        ; Non, nouveau compteur
  2415.     move.w    ploopn_t(a3),d4    ; d4 = nbr de répétition à faire
  2416.     subq.w    #1,d4        ; Boucle -1
  2417. .suite:    move.w    d4,ploopn_t(a3)
  2418.     beq    fx_fin1        ; Si on en est à 0, fin de la boucle
  2419.     move.w    ploopp_t(a3),mod_linepos(a0)    ; Point de bouclage
  2420.     move.w    ploops_t(a3),mod_songpos(a0)    ; On se remet sur la bonne position
  2421.     move.w    mod_songpos(a0),d3        ; Pattern correspondant
  2422.     move.w    ([adr_song,a1],d3.w*2),mod_numpat(a0)
  2423.     bra    fx_fin1        ; si par hasard on était allé ailleurs.
  2424.  
  2425. ;-----------------------------------------------------------------------------
  2426. ;    Set global speed
  2427. ;-----------------------------------------------------------------------------
  2428. fx_set_global_speed:
  2429.     tst.w    d4
  2430.     beq    fx_fin1
  2431.     cmp.w    #31,d4
  2432.     bgt.s    .tempo
  2433.     move.w    d4,mod_speed(a0)
  2434.     moveq    #125,d4        ; Tempo 125
  2435. .tempo:
  2436.     move.w    d4,-(sp)
  2437.     bsr    gtkpl_set_tempo    ; *** d0 n'est pas sauvé
  2438.     addq.l    #2,sp
  2439.     bra    fx_fin1
  2440.  
  2441. ;-----------------------------------------------------------------------------
  2442. ;    Set number of frames
  2443. ;-----------------------------------------------------------------------------
  2444. fx_set_nbr_of_frames:
  2445.     IfNe    CHECK=2
  2446.     tst.w    d4
  2447.     beq    fx_fin1
  2448.     EndC
  2449.  
  2450.     move.w    d4,mod_speed(a0)
  2451.     bra    fx_fin1
  2452.  
  2453. ;-----------------------------------------------------------------------------
  2454. ;    Set fine speed
  2455. ;-----------------------------------------------------------------------------
  2456. fx_set_fine_speed:
  2457.     add.w    d4,d4
  2458.  
  2459.     IfNe    CHECK=2
  2460.     beq    fx_fin1
  2461.     EndC
  2462.  
  2463.     moveq    #0,d5
  2464.     sndkernel    set_replay_freq    ; *** d0 n'est pas sauvé
  2465.     divu.w    #125*4*6/60,d0
  2466.     sub.w    #256,d0
  2467.     add.w    d0,d4
  2468.     move.w    d4,-(sp)        ; La valeur de mod_tempo n'est pas changée!
  2469.     sndkernel    set_vblsize    ; *** d0 n'est pas sauvé
  2470.     addq.l    #2,sp
  2471.     bra    fx_fin1
  2472.  
  2473. ;-----------------------------------------------------------------------------
  2474. ;    Fine portamento up
  2475. ;-----------------------------------------------------------------------------
  2476. fx_fine_porta_up:
  2477.     move.w    pernote_t(a3),d5
  2478.     lsl.w    #4,d4
  2479.     bne.s    .ok2
  2480.     move.w    fportspd_t(a3),d4
  2481. .ok2:    move.w    d4,fportspd_t(a3)
  2482.     sub.w    d4,d5
  2483.  
  2484.     IfNe    CHECK
  2485.     cmp.w    #PERIOD_MINI,d5
  2486.     bge.s    .ok
  2487.     move.w    #PERIOD_MINI,d5
  2488.     EndC
  2489.  
  2490. .ok:    move.w    d5,pernote_t(a3)
  2491.     bra    fx_fin1
  2492.  
  2493. ;-----------------------------------------------------------------------------
  2494. ;    Fine portamento down
  2495. ;-----------------------------------------------------------------------------
  2496. fx_fine_porta_down:
  2497.     IfNe    CHECK
  2498.     ext.l    d4
  2499.     EndC
  2500.  
  2501.     lsl.w    #4,d4
  2502.     bne.s    .ok2
  2503.     move.w    fportspd_t(a3),d4
  2504. .ok2:    move.w    d4,fportspd_t(a3)
  2505.     add.w    pernote_t(a3),d4
  2506.  
  2507.     IfNe    CHECK
  2508.     cmp.l    #PERIOD_MAXI,d4
  2509.     ble.s    .ok
  2510.     move.w    #PERIOD_MAXI,d4
  2511.     EndC
  2512.  
  2513. .ok:    move.w    d4,pernote_t(a3)
  2514.     bra    fx_fin1
  2515.  
  2516. ;-----------------------------------------------------------------------------
  2517. ;    Note delay - initialisation
  2518. ;-----------------------------------------------------------------------------
  2519. fx_predelay:
  2520.     move.w    d4,delay_t(a3)
  2521.     bra    fx_fin1
  2522.  
  2523. ;-----------------------------------------------------------------------------
  2524. ;    Fine volume slide
  2525. ;-----------------------------------------------------------------------------
  2526. fx_fine_v_sldown_l:
  2527.     neg.w    d4
  2528. fx_fine_v_slup_l:
  2529.     tst.w    d4
  2530.     bne.s    .ok
  2531.     move.w    fvolslspd_t(a3),d4
  2532. .ok:    move.w    d4,fvolslspd_t(a3)
  2533.     bsr    fx_do_v_slide_l
  2534.     bra    fx_fin1
  2535.  
  2536. ;-----------------------------------------------------------------------------
  2537. ;    Fine exponential volume slide
  2538. ;-----------------------------------------------------------------------------
  2539. ; *** Ces 2 effets sont inutilisés pour l'instant
  2540. ;fx_fine_v_sldown_e:            ; Fine volume slide down (exp) \
  2541. ;    neg.w    d4        ;                               > *** Ne pas séparer
  2542. ;fx_fine_v_slup_e:            ; Fine volume slide up (exp)   /
  2543. ;    bsr    fx_do_v_slide_e
  2544. ;    bra    fx_fin1
  2545.  
  2546. ;-----------------------------------------------------------------------------
  2547. ;    Fine master volume slide
  2548. ;-----------------------------------------------------------------------------
  2549. fx_fine_mv_sldown_l:            ; Fine master volume slide up (lin)   \
  2550.     neg.w    d4        ;                                      > *** Ne pas séparer
  2551. fx_fine_mv_slup_l:            ; Fine master volume slide down (lin) /
  2552.     bsr    fx_do_mv_slide_l
  2553.     bra    fx_fin1
  2554.  
  2555. ;-----------------------------------------------------------------------------
  2556. ;    Pattern delay
  2557. ;-----------------------------------------------------------------------------
  2558. fx_pattern_delay:
  2559.     move.w    d4,mod_patrep(a0)
  2560.     bra    fx_fin1
  2561.  
  2562. ;-----------------------------------------------------------------------------
  2563. ;    Roll + volume slide (initialisation)
  2564. ;-----------------------------------------------------------------------------
  2565. fx_roll_and_vsl_init:
  2566.     and.w    #15,d4        ; d4 = vitesse
  2567.     beq    fx_fin1        ; Si vitesse = 0, répétitions continues
  2568.     move.b    d4,rollspd_t(a3)
  2569.     clr.b    rollcpt_t(a3)
  2570.     bra    fx_fin1
  2571.  
  2572. ;-----------------------------------------------------------------------------
  2573. ;    Roll + volume slide + set balance
  2574. ;    (initialisation)
  2575. ;-----------------------------------------------------------------------------
  2576. fx_roll_and_vsl_and_sbl_init:
  2577.     move.w    d4,d5
  2578.     and.w    #$F00,d5
  2579.     move.w    d5,curbal_t(a3)    ; Fixe la balance
  2580.     and.w    #15,d4        ; d4 = vitesse
  2581.     beq    fx_fin1        ; Si vitesse = 0, répétitions continues
  2582.     move.b    d4,rollspd_t(a3)
  2583.     clr.b    rollcpt_t(a3)
  2584.     bra    fx_fin1
  2585.  
  2586. ;-----------------------------------------------------------------------------
  2587. ;    Trémor (initialisation)
  2588. ;-----------------------------------------------------------------------------
  2589. fx_tremor_init:
  2590.     tst.b    d4
  2591.     beq    fx_fin1
  2592.     move.b    d4,d5
  2593.     lsr.b    #4,d5
  2594.     bne.s    .ok1
  2595.     moveq    #16,d5
  2596. .ok1:    move.b    d5,tremor1_t(a3)
  2597.     and.b    #15,d4
  2598.     bne.s    .ok2
  2599.     moveq    #16,d4
  2600. .ok2:    add.b    d5,d4
  2601.     move.b    d4,tremor2_t(a3)
  2602.     bra    fx_fin1
  2603.  
  2604.  
  2605. ;-----------------------------------------------------------------------------
  2606. ;    Set flags
  2607. ;-----------------------------------------------------------------------------
  2608. fx_set_flags:
  2609. .bit0:
  2610.     btst    #0,d4        ; Bit 0 : interpolation
  2611.     beq.s    .bit0off
  2612.     move.w    #1,interpol_t(a3)
  2613.     bra.s    .fin
  2614. .bit0off:    clr.w    interpol_t(a3)
  2615. .fin:
  2616.     bra    fx_fin1
  2617.  
  2618. ;-----------------------------------------------------------------------------
  2619. ;    Set volume envelope
  2620. ;-----------------------------------------------------------------------------
  2621. fx_set_vol_env:
  2622.     IfNE    CHECK=2
  2623.     cmp.w    #NBRVOLENV_MAXI-1,d4
  2624.     ble.s    .ok
  2625.     moveq    #0,d4
  2626.     EndC
  2627.  
  2628. .ok:    move.w    d4,nevol_t(a3)
  2629.     beq    fx_fin1
  2630.  
  2631.     env_volume_init    a3
  2632.     bra    fx_fin1
  2633.  
  2634. ;-----------------------------------------------------------------------------
  2635. ;    Set tone envelope
  2636. ;-----------------------------------------------------------------------------
  2637. fx_set_ton_env:
  2638.     IfNE    CHECK=2
  2639.     cmp.w    #NBRTONENV_MAXI-1,d4
  2640.     ble.s    .ok
  2641.     moveq    #0,d4
  2642.     EndC
  2643.  
  2644. .ok:    move.w    d4,neton_t(a3)
  2645.     beq    fx_fin1
  2646.  
  2647.     env_tone_init    a3
  2648.     bra    fx_fin1
  2649.  
  2650. ;-----------------------------------------------------------------------------
  2651. ;    Set panning envelope
  2652. ;-----------------------------------------------------------------------------
  2653. fx_set_pan_env:
  2654.     IfNE    CHECK=2
  2655.     cmp.w    #NBRPANENV_MAXI-1,d4
  2656.     ble.s    .ok
  2657.     moveq    #0,d4
  2658.     EndC
  2659.  
  2660. .ok:    move.w    d4,nepan_t(a3)
  2661.     beq    fx_fin1
  2662.  
  2663.     env_panning_init    a3
  2664.     bra    fx_fin1
  2665.  
  2666. ;-----------------------------------------------------------------------------
  2667. ;    Set volume envelope (Key Off)
  2668. ;-----------------------------------------------------------------------------
  2669. fx_set_vol_env_ko:
  2670.     IfNE    CHECK=2
  2671.     cmp.w    #NBRVOLENV_MAXI-1,d4
  2672.     ble.s    .ok
  2673.     moveq    #0,d4
  2674.     EndC
  2675.  
  2676. .ok:    move.w    d4,nevol_t(a3)
  2677.     beq    fx_fin1
  2678.  
  2679.     env_volume_init    a3
  2680.     move.w    ([gtkpl_module_inf1+adr_evol,d4.w*4],keyoffoffset_e.w),d6
  2681.     add.w    d6,devol_t(a3)
  2682.     bra    fx_fin1
  2683.  
  2684. ;-----------------------------------------------------------------------------
  2685. ;    Set tone envelope (Key Off)
  2686. ;-----------------------------------------------------------------------------
  2687. fx_set_ton_env_ko:
  2688.     IfNE    CHECK=2
  2689.     cmp.w    #NBRTONENV_MAXI-1,d4
  2690.     ble.s    .ok
  2691.     moveq    #0,d4
  2692.     EndC
  2693.  
  2694. .ok:    move.w    d4,neton_t(a3)
  2695.     beq    fx_fin1
  2696.  
  2697.     env_tone_init    a3
  2698.     move.w    ([gtkpl_module_inf1+adr_eton,d4.w*4],keyoffoffset_e.w),d6
  2699.     add.w    d6,deton_t(a3)
  2700.     bra    fx_fin1
  2701.  
  2702. ;-----------------------------------------------------------------------------
  2703. ;    Set panning envelope (Key Off)
  2704. ;-----------------------------------------------------------------------------
  2705. fx_set_pan_env_ko:
  2706.     IfNE    CHECK=2
  2707.     cmp.w    #NBRPANENV_MAXI-1,d4
  2708.     ble.s    .ok
  2709.     moveq    #0,d4
  2710.     EndC
  2711.  
  2712. .ok:    move.w    d4,nepan_t(a3)
  2713.     beq    fx_fin1
  2714.  
  2715.     env_panning_init    a3
  2716.     move.w    ([gtkpl_module_inf1+adr_epan,d4.w*4],keyoffoffset_e.w),d6
  2717.     add.w    d6,depan_t(a3)
  2718.     bra    fx_fin1
  2719.  
  2720. ;-----------------------------------------------------------------------------
  2721. ;    Fine Sample Offset
  2722. ;-----------------------------------------------------------------------------
  2723. fx_fine_sample_offset:
  2724.     lsl.w    #4,d4
  2725.     ext.l    d4
  2726.  
  2727.     IfNE    CHECK
  2728.     move.l    reppos_t(a3),d6
  2729.     add.l    replen_t(a3),d6
  2730.     cmp.l    d6,d4
  2731.     blt.s    .ok
  2732.     move.l    d6,d4
  2733.     subq.l    #1,d4
  2734.     bpl.s    .ok
  2735.     moveq    #0,d4
  2736.     EndC
  2737.  
  2738. .ok:    move.l    d4,pos_t(a3)
  2739.     bra    fx_fin1
  2740.  
  2741. ;-----------------------------------------------------------------------------
  2742. ;    Very Fine Sample Offset
  2743. ;-----------------------------------------------------------------------------
  2744. fx_very_fine_sample_offset:
  2745.     ext.l    d4
  2746.  
  2747.     IfNE    CHECK
  2748.     move.l    reppos_t(a3),d6
  2749.     add.l    replen_t(a3),d6
  2750.     cmp.l    d6,d4
  2751.     blt.s    .ok
  2752.     move.l    d6,d4
  2753.     subq.l    #1,d4
  2754.     bpl.s    .ok
  2755.     moveq    #0,d4
  2756.     EndC
  2757.  
  2758. .ok:    move.l    d4,pos_t(a3)
  2759.     bra    fx_fin1
  2760.  
  2761. ;-----------------------------------------------------------------------------
  2762. ;    Increment Sample Position
  2763. ;-----------------------------------------------------------------------------
  2764. fx_inc_sample_pos:
  2765.     ext.l    d4
  2766.     add.l    pos_t(a3),d4
  2767.  
  2768.     IfNE    CHECK
  2769.  
  2770.     move.l    reppos_t(a3),d6
  2771.     add.l    replen_t(a3),d6
  2772.     cmp.l    d6,d4
  2773.     blt.s    .ok
  2774.  
  2775.     sub.l    reppos_t(a3),d4    ; Si on déborde de la boucle
  2776.     divul.l    replen_t(a3),d6:d4
  2777.     add.l    reppos_t(a3),d6
  2778.     move.l    d6,d4        ; pos = ((pos + N - rep) MOD replen) + rep
  2779.  
  2780.     EndC
  2781.  
  2782. .ok:    move.l    d4,pos_t(a3)
  2783.     bra    fx_fin1
  2784.  
  2785. ;-----------------------------------------------------------------------------
  2786. ;    Decrement Sample Position
  2787. ;-----------------------------------------------------------------------------
  2788. fx_dec_sample_pos:
  2789.     ext.l    d4
  2790.     sub.l    d4,pos_t(a3)
  2791.  
  2792.     IfNE    CHECK
  2793.     bpl    fx_fin1
  2794.     clr.l    pos_t(a3)
  2795.     EndC
  2796.  
  2797.     bra    fx_fin1
  2798.  
  2799. ;-----------------------------------------------------------------------------
  2800. ;    AutoTempo (initialisation)
  2801. ;-----------------------------------------------------------------------------
  2802. fx_init_autotempo:
  2803.     move.w    #1,flag_autotempo_t(a3)    ; On le fait en 'tous les ticks' à cause
  2804.     bra    fx_fin1            ; d'une éventuelle commande de vitesse
  2805.  
  2806. ;-----------------------------------------------------------------------------
  2807. ;    AutoPeriod (initialisation)
  2808. ;-----------------------------------------------------------------------------
  2809. fx_init_autoperiod:
  2810.     move.w    #1,flag_autoperiod_t(a3)    ; On le fait en 'tous les ticks' à cause
  2811.     bra    fx_fin1            ; d'une éventuelle commande de vitesse
  2812.  
  2813.  
  2814.  
  2815. ;-----------------------------------------------------------------------------
  2816. ;    Demo Synchro
  2817. ;-----------------------------------------------------------------------------
  2818. fx_demo_synchro:
  2819.     move.w    d4,gtkpl_demo_synchro
  2820.     bra    fx_fin1
  2821.     
  2822.  
  2823.  
  2824. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  2825. ;    Effets agissant pendant la note
  2826. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  2827.  
  2828. ;-----------------------------------------------------------------------------
  2829. ;    Arpeggio
  2830. ;-----------------------------------------------------------------------------
  2831. fx_arpeggio:
  2832.     moveq    #0,d5
  2833.     move.w    arpegcpt_t(a3),d5
  2834.     addq.w    #1,arpegcpt_t(a3)
  2835.     divu.w    #3,d5
  2836.     swap    d5
  2837.     tst.w    d5
  2838.     beq    fx_fin_normale
  2839.     cmp.b    #1,d5
  2840.     bne.s    .suite
  2841.     lsr.b    #4,d4
  2842. .suite:    and.b    #$F,d4        ; d4 = nbr de 1/2 tons à décaler
  2843.     beq    fx_fin_normale
  2844.     add.w    curnote_t(a3),d4
  2845.     add.w    transp_t(a3),d4
  2846.     sub.w    #24,d4
  2847.     lsl.w    #3,d4
  2848.     add.w    norm_f_t(a3),d4
  2849.     move.w    (a5,d4.w*2),d4
  2850.  
  2851.     IfNe    CHECK
  2852.     cmp.w    #PERIOD_MINI,d4
  2853.     bge.s    .suite2
  2854.     move.w    #PERIOD_MINI,d4
  2855.     EndC
  2856.  
  2857. .suite2:    move.w    d4,per_t(a3)
  2858.     move.w    vollnot_t(a3),vol_t(a3)    ; On met le bon volume car on ne
  2859.     move.w    curbal_t(a3),bal_t(a3)    ; repasse pas par la fin normale
  2860.     bra    fx_fin_speciale
  2861.  
  2862. ;-----------------------------------------------------------------------------
  2863. ;    Portamento up
  2864. ;-----------------------------------------------------------------------------
  2865. fx_porta_up:
  2866.     lsl.w    #4,d4
  2867.     bne.s    .ok
  2868.     move.w    portspd_t(a3),d4
  2869. .ok:    move.w    d4,portspd_t(a3)
  2870.     sub.w    d4,pernote_t(a3)
  2871.  
  2872.     IfNe    CHECK
  2873.     cmp.w    #PERIOD_MINI,pernote_t(a3)
  2874.     bge    fx_fin_normale
  2875.     move.w    #PERIOD_MINI,pernote_t(a3)
  2876.     EndC
  2877.  
  2878.     bra    fx_fin_normale
  2879.  
  2880. ;-----------------------------------------------------------------------------
  2881. ;    Extra fine portamento up
  2882. ;-----------------------------------------------------------------------------
  2883. fx_extra_fine_porta_up:
  2884.     tst.w    d4
  2885.     bne.s    .ok
  2886.     move.w    portspd_t(a3),d4
  2887. .ok:    move.w    d4,portspd_t(a3)
  2888.     sub.w    d4,pernote_t(a3)
  2889.  
  2890.     IfNe    CHECK
  2891.     cmp.w    #PERIOD_MINI,pernote_t(a3)
  2892.     bge    fx_fin_normale
  2893.     move.w    #PERIOD_MINI,pernote_t(a3)
  2894.     EndC
  2895.  
  2896.     bra    fx_fin_normale
  2897.  
  2898. ;-----------------------------------------------------------------------------
  2899. ;    Portamento down
  2900. ;-----------------------------------------------------------------------------
  2901. fx_porta_down:
  2902.     lsl.w    #4,d4
  2903.     bne.s    .ok
  2904.     move.w    portspd_t(a3),d4
  2905. .ok:    move.w    d4,portspd_t(a3)
  2906.     ext.l    d4
  2907.     add.w    pernote_t(a3),d4
  2908.  
  2909.     IfNe    CHECK
  2910.     cmp.l    #PERIOD_MAXI,d4
  2911.     ble.s    .suite
  2912.     move.w    #PERIOD_MAXI,d4
  2913.     EndC
  2914.  
  2915. .suite:    move.w    d4,pernote_t(a3)
  2916.     bra    fx_fin_normale
  2917.  
  2918. ;-----------------------------------------------------------------------------
  2919. ;    Extra fine portamento down
  2920. ;-----------------------------------------------------------------------------
  2921. fx_extra_fine_porta_down:
  2922.     ext.l    d4
  2923.     bne.s    .ok
  2924.     move.w    portspd_t(a3),d4
  2925. .ok:    move.w    d4,portspd_t(a3)
  2926.     add.w    pernote_t(a3),d4
  2927.  
  2928.     IfNe    CHECK
  2929.     cmp.l    #PERIOD_MAXI,d4
  2930.     ble.s    .suite
  2931.     move.w    #PERIOD_MAXI,d4
  2932.     EndC
  2933.  
  2934. .suite:    move.w    d4,pernote_t(a3)
  2935.     bra    fx_fin_normale
  2936.  
  2937. ;-----------------------------------------------------------------------------
  2938. ;    Tone portamento
  2939. ;-----------------------------------------------------------------------------
  2940. fx_tone_porta:
  2941.     bsr.s    fx_do_tone_porta
  2942.     bra    fx_fin_normale
  2943.  
  2944. ;-----------------------------------------------------------------------------
  2945. ;    Extra fine tone portamento
  2946. ;-----------------------------------------------------------------------------
  2947. fx_extra_fine_tone_porta:
  2948.     bsr.s    fx_do_very_fine_tone_porta
  2949.     bra    fx_fin_normale
  2950.  
  2951. fx_do_tone_porta:            ; Exécute le Tone Portamento
  2952.     lsl.w    #4,d4
  2953. fx_do_very_fine_tone_porta:
  2954.     tst.w    d4
  2955.     bne.s    .suite1
  2956.     move.w    portspd_t(a3),d4
  2957. .suite1:    move.w    d4,portspd_t(a3)
  2958.     move.w    pernote_t(a3),d5    ; d5 = période actuelle
  2959.     move.w    per2sl_t(a3),d6    ; d6 = période à atteindre
  2960.     cmp.w    d6,d5
  2961.     beq.s    .fin2
  2962.     blt.s    .monte
  2963.     sub.w    d4,d5
  2964.     cmp.w    d6,d5
  2965.     bge.s    .fin
  2966.     move.w    d6,d5        ; On a atteint la nouvelle note
  2967.     move.w    note2sl_t(a3),curnote_t(a3)
  2968.     bra.s    .fin
  2969. .monte:    add.w    d4,d5
  2970.     cmp.w    d6,d5
  2971.     ble.s    .fin
  2972.     move.w    d6,d5        ; On a atteint la nouvelle note
  2973.     move.w    note2sl_t(a3),curnote_t(a3)
  2974. .fin:    move.w    d5,pernote_t(a3)
  2975. .fin2:    rts
  2976.  
  2977. ;-----------------------------------------------------------------------------
  2978. ;    Vibrato
  2979. ;-----------------------------------------------------------------------------
  2980. fx_vibrato:
  2981.     bsr.s    fx_do_vibrato
  2982.     bra    fx_fin_speciale
  2983.  
  2984. fx_do_vibrato:            ; Exécute le Vibrato
  2985.     move.w    d4,d5        ; Retour par fx_fin_speciale !
  2986.     and.w    #$f,d4
  2987.     beq.s    .suite1
  2988.     move.b    d4,vibamp_t(a3)
  2989. .suite1:    lsr.w    #2,d5
  2990.     and.w    #$3c,d5
  2991.     beq.s    .suite2
  2992.     move.b    d5,vibspd_t(a3)
  2993. .suite2:    moveq    #0,d3
  2994.     move.b    vibcpt_t(a3),d3
  2995.     move.b    vibwav_t(a3),d4
  2996.     lea    gtkpl_sin_table,a4
  2997.     and.b    #3,d4
  2998.     beq.s    .sinus        ; Forme sinus : 0
  2999.     lea    gtkpl_square_table,a4
  3000.     subq.b    #1,d4
  3001.     bne.s    .sinus        ; Forme carrée : 2 (ou 3)
  3002.     lea    gtkpl_rampdown_table,a4
  3003. .sinus:    lsr.w    #2,d3
  3004.     and.w    #$3f,d3        ; d3 = offset dans la table de sinus
  3005.     move.w    (a4,d3.w*2),d3    ; d3 = sinus
  3006.     move.b    vibamp_t(a3),d4
  3007.     and.w    #$f,d4
  3008.     muls.w    d4,d3        ; Multiplie par l'amplitude
  3009.     asr.w    #3,d3
  3010.     move.w    pernote_t(a3),d4
  3011.     add.w    d3,d4        ; Nouvelle période de la note
  3012.     move.b    vibspd_t(a3),d3
  3013.     add.b    d3,vibcpt_t(a3)    ; Ajoute la fréquence
  3014.     move.w    d4,per_t(a3)    ; Valide la nouvelle période
  3015.     move.w    vollnot_t(a3),vol_t(a3)    ; Met le volume
  3016.     move.w    curbal_t(a3),bal_t(a3)
  3017.     rts
  3018.  
  3019. ;-----------------------------------------------------------------------------
  3020. ;    Tone portamento + vibrato
  3021. ;-----------------------------------------------------------------------------
  3022. fx_tone_porta_vib:
  3023.     bsr    fx_do_tone_porta
  3024.     moveq    #0,d4
  3025.     bsr    fx_do_vibrato
  3026.     bra    fx_fin_speciale
  3027.  
  3028. ;-----------------------------------------------------------------------------
  3029. ;    Vibrato + tone portamento
  3030. ;-----------------------------------------------------------------------------
  3031. fx_vib_tone_porta:
  3032.     move.w    d4,-(sp)
  3033.     moveq    #0,d4
  3034.     bsr    fx_do_tone_porta
  3035.     move.w    d4,(sp)+
  3036.     bsr    fx_do_vibrato
  3037.     bra    fx_fin_speciale
  3038.  
  3039. ;-----------------------------------------------------------------------------
  3040. ;    Tremolo
  3041. ;-----------------------------------------------------------------------------
  3042. fx_tremolo:
  3043.     move.w    d4,d5
  3044.     and.w    #$f,d4
  3045.     beq.s    .suite1
  3046.     move.b    d4,tremamp_t(a3)
  3047. .suite1:    lsr.w    #2,d5
  3048.     and.w    #$3c,d5
  3049.     beq.s    .suite2
  3050.     move.b    d5,tremspd_t(a3)
  3051. .suite2:    moveq    #0,d3
  3052.     move.b    tremcpt_t(a3),d3
  3053.     move.b    tremwav_t(a3),d4
  3054.     lea    gtkpl_sin_table,a4
  3055.     and.b    #3,d4
  3056.     beq.s    .sinus        ; Forme sinus : 0
  3057.     lea    gtkpl_square_table,a4
  3058.     subq.b    #1,d4
  3059.     bne.s    .sinus        ; Forme carrée : 2 (ou 3)
  3060.     lea    gtkpl_rampdown_table,a4
  3061. .sinus:    lsr.w    #2,d3
  3062.     and.w    #$3f,d3        ; d3 = offset dans la table de sinus
  3063.     move.w    (a4,d3.w*2),d3    ; d3 = sinus
  3064.     move.b    tremamp_t(a3),d4
  3065.     and.w    #$f,d4
  3066.     muls.w    d4,d3        ; Multiplie par l'amplitude
  3067.     asr.w    #1,d3
  3068.     move.w    vollnot_t(a3),d4
  3069.  
  3070.     IfNe    CHECK
  3071.     tst.b    tremcpt_t(a3)    ; Négatif ?
  3072.     bmi.s    .negatif
  3073.     EndC
  3074.  
  3075.     add.w    d3,d4        ; Nouveau volume de la note
  3076.  
  3077.     IfNe    CHECK
  3078.     cmp.w    #$800,d4
  3079.     ble.s    .ok
  3080.     move.w    #$800,d4
  3081.     bra.s    .ok
  3082. .negatif:    add.w    d3,d4        ; Nouveau volume de la note
  3083.     bpl.s    .ok
  3084.     moveq    #0,d4
  3085.     EndC
  3086.  
  3087. .ok:    move.b    tremspd_t(a3),d3
  3088.     add.b    d3,tremcpt_t(a3)    ; Ajoute la fréquence
  3089.     move.w    d4,vol_t(a3)    ; Valide le nouveau volume
  3090.     move.w    pernote_t(a3),per_t(a3)    ; Met la période
  3091.     move.w    curbal_t(a3),bal_t(a3)
  3092.     bra    fx_fin_speciale
  3093.  
  3094. ;-----------------------------------------------------------------------------
  3095. ;    Note delay
  3096. ;-----------------------------------------------------------------------------
  3097. fx_delay:
  3098.     tst.w    delay_t(a3)
  3099.     bmi    fx_fin_normale    ; -1, l'effet n'a plus de raison d'être
  3100.     bne    .nxt_vbl        ; Compteur<>0, on attend encore
  3101.                 ; On initialise une note normale
  3102.     tst.w    d1        ; Y a-t-il un instrument ?
  3103.     beq    .pas_inst
  3104.     move.w    d1,instr_t(a3)    ; Oui, il devient l'instrument courant
  3105.     move.l    (adr_instrset,a1,d1.w*4),a2    ; a2 pointe sur l'instrument
  3106.     move.w    vol_i(a2),d3    ; Prend le volume dans d3
  3107.     move.w    curnote_t(a3),d4
  3108.     tst.w    d0        ; Nouvelle note ?
  3109.     beq.s    .note_s
  3110.     move.w    d0,d4
  3111. .note_s:    move.b    transp_i(a2,d4.w*2),d1
  3112.     ext.w    d1
  3113.     move.w    d1,transp_t(a3)    ; Transposition
  3114.     add.w    d1,d3        ; Sur la note
  3115.     moveq    #0,d1
  3116.     move.b    splnum_i(a2,d4.w*2),d1
  3117.     move.w    d1,ninstr_t(a3)    ; Il devient le sample courant
  3118.     move.l    (adr_samples,a1,d1.w*4),a4    ; Recopie le finetune
  3119.     move.w    vol_s(a4),volsam_t(a3)    ; et le volume du sample.
  3120.     move.w    d3,norm_v_t(a3)        ; Le volume de l'instrument dans la voie
  3121.     move.w    ftune_s(a4),norm_f_t(a3)
  3122.     move.w    nbits_s(a4),d3        ; Nombre de bits
  3123.     lsr.w    #3,d3
  3124.     move.w    d3,nbits_t(a3)
  3125.     move.w    fech_s(a4),fech_t(a3)        ; Fréquence d'échantillonnage
  3126.     move.w    autobal_s(a4),d3
  3127.     bmi.s    .pasbalnc
  3128.     move.w    d3,curbal_t(a3)        ; La balance
  3129. .pasbalnc:    move.w    norm_v_t(a3),d3
  3130.     lea    gtkpl_vlin_2_exp,a4
  3131.     move.w    (a4,d3.w*2),volenot_t(a3)    ; Sans oublier le volume exponentiel
  3132.     lsl.w    #3,d3
  3133.     move.w    d3,vollnot_t(a3)    ; Volume courant aussi
  3134.  
  3135. .pas_inst:    tst.w    d0
  3136.     beq    fx_fin_normale    ; S'il n'y a pas de note on s'en va
  3137.     move.w    d0,curnote_t(a3)
  3138.     move.w    d0,note2sl_t(a3)
  3139.     move.w    d0,d3
  3140.     move.w    instr_t(a3),d1
  3141.     move.l    (adr_instrset,a1,d1.w*4),a2    ; a2 pointe sur l'instrument
  3142.     env_initialisation    a3,1,a2    ; Initialise les enveloppes
  3143.     move.b    transp_i(a2,d0.w*2),d1
  3144.     ext.w    d1
  3145.     move.w    d1,transp_t(a3)    ; Transposition
  3146.     add.w    d1,d3        ; Sur la note
  3147.     moveq    #0,d1
  3148.     move.b    splnum_i(a2,d0.w*2),d1
  3149.     move.w    d1,ninstr_t(a3)    ; Il devient le sample courant
  3150.     move.w    ([adr_samples,a1,d1.w*4],vol_s),volsam_t(a3)    ; Recopie le volume du sample
  3151.     move.w    ([adr_samples,a1,d1.w*4],autobal_s),d4
  3152.     bmi.s    .pas_autb
  3153.     move.w    d4,curbal_t(a3)    ; Recopie la balance du sample
  3154. .pas_autb:    sub.w    #24,d3
  3155.  
  3156.     IfNe    CHECK
  3157.     bpl.s    .check1ok
  3158.     moveq    #24,d3
  3159. .check1ok:    cmp.w    #127,d3
  3160.     ble.s    .check2ok
  3161.     moveq    #127,d3
  3162. .check2ok:
  3163.     EndC
  3164.  
  3165.     lsl.w    #3,d3
  3166.     add.w    norm_f_t(a3),d3
  3167.     add.w    d3,d3
  3168.     move.w    (a5,d3.w),pernote_t(a3)    ; Sinon c'est une note normale
  3169.     move.w    (a5,d3.w),per2sl_t(a3)
  3170.     clr.l    pos_t(a3)
  3171.     clr.w    finepos_t(a3)
  3172.     clr.w    tremorc_t(a3)
  3173.     move.w    ninstr_t(a3),d1
  3174.     move.l    (adr_samples,a1,d1.w*4),a4
  3175.     move.l    a4,adrsam_t(a3)    ; Recopie l'adresse du sample,
  3176.     add.l    #data_s,adrsam_t(a3)
  3177.     move.l    (adr_repbuf,a1,d1.w*4),rbuffer_t(a3)    ; l'adresse du buffer de répétition,
  3178.     lea    repeat_s(a4),a4
  3179.     move.l    (a4)+,d3        ; le point de répétition,
  3180.     move.l    (a4),d4        ; et la taille de la boucle
  3181.     move.l    d4,d5
  3182.     add.l    d3,d5
  3183.     cmp.l    #2,d5
  3184.     bne.s    .finsi
  3185.     move.l    -replen_s+length_s(a4),d3    ; Si pas de bouclage
  3186.     subq.l    #2,d3
  3187.     moveq    #2,d4
  3188. .finsi:    move.l    d3,reppos_t(a3)
  3189.     move.l    d4,replen_t(a3)
  3190.     move.w    c_v_t(a3),d3    ; Commande de volume ?
  3191.     beq.s    .nxt_vbl
  3192.     lea    gtkpl_vlin_2_exp,a4
  3193.     move.w    (a4,d3.w*2),volenot_t(a3)    ; Volume exponentiel
  3194.     lsl.w    #3,d3
  3195.     move.w    d3,vollnot_t(a3)    ; Volume courant ajusté
  3196. .nxt_vbl:    subq.w    #1,delay_t(a3)
  3197.     bra    fx_fin_normale
  3198.  
  3199. ;-----------------------------------------------------------------------------
  3200. ;    Note cut
  3201. ;-----------------------------------------------------------------------------
  3202. fx_note_cut:
  3203.     tst.w    cut_del_t(a3)    ; Compteur à 0 ?
  3204.     bmi    fx_fin_normale    ; -1, plus besoin de l'effet
  3205.     bne.s    .nxt_vbl        ; <>0 , on attend encore
  3206.     move.w    nepan_t(a3),d5    ; Sinon on met les enveloppes sur Key Off
  3207.     lea    ([gtkpl_module_inf1+adr_epan,d5.w*4]),a4
  3208.     move.w    keyoffoffset_e(a4),d6
  3209.     add.w    #data_e,d6
  3210.     move.w    d6,depan_t(a3)
  3211.     clr.w    pepan_t(a3)
  3212.     clr.w    ep_waitcpt_t(a3)
  3213.     move.w    neton_t(a3),d5
  3214.     lea    ([gtkpl_module_inf1+adr_eton,d5.w*4]),a4
  3215.     move.w    keyoffoffset_e(a4),d6
  3216.     add.w    #data_e,d6
  3217.     move.w    d6,deton_t(a3)
  3218.     clr.w    peton_t(a3)
  3219.     clr.w    et_waitcpt_t(a3)
  3220.     move.w    nevol_t(a3),d5
  3221.     beq.s    .pas_env        ; Si pas d'enveloppe de volume, on le coupe simplement
  3222.     lea    ([gtkpl_module_inf1+adr_evol,d5.w*4]),a4
  3223.     move.w    keyoffoffset_e(a4),d6
  3224.     add.w    #data_e,d6
  3225.     move.w    d6,devol_t(a3)
  3226.     clr.w    pevol_t(a3)
  3227.     clr.w    ev_waitcpt_t(a3)
  3228.     bra.s    .nxt_vbl
  3229. .pas_env:    clr.w    vollnot_t(a3)
  3230.     clr.w    volenot_t(a3)
  3231. .nxt_vbl:    subq.w    #1,cut_del_t(a3)
  3232.     bra    fx_fin_normale
  3233.  
  3234. ;-----------------------------------------------------------------------------
  3235. ;    Volume slide (linear)
  3236. ;-----------------------------------------------------------------------------
  3237. fx_v_sldown_l:
  3238.     neg.w    d4
  3239. fx_v_slup_l:
  3240.     tst.w    d4
  3241.     bne.s    .ok
  3242.     move.w    volslspd_t(a3),d4
  3243. .ok:    move.w    d4,volslspd_t(a3)
  3244.     bsr.s    fx_do_v_slide_l
  3245.     bra    fx_fin_normale
  3246.  
  3247. fx_do_v_slide_l:            ; Sous-routine de volume slide (lin.)
  3248.     move.w    vollnot_t(a3),d5
  3249.     lsr.w    #3,d5
  3250.     add.w    d5,d4
  3251.  
  3252.     IfNe    CHECK
  3253.     tst.w    d4
  3254.     bgt.s    .ok1
  3255.     moveq    #0,d4
  3256. .ok1:    cmp.w    #$100,d4
  3257.     ble.s    .ok2
  3258.     move.w    #$100,d4
  3259.     EndC
  3260.  
  3261. .ok2:    lea    gtkpl_vlin_2_exp,a4
  3262.     move    (a4,d4.w*2),volenot_t(a3)
  3263.     lsl.w    #3,d4
  3264.     move.w    d4,vollnot_t(a3)
  3265.     rts
  3266.  
  3267. ;-----------------------------------------------------------------------------
  3268. ;    Volume slide (exponential)
  3269. ;-----------------------------------------------------------------------------
  3270. fx_v_sldown_e:            ; Volume slide down (exp) \
  3271.     neg.w    d4        ;                          > *** Ne pas séparer
  3272. fx_v_slup_e:            ; Volume slide up (exp)   /
  3273.     bsr.s    fx_do_v_slide_e
  3274.     bra    fx_fin_normale
  3275.  
  3276. fx_do_v_slide_e:            ; Sous-routine de volume slide (exp.)
  3277.     add.w    volenot_t(a3),d4
  3278.  
  3279.     IfNe    CHECK
  3280.     tst.w    d4
  3281.     bgt.s    .ok1
  3282.     moveq    #0,d4
  3283. .ok1:    cmp.w    #$800,d4
  3284.     ble.s    .ok2
  3285.     move.w    #$800,d4
  3286.     EndC
  3287.  
  3288. .ok2:    move.w    d4,volenot_t(a3)
  3289.     lea    gtkpl_vexp_2_lin,a4
  3290.     move.w    (a4,d4.w*2),vollnot_t(a3)
  3291.     rts
  3292.  
  3293. ;-----------------------------------------------------------------------------
  3294. ;    Linear volume slide + tone porta
  3295. ;-----------------------------------------------------------------------------
  3296. fx_v_sldown_l_tp:
  3297.     neg.w    d4
  3298. fx_v_slup_l_tp:
  3299.     tst.w    d4
  3300.     bne.s    .ok
  3301.     move.w    volslspd_t(a3),d4
  3302. .ok:    move.w    d4,volslspd_t(a3)
  3303.     bsr.s    fx_do_v_slide_l
  3304.     moveq    #0,d4
  3305.     bsr    fx_do_tone_porta
  3306.     bra    fx_fin_normale
  3307.  
  3308. ;-----------------------------------------------------------------------------
  3309. ;    Exponential volume slide + tone porta
  3310. ;-----------------------------------------------------------------------------
  3311. fx_v_sldown_e_tp:            ; Volume slide down (exp) + tone porta \
  3312.     neg.w    d4        ;                                       > *** Ne pas séparer
  3313. fx_v_slup_e_tp:            ; Volume slide up (exp) + tone porta   /
  3314.     bsr.s    fx_do_v_slide_e
  3315.     moveq    #0,d4
  3316.     bsr    fx_do_tone_porta
  3317.     bra    fx_fin_normale
  3318.  
  3319. ;-----------------------------------------------------------------------------
  3320. ;    Linear volume slide + vibrato
  3321. ;-----------------------------------------------------------------------------
  3322. fx_v_sldown_l_vib:
  3323.     neg.w    d4
  3324. fx_v_slup_l_vib:
  3325.     tst.w    d4
  3326.     bne.s    .ok
  3327.     move.w    volslspd_t(a3),d4
  3328. .ok:    move.w    d4,volslspd_t(a3)
  3329.     bsr    fx_do_v_slide_l
  3330.     moveq    #0,d4
  3331.     bsr    fx_do_vibrato
  3332.     bra    fx_fin_speciale
  3333.  
  3334. ;-----------------------------------------------------------------------------
  3335. ;    Exponential volume slide + vibrato
  3336. ;-----------------------------------------------------------------------------
  3337. fx_v_sldown_e_vib:            ; Volume slide down (exp) + vibrato \
  3338.     neg.w    d4        ;                                    > *** Ne pas séparer
  3339. fx_v_slup_e_vib:            ; Volume slide up (exp) + vibrato   /
  3340.     bsr    fx_do_v_slide_e
  3341.     moveq    #0,d4
  3342.     bsr    fx_do_vibrato
  3343.     bra    fx_fin_speciale
  3344.  
  3345. ;-----------------------------------------------------------------------------
  3346. ;    Linear master volume slide
  3347. ;-----------------------------------------------------------------------------
  3348. fx_mv_sldown_l:            ; Master volume slide down (lin) \
  3349.     neg.w    d4        ;                                 > *** Ne pas séparer
  3350. fx_mv_slup_l:            ; Master volume slide up (lin)   /
  3351.     bsr.s    fx_do_mv_slide_l
  3352.     bra    fx_fin_normale
  3353.  
  3354. fx_do_mv_slide_l:            ; Sous-routine de master volume slide (lin)
  3355.     move.w    d0,-(sp)
  3356.     sndkernel    get_master_vol
  3357.     move.w    d0,d5
  3358.     move.w    (sp)+,d0
  3359.     add.w    d5,d4
  3360.  
  3361.     IfNe    CHECK
  3362.     tst.w    d4
  3363.     bpl.s    .ok1
  3364.     moveq    #0,d4
  3365. .ok1:    cmp.w    #$fff,d4
  3366.     ble.s    .ok2
  3367.     move.w    #$fff,d4
  3368.     EndC
  3369.  
  3370. .ok2:    move.w    d4,-(sp)
  3371.     sndkernel    set_master_vol
  3372.     addq.l    #2,sp
  3373.     rts
  3374.  
  3375. ;-----------------------------------------------------------------------------
  3376. ;    Left & Right balance move
  3377. ;-----------------------------------------------------------------------------
  3378. fx_left_bal_move:
  3379.     neg.w    d4
  3380. fx_right_bal_move:
  3381.     lsl.w    #4,d4
  3382.     bne.s    .ok
  3383.     move.w    panslspd_t(a3),d4
  3384. .ok:    move.w    d4,panslspd_t(a3)
  3385.     add.w    curbal_t(a3),d4
  3386.  
  3387.     IfNe    CHECK
  3388.     bge.s    .ok3
  3389.     moveq    #0,d4
  3390. .ok3:    cmp.w    #$fff,d4
  3391.     ble.s    .ok2
  3392.     move.w    #$fff,d4
  3393.     EndC
  3394.  
  3395. .ok2:    move.w    d4,curbal_t(a3)
  3396.     bra    fx_fin_normale
  3397.  
  3398. ;-----------------------------------------------------------------------------
  3399. ;    Roll
  3400. ;-----------------------------------------------------------------------------
  3401. fx_roll_7:
  3402.     tst.w    rollnbr_t(a3)
  3403.     beq    fx_fin_normale
  3404.     tst.b    rollcpt_t(a3)
  3405.     bne    .nxt_roll
  3406.     clr.l    pos_t(a3)
  3407.     clr.w    finepos_t(a3)
  3408.     clr.w    tremorc_t(a3)
  3409.     subq.w    #1,rollnbr_t(a3)
  3410. .nxt_roll:    move.b    rollcpt_t(a3),d4
  3411.     addq.b    #1,d4
  3412.     cmp.b    rollspd_t(a3),d4
  3413.     bne.s    .fin_roll
  3414.     moveq    #0,d4
  3415. .fin_roll:    move.b    d4,rollcpt_t(a3)
  3416.     bra    fx_fin_normale
  3417.  
  3418. ;-----------------------------------------------------------------------------
  3419. ;    Roll + volume slide
  3420. ;-----------------------------------------------------------------------------
  3421. fx_roll_and_vsl:
  3422.     tst.b    rollcpt_t(a3)
  3423.     bne    .nxt_roll
  3424.     clr.l    pos_t(a3)
  3425.     clr.w    finepos_t(a3)
  3426.     clr.w    tremorc_t(a3)
  3427. .nxt_roll:    move.b    rollcpt_t(a3),d5
  3428.     addq.b    #1,d5
  3429.     cmp.b    rollspd_t(a3),d5
  3430.     bne    .fin_roll
  3431.     move.w    vollnot_t(a3),d3    ; Récupère le volume courant
  3432.     and.w    #$FF,d4
  3433.     lsr.w    #4,d4
  3434.     cmp.b    #5,d4
  3435.     bgt.s    .x2_3
  3436.     moveq    #1,d5        ; 0, -1, -2, -4, -8, -16
  3437.     addq.w    #2,d4
  3438.     lsl.w    d4,d5
  3439.     and.w    #-8,d5
  3440.     sub.w    d5,d3
  3441.     bra.s    .vol_ok
  3442. .x2_3:    cmp.b    #6,d4        ; x 2/3
  3443.     bne.s    .x1_2
  3444.     add.w    d3,d3
  3445.     divu.w    #3,d3
  3446.     bra.s    .vol_ok
  3447. .x1_2:    cmp.b    #7,d4        ; x 1/2
  3448.     bne.s    .plus_n
  3449.     lsr.w    #1,d3
  3450.     bra.s    .vol_ok
  3451. .plus_n:    cmp.b    #13,d4        ; 0, +1, +2, +4, +8, +16
  3452.     bgt.s    .x3_2
  3453.     moveq    #1,d5
  3454.     subq.w    #6,d4
  3455.     lsl.w    d4,d5
  3456.     and.w    #-8,d5
  3457.     add.w    d5,d3
  3458.     bra.s    .vol_ok
  3459. .x3_2:    cmp.b    #14,d4
  3460.     bne.s    .x2
  3461.     move.w    d3,d5
  3462.     add.w    d3,d3
  3463.     add.w    d5,d3
  3464.     lsr.w    #1,d3
  3465.     bra.s    .vol_ok
  3466. .x2:    add.w    d3,d3
  3467. .vol_ok:    lea    gtkpl_vlin_2_exp,a4
  3468.     tst.w    d3
  3469.     bpl.s    .finsi1
  3470.     moveq    #0,d3
  3471. .finsi1:    cmp.w    #$800,d3
  3472.     ble.s    .finsi2
  3473.     move.w    #$800,d3
  3474. .finsi2:    move.w    d3,vollnot_t(a3)    ; Volume courant
  3475.     lsr.w    #3,d3
  3476.     move.w    (a4,d3.w*2),volenot_t(a3)    ; Sans oublier le volume exponentiel
  3477.     moveq    #0,d5
  3478. .fin_roll:    move.b    d5,rollcpt_t(a3)
  3479.     bra    fx_fin_normale
  3480.  
  3481. ;-----------------------------------------------------------------------------
  3482. ;    Tremor
  3483. ;-----------------------------------------------------------------------------
  3484. fx_tremor:
  3485.     move.w    tremorc_t(a3),d4
  3486.     addq.w    #1,d4
  3487.     cmp.b    tremor2_t(a3),d4
  3488.     blt.s    .ok
  3489.     moveq    #0,d4
  3490. .ok:    move.w    tremorc_t(a3),d5
  3491.     move.w    d4,tremorc_t(a3)
  3492.     cmp.b    tremor1_t(a3),d5
  3493.     blt    fx_fin_normale    ; Volume on
  3494.     clr.w    vol_t(a3)        ; Volume off
  3495.     move.w    pernote_t(a3),per_t(a3)
  3496.     move.w    curbal_t(a3),bal_t(a3)
  3497.     bra    fx_fin_speciale
  3498.  
  3499. ;-----------------------------------------------
  3500. ;    AutoTempo
  3501. ;-----------------------------------------------
  3502. fx_autotempo:
  3503.     tst.w    flag_autotempo_t(a3)    ; Déjà venu ?
  3504.     beq    fx_fin_normale    ; Oui, on repart
  3505.  
  3506. ; Tempo = 60 s * lignes * freqech * speed / (4 lignespartemps * longueurenspl * 6 ticks)
  3507.     move.w    d4,d5        ; {
  3508.     add.w    d4,d4        ;   d4 * 5
  3509.     add.w    d4,d4        ;   car 5 = 60/4/(6/2)
  3510.     add.w    d5,d4        ; }
  3511.     mulu.w    mod_speed(a0),d4
  3512.     mulu.w    fech_t(a3),d4
  3513.     move.l    reppos_t(a3),d5
  3514.     add.l    replen_t(a3),d5    ; d5 = longueur du sample
  3515.     cmp.w    #2,nbits_t(a3)    ; en unités et non en octets
  3516.     bne.s    .ok1
  3517.     add.l    d4,d4        ; Optimisation de la division par 2 de d5
  3518. .ok1:    cmp.l    #1024,d5        ; Ne marche qu'avec des samples > 1 Ko.
  3519.     blt    fx_fin_normale
  3520.     add.l    d5,d5        ; * 2 -> /(6/2) de d4
  3521.     move.l    d5,d3        ; {
  3522.     lsr.l    #1,d3        ;   Division avec résultat arrondi au plus proche
  3523.     add.l    d3,d4        ;
  3524.     divu.l    d5,d4        ; } d4 = tempo
  3525.     beq    fx_fin_normale    ; On s'en va si un des paramètres était nul
  3526. .test2:    cmp.l    #999,d4        ; Tempo trop rapide ?
  3527.     ble.s    .ok2
  3528.     lsr.l    #1,d4        ; On divise par 2 alors
  3529.     bra.s    .test2
  3530. .ok2:
  3531.     move.w    d4,-(sp)        ; Hop le nouveau tempo
  3532.     bsr    gtkpl_set_tempo    ; *** d0 non sauvé
  3533.     addq.l    #2,sp
  3534.  
  3535.     clr.w    flag_autotempo_t(a3)    ; C'est fini pour aujourd'hui
  3536.     bra    fx_fin_normale
  3537.  
  3538. ;-----------------------------------------------
  3539. ;    AutoPeriod
  3540. ;-----------------------------------------------
  3541. fx_autoperiod:
  3542.     tst.w    flag_autoperiod_t(a3)    ; Déjà venu ?
  3543.     beq    fx_fin_normale    ; Oui, on repart
  3544.  
  3545. ; Periode = $1ac0 * 60 s * nbrlignes * speed * freqech / (tempo * 4 ligpartps * longueurspl * 6 ticks)
  3546.     mulu.w    #$1ac0*60/4/6,d4
  3547.     move.w    mod_speed(a0),d5
  3548.     mulu.w    fech_t(a3),d5
  3549.     mulu.l    d5,d5:d4        ; d5:d4 = $1ac0*60*nbrlig*speed*fech/4/6
  3550.  
  3551.     move.l    reppos_t(a3),d3
  3552.     add.l    replen_t(a3),d3    ; d3 = longueur du sample
  3553.     cmp.w    #2,nbits_t(a3)    ; en unités et non en octets
  3554.     bne.s    .ok1
  3555.     add.l    d4,d4        ; Optimisation de la division par 2 de d5:d4
  3556.     addx.l    d5,d5
  3557. .ok1:    cmp.l    #1024,d3        ; Ne marche qu'avec des samples > 1 Ko.
  3558.     blt    fx_fin_normale
  3559.  
  3560.     divu.l    d3,d5:d4        ; *** résultat sur plus de 32 bits ???
  3561.     moveq    #0,d5
  3562.     move.w    mod_tempo(a0),d5
  3563.     divu.l    d5,d4
  3564.  
  3565.     IfNE    CHECK
  3566.  
  3567.     ble    fx_fin_normale
  3568.  
  3569. .test1:    cmp.l    #PERIOD_MINI,d4
  3570.     bge.s    .oktest1
  3571.     add.l    d4,d4
  3572.     bra.s    .test1
  3573. .oktest1:
  3574.  
  3575. .test2:    cmp.l    #PERIOD_MAXI,d4
  3576.     ble.s    .oktest2
  3577.     lsr.l    d4,d4
  3578.     bra.s    .test2
  3579. .oktest2:
  3580.  
  3581.     EndC
  3582.  
  3583.     move.w    d4,pernote_t(a3)    ; Fixe la nouvelle période
  3584.  
  3585.     clr.w    flag_autoperiod_t(a3)    ; C'est fini pour aujourd'hui
  3586.     bra    fx_fin_normale
  3587.  
  3588.  
  3589.  
  3590.  
  3591.  
  3592. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  3593.  
  3594.     Section    Data
  3595.  
  3596.  
  3597.  
  3598. ;--- Pour le soundtracker ----------------------------------------------------
  3599. ;... Tables de sauts pour les effets .........................................
  3600.     ;    Certains sont inutilisés, donc on se tire directement
  3601. fx_table_de_sauts1:
  3602.     ; 00xx - 0fxx
  3603.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3604.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3605.         Dc.l    fx_set_ftune,fx_predelay,fx_note_precut,fx_pos_jump
  3606.         Dc.l    fx_set_vib_wave,fx_break_pat,fx_set_trem_wave,fx_set_global_speed
  3607.     ; 10xx - 1fxx
  3608.         Dc.l    fx_arpeggio_init,fx_fine_porta_up,fx_fine_porta_down,fx_roll_and_vsl_init
  3609.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3610.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3611.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3612.     ; a0xx - afxx
  3613.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3614.         Dc.l    fx_fine_v_slup_l,fx_fine_v_sldown_l,fx_fine_mv_slup_l,fx_fine_mv_sldown_l
  3615.         Dc.l    fx_set_nbr_of_frames,fx_set_fine_speed,fx_pattern_delay,fx_fin1
  3616.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3617.     ; b0xx - bfxx
  3618.         Dc.l    fx_tremor_init,fx_pattern_loop,fx_set_flags,fx_set_vol_env
  3619.         Dc.l    fx_set_ton_env,fx_set_pan_env,fx_set_vol_env_ko,fx_set_ton_env_ko
  3620.         Dc.l    fx_set_pan_env_ko,fx_demo_synchro,fx_fine_sample_offset,fx_very_fine_sample_offset
  3621.         Dc.l    fx_inc_sample_pos,fx_dec_sample_pos,fx_init_autotempo,fx_init_autoperiod
  3622.  
  3623. fx_table_de_sauts1b:
  3624.     ; 0xxx - fxxx
  3625.         Dc.l    fx_fin1,fx_fin1,fx_set_lin_volume,fx_set_exp_volume
  3626.         Dc.l    fx_set_balance,fx_set_lin_master_vol,fx_set_exp_master_vol,fx_roll_7_init
  3627.         Dc.l    fx_roll_and_vsl_and_sbl_init,fx_fin1,fx_fin1,fx_fin1
  3628.         Dc.l    fx_fin1,fx_fin1,fx_fin1,fx_fin1
  3629.  
  3630. fx_table_de_sauts2:
  3631.     ; 00xx - 0fxx
  3632.         Dc.l    fx_fin_normale,fx_porta_up,fx_porta_down,fx_tone_porta
  3633.         Dc.l    fx_vibrato,fx_tone_porta_vib,fx_vib_tone_porta,fx_tremolo
  3634.         Dc.l    fx_fin_normale,fx_delay,fx_note_cut,fx_fin_normale
  3635.         Dc.l    fx_fin_normale,fx_fin_normale,fx_fin_normale,fx_fin_normale
  3636.     ; 10xx - 1fxx
  3637.         Dc.l    fx_arpeggio,fx_fin_normale,fx_fin_normale,fx_roll_and_vsl
  3638.         Dc.l    fx_v_slup_l,fx_v_sldown_l,fx_v_slup_e,fx_v_sldown_e
  3639.         Dc.l    fx_v_slup_l_tp,fx_v_sldown_l_tp,fx_v_slup_e_tp,fx_v_sldown_e_tp
  3640.         Dc.l    fx_v_slup_l_vib,fx_v_sldown_l_vib,fx_v_slup_e_vib,fx_v_sldown_e_vib
  3641.     ; a0xx - afxx
  3642.         Dc.l    fx_mv_slup_l,fx_mv_sldown_l,fx_fin_normale,fx_fin_normale
  3643.         Dc.l    fx_fin_normale,fx_fin_normale,fx_fin_normale,fx_fin_normale
  3644.         Dc.l    fx_fin_normale,fx_fin_normale,fx_fin_normale,fx_extra_fine_tone_porta
  3645.         Dc.l    fx_extra_fine_porta_up,fx_extra_fine_porta_down,fx_left_bal_move,fx_right_bal_move
  3646.     ; b0xx - bfxx
  3647.         Dc.l    fx_tremor,fx_fin_normale,fx_fin_normale,fx_fin_normale
  3648.         Dc.l    fx_fin_normale,fx_fin_normale,fx_fin_normale,fx_fin_normale
  3649.         Dc.l    fx_fin_normale,fx_fin_normale,fx_fin_normale,fx_fin_normale
  3650.         Dc.l    fx_fin_normale,fx_fin_normale,fx_autotempo,fx_autoperiod
  3651.  
  3652. ;... Table de 64 sinus [0,2π[ ................................................
  3653. gtkpl_sin_table:
  3654.         Dc.w    $00,$18,$31,$4a,$61,$78,$8d,$a1
  3655.         Dc.w    $b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  3656.         Dc.w    $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5
  3657.         Dc.w    $b4,$a1,$8d,$78,$61,$4a,$31,$18
  3658.         Dc.w    -$00,-$18,-$31,-$4a,-$61,-$78,-$8d,-$a1
  3659.         Dc.w    -$b4,-$c5,-$d4,-$e0,-$eb,-$f4,-$fa,-$fd
  3660.         Dc.w    -$ff,-$fd,-$fa,-$f4,-$eb,-$e0,-$d4,-$c5
  3661.         Dc.w    -$b4,-$a1,-$8d,-$78,-$61,-$4a,-$31,-$18
  3662. gtkpl_square_table:            ; Table d'onde carrée de 64 éléments
  3663.         Dcb.w    32,$ff
  3664.         Dcb.w    32,-$ff
  3665. gtkpl_rampdown_table:            ; Table d'onde triangulaire de 64 éléments
  3666.     variable1:    Set    $ff
  3667.         Rept    64
  3668.         Dc.w    variable1
  3669.     variable1:    Set    variable1-8
  3670.         EndR
  3671.  
  3672. gtkpl_per_tab_load:    IncBin    'pertable.bin'    ; Table de périodes pour les notes (8 finetunes par note)
  3673. gtkpl_per_table:    Equ    gtkpl_per_tab_load+24*2    ; Décalage de 24 finetunes avant le C-0
  3674. gtkpl_vexp_2_lin:    IncBin    'vexp2lin.bin'    ; Les correspondances de volume pour instrument
  3675. gtkpl_vlin_2_exp:    IncBin    'vlin2exp.bin'
  3676. gtkpl_vexp_2_lin_mst:    IncBin    'v_e2l_m.bin'    ; Pareil, pour le master
  3677.  
  3678. ;... Nom des chunks dans un module GT2 .......................................
  3679. gtkpl_gt2_chunknames:    Dc.l    'XCOM','TCN1','SONG','PATS'
  3680.         Dc.l    'PATD','ORCH','INST','SAMP'
  3681.         Dc.l    'VENV','TENV','PENV','ENDC'
  3682.         Dc.l    0
  3683.     ; Cette liste est valable jusqu'à la version 3 du format GT2. Pour
  3684.     ; pouvoir convertir correctement d'éventuels formats supérieurs, il
  3685.     ; est nécessaire de mettre à jour cette liste avec la documentation
  3686.     ; des formats.
  3687.  
  3688. ;... Données servant en Pause/Stop ...........................................
  3689. gtkpl_song_bidon:    Dc.w    NBRPATTERNS_MAXI-1    ; 1 seule position: pattern 256
  3690.  
  3691. gtkpl_pat_bidon:    Dc.l    'PATD',32+NBRTRACK_MAXI*5    ; Id, longueur
  3692.         Dc.w    NBRPATTERNS_MAXI-1    ; Numéro
  3693.         Ds.b    16        ; Nom
  3694.         Dc.w    0,1,NBRTRACK_MAXI    ; Version de codage, lignes, pistes
  3695.         Dcb.b    NBRTRACK_MAXI*5,0    ; -> 1 seule ligne, vide
  3696.         Even
  3697.  
  3698. gtkpl_instr_bidon:    Dc.l    'INST',316    ; Id, longueur
  3699.         Dc.w    0    ; Numéro
  3700.         Ds.b    28    ; Nom
  3701.         Dc.w    0,0,-1    ; Type, volume, autobalance
  3702.         Dc.w    0,0,0    ; Enveloppes de volume, tonalité et finetune
  3703.         Ds.b    10    ; Réservé
  3704.         Dcb.w    128,0<<8+0    ; Samples et transpositions
  3705.  
  3706. gtkpl_sample_bidon:    Dc.l    'SAMP',64    ; Id, longueur
  3707.         Dc.w    0    ; Numéro
  3708.         Ds.b    28    ; Nom
  3709.         Dc.w    0,-1,1,8363    ; mono, balance, 8 bits, fréquence
  3710.         Dc.l    0,0,2    ; Longueur, reppos, replen
  3711.         Dc.w    0,0,0    ; Volume, finetune, version de codage
  3712.  
  3713. gtkpl_volenv_bidon:    Dc.l    'VENV',34    ; Id, longueur
  3714.         Dc.w    0    ; Numéro
  3715.         Ds.b    20    ; Nom
  3716.         Dc.w    1    ; Offset de la partie Key Off
  3717.         Dcb.b    2,0    ; Enveloppes Attack et Key Off: End
  3718.  
  3719. gtkpl_tonenv_bidon:    Dc.l    'TENV',34    ; Id, longueur
  3720.         Dc.w    0    ; Numéro
  3721.         Ds.b    20    ; Nom
  3722.         Dc.w    1    ; Offset de la partie Key Off
  3723.         Dcb.b    2,0    ; Enveloppes Attack et Key Off: End
  3724.  
  3725. gtkpl_panenv_bidon:    Dc.l    'PENV',34    ; Id, longueur
  3726.         Dc.w    0    ; Numéro
  3727.         Ds.b    20    ; Nom
  3728.         Dc.w    1    ; Offset de la partie Key Off
  3729.         Dcb.b    2,0    ; Enveloppes Attack et Key Off: End
  3730.  
  3731.         Even
  3732.  
  3733.  
  3734.  
  3735. *~~~ Structures ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  3736.  
  3737. ;--- Bloc de descritption de l'état actuel de chaque voie --------------------
  3738.  
  3739. ;... Partie réservée au noyau ................................................
  3740.         RsReset
  3741.  
  3742. ;... Partie utilisateur (soundtracker en l'occurence) ........................
  3743.         IfNE    CONST_T
  3744.  
  3745.         RsSet    USER_T
  3746.  
  3747.         Else
  3748.  
  3749.         RsSet    kernelend_t
  3750.  
  3751.         EndC
  3752.  
  3753. c_n_t:        Rs.w    1    ; La note dans la ligne de commande          \
  3754. c_i_t:        Rs.w    1    ; L'instrument dans la ligne de commande      > * Ne pas dissocier
  3755. c_e_t:        Rs.w    1    ; L'effet+paramètre dans la ligne de commande/
  3756. c_v_t:        Rs.w    1    ; Le volume dans la ligne de commande       /
  3757. ninstr_t:        Rs.w    1    ; Numéro de l'instrument courant
  3758. norm_v_t:        Rs.w    1    ; Le volume par défaut du sample (0-$100)\ * Ne pas dissocier
  3759. norm_f_t:        Rs.w    1    ; Finetune du sample                     /
  3760. curnote_t:        Rs.w    1    ; La note courante
  3761. pernote_t:        Rs.w    1    ; Période courante (sans effet de vibrato)
  3762. vollnot_t:        Rs.w    1    ; Volume courant linéaire (sans tremolo) (0-$800)
  3763. volenot_t:        Rs.w    1    ; Volume courant exponentiel (sans tremolo)
  3764. portspd_t:        Rs.w    1    ; Vitesse de tone portamento
  3765. note2sl_t:        Rs.w    1    ; Note à atteindre en cas de slide
  3766. per2sl_t:        Rs.w    1    ; Période de la note à atteindre en cas de tone porta
  3767. arpegcpt_t:    Rs.w    1    ; Compteur de l'arpeggio
  3768. vibspd_t:        Rs.b    1    ; Vitesse du vibrato
  3769. vibcpt_t:        Rs.b    1    ; Compteur du vibrato
  3770. vibamp_t:        Rs.b    1    ; Amplitude du vibrato
  3771. vibwav_t:        Rs.b    1    ; Forme d'onde du vibrato
  3772. tremspd_t:        Rs.b    1    ; Vitesse du tremolo
  3773. tremcpt_t:        Rs.b    1    ; Compteur du tremolo
  3774. tremamp_t:        Rs.b    1    ; Amplitude du tremolo
  3775. tremwav_t:        Rs.b    1    ; Forme d'onde du tremolo
  3776. rollspd_t:        Rs.b    1    ; Vitesse des roulements
  3777. rollcpt_t:        Rs.b    1    ; Compteur de roulements
  3778. rollnbr_t:        Rs.w    1    ; Nbr de roulements encore à jouer
  3779. delay_t:        Rs.w    1    ; Nbr de ticks à attendre avant de jouer la note
  3780. cut_del_t:        Rs.w    1    ; Nbr de ticks à attendre avant de couper la note
  3781. tremorc_t:        Rs.w    1    ; Compteur de tremor
  3782. tremor1_t:        Rs.b    1    ; Nbr de frames où la note n'est pas coupée
  3783. tremor2_t:        Rs.b    1    ; Période d'un tremor
  3784. ploopp_t:        Rs.w    1    ; Point de répétition pour l'effet Pattern loop
  3785. ploops_t:        Rs.w    1    ; Position      "       "      "      "     "
  3786. ploopn_t:        Rs.w    1    ; Nombre de répétitions pour l'effet Pattern loop
  3787. curbal_t:        Rs.w    1    ; Balance courante
  3788. instr_t:        Rs.w    1    ; Numéro de l'instrument courant
  3789. volsam_t:        Rs.w    1    ; Volume du sample courant
  3790. transp_t:        Rs.w    1    ; Transposition du sample courant
  3791. volslspd_t:    Rs.w    1    ; Vitesse du volume slide
  3792. fvolslspd_t:    Rs.w    1    ; Vitesse du fine volume slide
  3793. fportspd_t:    Rs.w    1    ; Vitesse du fine portamento
  3794. panslspd_t:    Rs.w    1    ; Vitesse du panning slide
  3795. nevol_t:        Rs.w    1    ; Numéro de l'enveloppe de volume
  3796. neton_t:        Rs.w    1    ; Numéro de l'enveloppe de tonalité
  3797. nepan_t:        Rs.w    1    ; Numéro de l'enveloppe de panning
  3798. pevol_t:        Rs.w    1    ; Position dans l'enveloppe de volume
  3799. peton_t:        Rs.w    1    ; Position dans l'enveloppe de tonalité
  3800. pepan_t:        Rs.w    1    ; Position dans l'enveloppe de panning
  3801. devol_t:        Rs.w    1    ; Décalage dans l'enveloppe de volume (32 pour l'Attack, 32 + ?? pour le Key Off)
  3802. deton_t:        Rs.w    1    ; Décalage dans l'enveloppe de tonalité
  3803. depan_t:        Rs.w    1    ; Décalage dans l'enveloppe de panning
  3804. ev_waitcpt_t:    Rs.w    1    ; Compteur de la commande Wait de l'enveloppe de volume
  3805. ev_loopcpt_t:    Rs.w    1    ; Compteur de boucle
  3806. ev_volume_t:    Rs.w    1    ; Volume courant
  3807. ev_volstep_t:    Rs.w    1    ; Pas du volume
  3808. ev_volspeed_t:    Rs.w    1    ; Vitesse du volume
  3809. ev_volcpt_t:    Rs.w    1    ; Compteur du volume
  3810. ev_tremoloflag_t:    Rs.b    1    ; Flag de tremolo (on/off)
  3811. ev_tremorflag_t:    Rs.b    1    ; Flag de tremor (on/off)
  3812. ev_tremolospeed_t:    Rs.b    1    ; Vitesse du tremolo
  3813. ev_tremolowidth_t:    Rs.b    1    ; Amplitude du tremolo
  3814. ev_tremolocpt_t:    Rs.b    1    ; Compteur du tremolo
  3815. ev_tremolotype_t:    Rs.b    1    ; Type de tremolo (0 = sin, 1 = carré, 2 = triangle)
  3816. ev_tremortime1_t:    Rs.b    1    ; Longueur du tremor Volume On
  3817. ev_tremortime2_t:    Rs.b    1    ; Longueur du tremor Volume Off
  3818. ev_tremorsection_t:    Rs.b    1    ; Section actuelle du tremor (0 = time1, 1 = time2)
  3819. ev_tremorcpt_t:    Rs.b    1    ; Compteur du tremor
  3820.         RsSet    (__rs+1)&-2    ; Equivaut à RsEven
  3821. et_waitcpt_t:    Rs.w    1    ; Compteur de la commande Wait de l'enveloppe de tonalité
  3822. et_loopcpt_t:    Rs.w    1    ; Compteur de boucle
  3823. et_tone_t:        Rs.w    1    ; Période courante
  3824. et_tonestep_t:    Rs.w    1    ; Pas de la période
  3825. et_tonespeed_t:    Rs.w    1    ; Vitesse de la période
  3826. et_tonecpt_t:    Rs.w    1    ; Compteur de la période
  3827. et_vibratoflag_t:    Rs.b    1    ; Flag de vibrato (on/off)
  3828. et_vibratospeed_t:    Rs.b    1    ; Vitesse du vibrato
  3829. et_vibratowidth_t:    Rs.b    1    ; Amplitude du vibrato
  3830. et_vibratocpt_t:    Rs.b    1    ; Compteur du vibrato
  3831. et_vibratotype_t:    Rs.b    1    ; Type de vibrato (0 = sin, 1 = carré, 2 = triangle)
  3832.         RsSet    (__rs+1)&-2    ; Equivaut à RsEven
  3833. ep_waitcpt_t:    Rs.w    1    ; Compteur de la commande Wait de l'enveloppe de panning
  3834. ep_loopcpt_t:    Rs.w    1    ; Compteur de boucle
  3835. ep_pan_t:        Rs.w    1    ; Panning courant
  3836. ep_panstep_t:    Rs.w    1    ; Pas du panning
  3837. ep_panspeed_t:    Rs.w    1    ; Vitesse du panning
  3838. ep_pancpt_t:    Rs.w    1    ; Compteur du panning
  3839.         RsSet    (__rs+1)&-2    ; Equivaut à RsEven
  3840. flag_autotempo_t:    Rs.w    1    ; 1 au 1er tick, 0 sinon.
  3841. flag_autoperiod_t:    Rs.w    1    ; 1 au 1er tick, 0 sinon.
  3842.  
  3843.         IfNe    CONST_T
  3844.          IfNe    __rs>TOTAL_T
  3845.           Fail    "Taille de la structure InfoTrack-User supérieure à la taille maximum fixée!"
  3846.          Else
  3847.           RsSet    TOTAL_T
  3848.          EndC
  3849.         EndC
  3850.  
  3851. next_t:        Rs    0
  3852.  
  3853. ;--- Chunk de description des samples ----------------------------------------
  3854.         RsReset
  3855. chunkid_s:        Rs.l    1    ; 'SAMP'
  3856. chunksz_s:        Rs.l    1    ; Taille du chunk
  3857. number_s:        Rs.w    1    ; Numéro du sample
  3858. name_s:        Rs.b    28    ; Nom du sample
  3859. stereo_s:        Rs.w    1    ; 0 = mono, 1 = stereo
  3860. autobal_s:        Rs.w    1    ; Balance automatique, -1 = rien
  3861. nbits_s:        Rs.w    1    ; 1 = 8 bits, 2 = 16 bits
  3862. fech_s:        Rs.w    1    ; Fréquence d'échantillonnage du sample (8363 Hz par défaut)
  3863. length_s:        Rs.l    1    ; Longueur du sample
  3864. repeat_s:        Rs.l    1    ; Point de bouclage
  3865. replen_s:        Rs.l    1    ; Longueur de boucle
  3866. vol_s:        Rs.w    1    ; Volume   \ *** Ne pas dissocier
  3867. ftune_s:        Rs.w    1    ; Finetune /
  3868. codagev_s:        Rs.w    1    ; Version de codage
  3869. data_s:        Rs    0    ; Début des données du sample
  3870.  
  3871. ;--- Chunk de description des instruments ------------------------------------
  3872.         RsReset
  3873. chunkid_i:        Rs.l    1    ; 'INST'
  3874. chunksz_i:        Rs.l    1    ; Taille du chunk
  3875. number_i:        Rs.w    1    ; Numéro de l'instrument
  3876. name_i:        Rs.b    28    ; Nom de l'instrument
  3877. type_i:        Rs.w    1    ; Type de l'instrument (0 = sample)
  3878. vol_i:        Rs.w    1    ; Volume
  3879. autobal_i:        Rs.w    1    ; Autobalance
  3880. volenv_i:        Rs.w    1    ; Enveloppe de volume
  3881. tonenv_i:        Rs.w    1    ; Enveloppe de tonalité
  3882. panenv_i:        Rs.w    1    ; Enveloppe de panning
  3883.         Rs.b    10    ; Réservé
  3884. splnum_i:        Rs.b    128*2    ; Numéros de samples pour chaque note
  3885. transp_i:        Equ    splnum_i+1
  3886. next_i:        Rs    0
  3887.  
  3888. ;--- Chunk de description des patterns ---------------------------------------
  3889.         RsReset
  3890. chunkid_p:        Rs.l    1    ; 'PATD'
  3891. chunksz_p:        Rs.l    1    ; Taille du chunk
  3892. number_p:        Rs.w    1    ; Numéro du pattern
  3893. name_p:        Rs.b    16    ; Nom du pattern
  3894. codagev_p:        Rs.w    1    ; Version de codage (ici 0)
  3895. nlines_p:        Rs.w    1    ; Nombre de lignes du pattern
  3896. ntrack_p:        Rs.w    1    ; Nombre de pistes du pattern
  3897. data_p:        Rs    0    ; Début des données du pattern
  3898.  
  3899. ;--- Chunk de description des enveloppes -------------------------------------
  3900.         RsReset
  3901. chunkid_e:        Rs.l    1    ; 'VENV', 'PENV' ou 'TENV'
  3902. chunksz_e:        Rs.l    1    ; Taille du chunk
  3903. number_e:        Rs.w    1    ; Numéro de l'enveloppe
  3904. name_e:        Rs.b    20    ; Nom de l'enveloppe
  3905. keyoffoffset_e:    Rs.w    1    ; Offset de la section Key Off par rapport à data_e
  3906. data_e:        Rs    0    ; Début des données de l'enveloppe
  3907.  
  3908. ;--- Diverses adresses à modifier lors d'un changement de module -------------
  3909.         RsReset
  3910. adr_samples:    Rs.l    NBRSAMPLES_MAXI    ; Adresse de 256 samples maxi (à partir de 0)
  3911. adr_repbuf:    Rs.l    NBRSAMPLES_MAXI    ; Adresse de 256 buffers de bouclage (à partir du sample 0)
  3912. adr_instrset:    Rs.l    NBRINSTR_MAXI    ; Adresse de 256 instruments (en partant de 0)
  3913. adr_pattern:    Rs.l    NBRPATTERNS_MAXI    ; Adresse de 256 patterns + 1 pour le pattern bidon
  3914. adr_evol:        Rs.l    NBRVOLENV_MAXI    ; Adresse de 64 enveloppes de volume
  3915. adr_eton:        Rs.l    NBRTONENV_MAXI    ; Adresse de 64 enveloppes de tonalité
  3916. adr_epan:        Rs.l    NBRPANENV_MAXI    ; Adresse de 64 enveloppes de panning
  3917. adr_song:        Rs.l    1        ; Adresse de la song
  3918. adr_next:        Rs    0
  3919.  
  3920. ;--- Bloc de renseignements sur le module en cours ---------------------------
  3921.         RsReset
  3922. mod_nbrtrack:    Rs.w    1    ; Nombre de pistes par pattern
  3923. mod_songlen:    Rs.w    1    ; Taille de la song
  3924. mod_songrep:    Rs.w    1    ; Point de répétition
  3925. mod_songpos:    Rs.w    1    ; Numéro de position dans la song (prochaine)
  3926. mod_numpat:    Rs.w    1    ; Numéro du pattern (actuel)
  3927. mod_linepos:    Rs.w    1    ; Numéro de position de la ligne (prochaine)
  3928. mod_cursongpos:    Rs.w    1    ; Songpos (actuelle)
  3929. mod_curlinepos:    Rs.w    1    ; Linepos (actuelle)
  3930. mod_flagnewpos:    Rs.w    1    ; -1 si la position a été changée par un Pos Jump, 0 sinon
  3931. mod_speed:        Rs.w    1    ; Vitesse courante (ticks/ligne)
  3932. mod_patrep:    Rs.w    1    ; Nombre de répétitions de la ligne
  3933. mod_nbrticks:    Rs.w    1    ; Nombre de ticks écoulés depuis le début de la ligne
  3934. mod_vblnumber:    Rs.w    1    ; Nbr de VBL pour tenir un tick
  3935. mod_vblcpt:    Rs.w    1    ; Compteur de VBL
  3936. mod_tempo:        Rs.w    1    ; Tempo en BPM
  3937. mod_next:        Rs    0
  3938.  
  3939.  
  3940.  
  3941. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  3942.  
  3943.     Section    Bss
  3944.  
  3945.  
  3946.  
  3947. ;--- Pour le soundtracker ----------------------------------------------------
  3948. gtkpl_flag_installed:    Ds.w    1    ; 1 = Player installé, 0 = non installé
  3949. gtkpl_adr_info_track:    Ds.l    1    ; Adresse de info_track, copie pour le player!
  3950. gtkpl_num_track:    Ds.w    NBRTRACK_MAXI    ; Pistes occupées par le tracker
  3951. gtkpl_flag_stop_vcs:    Ds.w    1    ; 1 = Faire taire les voies, attendre le retour
  3952.                 ; à 0 avant de changer les paramètres de la song
  3953. gtkpl_vblsize_int:    Ds.w    1    ; \ *** Ne pas
  3954. gtkpl_vblsize_frac:    Ds.w    1    ; / dissocier!!!
  3955. gtkpl_vblsize_count:    Ds.w    1    ;
  3956. gtkpl_demo_synchro:    Ds.w    1
  3957. gtkpl_pause_backup:    Ds.b    NBRTRACK_MAXI*(4+4+2)    ; Sauvegardes des longueurs, positions et
  3958.                 ; volumes sur chaque track lors d'une pause
  3959. gtkpl_module_inf1:    Ds.b    adr_next    ; Quelques adresses concernant le module
  3960. gtkpl_module_inf2:    Ds.b    mod_next    ; Informations générales sur le module
  3961. gtkpl_mod_len:    Ds.l    1    ; Taille d'un module converti
  3962. gtkpl_temp_data:    Ds.l    1
  3963. gtkpl_zone_vide:    Ds.b    1024    ; 1Ko de vide (totalement vide, qui doit le rester)
  3964.  
  3965.         Even
  3966.  
  3967.  
  3968.  
  3969. *~~~ FIN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  3970.