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 / GTRACKER.GFA (.txt) < prev    next >
GFA-BASIC Atari  |  2000-04-15  |  520KB  |  18,728 lines

  1. $m655360
  2. ' ****************************************************************************
  3. ' *                                                                          *
  4. ' * #### #### #### #### #  # #   # ####  ##### #### #### #### #  # #### #### *
  5. ' * #    #  # #  # #  # #  # ## ## #       #   #  # #  # #    #  # #    #  # *
  6. ' * # ## ###  #### #  # #  # # # # ###     #   ###  #### #    ###  ###  ###  *
  7. ' * #  # #  # #  # #  # #  # #   # #       #   #  # #  # #    #  # #    #  # *
  8. ' * #### #  # #  # #### #### #   # #       #   #  # #  # #### #  # #### #  # *
  9. ' *                                                                          *
  10. ' *         THE ULTIMATE 32-VOICES DSP SOUNDTRACKER ON ATARI FALCON.         *
  11. ' *                        TO SERVE WITH FRESH BLOOD.                        *
  12. ' *                                                                          *
  13. ' *              GRAOUMF TRACKER by Laurent de SORAS ~ 1994-96               *
  14. ' *                                                                          *
  15. ' ****************************************************************************
  16. '
  17. ' GRAOUMF TRACKER by Laurent de SORAS and the Graoumf Devteam ~ 2000
  18. '
  19. ' The Graoumf Devteam is:
  20. '                         - sjx
  21. '                         - lp
  22. '
  23. ' ============================================================================
  24. ' Divers bugs et contraintes dus au GfA-Basic:
  25. '     - Ne pas utiliser EXIST() (fonction redefinie).
  26. '     - Sous le compilateur, les operations flottantes a arguments uniquement
  27. ' entiers ne sont pas toujours calculees en flottant.
  28. ' ============================================================================
  29. '
  30. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  31. ' *                                                                          *
  32. ' *                              Initialisations                             *
  33. ' *                                                                          *
  34. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  35. '
  36. ' -------------------------- [ post-SORAS version history ] ------------------
  37. ' /sjx - 0.8777 - Better memory allocation (not *much* better, but at least
  38. '                 it doesn't use undocumented system calls).
  39. '                 Also, returns to gem screen for gem (fileselector).
  40. '                 Also, (!) config file flag se_revbuffer (defaults to false)
  41. '                 if false, sample editor comes up *much* faster. Haven't
  42. '                 seen many problems with this -- yet. It's had all of five
  43. '                 minutes' testing, but I already like it :)
  44. '                 If a bug is found with this, you can revert to old
  45. '                 behaviour by setting "se_revbuffer=true" in the INF file.
  46. '                 And, there is a keyboard shortcut possibility for volume
  47. '                 slide, and a number_of_lines that affects the default.
  48. ' /sjx - 0.8776 - Correcting typos and making bugfixes, about 10 in all.
  49. '                 Notably, envelopes are now actually saved in GT2 modules!
  50. '                 Also, new configuration file options:
  51. '                     grmode_preserve  (set to yes to force graoumf not to change resolution)
  52. '                     grmode_skipxbra  (set to yes to force graoumf not to unhook NVDI, etc.)
  53. '                 ... these ought to improve stability in certain cases.
  54. '                 See the update documentation for more detailed info.
  55. ' /sjx - 0.8775 - Workaround for a bug in 0.8770 (which would save GT2 modules
  56. '                 with a quirk whereby some samples would start with a 'ASMP'
  57. '                 chunk). Looks like the old binary sometimes did one too many
  58. '                 byteswaps, so as a result, the loader has to be kludged.
  59. '                 (On the bright side, once saved again, it'll be correct.)
  60. ' /sjx - 0.8774 - Full support for Octalyser modules (e.g., CD83) added.
  61. ' /sjx - 0.8773 - Seriously braindead bug ("jmp 0"?!) with unknown module type
  62. '                 fixed - bug in compiler. Don't goto to an undefined label!
  63. ' /sjx - 0.8772 - Some registration legacy code removed; as now freeware.
  64. '        0.8771 - Laurent de SORAS's full source code release. Freeware.
  65. '                 Note that changes between 8870 and 8771 are unknown.
  66. '        0.8770 - Last known binary release.
  67. ' ----------------------------------------------------------------------------
  68. gtk_version%=8777               ! Numero de version du logiciel x10000
  69. gtk_file_vnum%=4                ! Numero de format de module GTK
  70. gt2_file_vnum%=4                ! Numero de format de module GT2
  71. npath_prog$=CHR$(ADD(65,GEMDOS(&H19)))+":"+DIR$(0)+"\SYS\"
  72. ' npath_prog$="E:\GTK.DEV\SYS\"   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  73. npath_prefs$=npath_prog$        ! Chemin des preferences
  74. nfile_prefs$="GTKPREFS.INF"     ! Fichier de preferences a charger
  75. nfile_present$="PRESENT.PIC"    ! Nom de l'image de presentation
  76. nfile_logo$="GT_LOGO.PI1"       ! Nom du logo
  77. key_click%=PEEK(&H484)          ! Sauve l'etat du clavier
  78. '
  79. GOSUB init_variables_prefs
  80. '
  81. IF FN exist(npath_prefs$+nfile_prefs$)
  82.   GOSUB load_prefs2(npath_prefs$+nfile_prefs$,TRUE)
  83. ENDIF
  84. '
  85. ' Initialisations diverses 1
  86. ' --------------------------
  87. xbra_remove$=""                                 ! Les adr de tous les vecteurs detournes (adr_vect.l, old_val_vect.l)
  88. zone%=0                                         ! C'est a cause du Mfree qui peut intervenir avant le Malloc (break)
  89. oldscreenmode%=0                                ! Idem.
  90. GOSUB change_resolution
  91. adr_af_pat%=ADD(XBIOS(2),MUL(SHR(scr_larg%,1),170))     ! Adresse d'affichage des patterns
  92. ON BREAK GOSUB br
  93. GOSUB bee(TRUE)
  94. SPOKE &H484,PEEK(&H484) AND -2
  95. ~XBIOS(&H82,4,2)
  96. ~XBIOS(&H82,5,0)                                ! Connecte l'ADC pour la partie enregistrement
  97. GOSUB charge_g_routines
  98. attente_fin_presentation%=0                     ! Nombre de secondes a attendre apres la presentation
  99. graoumf_logo$=""                                ! Le logo
  100. graoumf_logo_mask$=""                           ! Et son masque
  101. GOSUB charge_image_presentation
  102. '
  103. GOSUB init_tableaux
  104. '
  105. ' Initialisations diverses 2
  106. ' --------------------------
  107. para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  108. garbage%=0
  109. GOSUB charge_r_routines
  110. ARRAYFILL module&(),&H2020                      ! Initialise le module
  111. module&(0)=&H4754
  112. module&(1)=ADD(&H4B00,gtk_file_vnum% AND 255)
  113. module&(98)=255                                 ! Nbr d'instr
  114. module&(99)=nbr_lines%
  115. module&(100)=nbr_track%
  116. module&(101)=1
  117. module&(102)=0
  118. '
  119. GOSUB reset_all_midi_track_state
  120. GOSUB chg_midi_flag_data_in(midi_flag_data_in!)
  121. '
  122. GOSUB init_fonctions_simples
  123. '
  124. GOSUB init_variables_post_prefs
  125. '
  126. HIDEM
  127. SETMOUSE SHL(ADD(divbi&(0,0,0),SHR(SUCC(divbi&(2,0,0)),1)),3),ADD(divbi&(1,0,0),5),0
  128. GOSUB teste_enregistrement
  129. HIDEM
  130. GOSUB attente_interruptible(attente_fin_presentation%)
  131. CLS
  132. GOSUB nouvelle_palette(color_pal$)
  133. IF NOT flag_registered!
  134.   SHOWM
  135.   GOSUB affiche_please_register
  136. ENDIF
  137. last_aff_message$=" "
  138. GOSUB affiche_panneau_principal
  139. ~FRE(0)
  140. GOSUB autoload
  141. GOSUB aff_message("Welcome to GRAOUMF TRACKER v"+STR$(gtk_version%/10000)+mes_registred$)
  142. ON ERROR GOSUB erreur_gfa_basic
  143. '
  144. '
  145. '
  146. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  147. ' *                                                                          *
  148. ' *                            Boucle principale                             *
  149. ' *                                                                          *
  150. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  151. '
  152. DO
  153.   '
  154.   ' Souris
  155.   ' ------
  156.   SHOWM
  157.   MOUSE xm%,ym%,km%
  158.   IF km%<>0 AND xm%<8 AND ym%<8         ! On se barre ?
  159.     GOSUB dialog("QUIT","Do you really want to quit|GRAOUMF TRACKER ?","Yes sir!|Bof...|No, no!",xm%,ym%)
  160.     IF bouton%=0 OR (bouton%=1 AND (TIMER AND 1)=1)
  161.       CLS
  162.       IF NOT flag_registered!
  163.         GOSUB affiche_please_register
  164.       ENDIF
  165.       GOSUB br
  166.     ELSE
  167.       GOSUB affiche_panneau_principal
  168.       MOUSE xm%,ym%,km%
  169.     ENDIF
  170.   ELSE IF km%<>0 AND xm%=PRED(scr_larg%) AND ym%=PRED(scr_haut%)
  171.     flag_blague!=TRUE
  172.   ENDIF
  173.   '
  174.   ' Icones a repetition
  175.   ' -------------------
  176.   IF km%<>0 AND ym%>159 AND ym%<170
  177.     ' Changement de la voie d'une colonne
  178.     IF type_affpiste%=0         ! Selon la taille d'une piste
  179.       a%=SUB(xm%,24) MOD 48
  180.       b%=DIV(SUB(xm%,24),48)
  181.       c%=6
  182.     ELSE IF type_affpiste%=2
  183.       a%=SUB(xm%,24) MOD 96
  184.       b%=DIV(SUB(xm%,24),96)
  185.       c%=12
  186.     ELSE
  187.       a%=SUB(xm%,24) MOD 80
  188.       b%=DIV(SUB(xm%,24),80)      ! Numero de la colonne
  189.       c%=10
  190.     ENDIF
  191.     IF km%=1 AND b%=>0 AND b%<MIN(nbr_col%,nbr_colonnes%(n_preset%))
  192.       IF a%>47
  193.         IF a%<64          ! Fleche haut
  194.           d%=1
  195.         ELSE IF a%<80     ! Fleche bas
  196.           d%=-1
  197.         ENDIF
  198.         preset&(b%,n_preset%)=MIN(MAX(ADD(preset&(b%,n_preset%),d%),0),PRED(nbr_track%))
  199.       ELSE
  200.         a$=STR$(SUCC(preset&(b%,n_preset%)),2)
  201.         GOSUB edite_chaine(a$,ADD(MUL(b%,c%),6),162,2,2)
  202.         preset&(b%,n_preset%)=MIN(MAX(PRED(VAL(bbbb$)),0),PRED(nbr_track%))
  203.         GOSUB affiche_c_pattern
  204.       ENDIF
  205.       GOSUB affiche_info_preset
  206.     ELSE IF km%=2 AND a%>7 AND a%<48 AND b%=>0 AND b%<nbr_col%
  207.       nbr_colonnes%(n_preset%)=SUCC(b%)
  208.       curs_col%=MIN(curs_col%,b%)
  209.       GOSUB affiche_info_preset
  210.     ENDIF
  211.     GOTO fin_test_souris
  212.   ENDIF
  213.   '
  214.   ' Icones a simple clic
  215.   ' --------------------
  216.   IF km%<>0 AND ym%<30 AND xm%>167 AND xm%<640  ! Icones du haut
  217.     ~FRE(0)
  218.     GOSUB gere_icones_haut
  219.   ELSE IF km%<>0 AND ym%>34 AND ym%<105 AND xm%>159 AND xm%<640
  220.     ~FRE(0)
  221.     ON ss_menu% GOSUB gere_icones_disk,gere_icones_tools,gere_icones_instr,gere_icones_sample,gere_icones_enveloppe,gere_icones_control,gere_icones_midi
  222.   ELSE IF km%<>0 AND ym%>129 AND ym%<140 AND xm%>63 AND xm%<576
  223.     ' --- Choix d'un preset --------------------------------------------------
  224.     GOSUB chg_preset(SHR(SUB(xm%,64),4))
  225.   ELSE IF km%<>0 AND ym%>169 AND ym%<ADD(170,MUL(haut_lig%,6)) AND xm%>31
  226.     ' --- Clic sur une colonne -----------------------------------------------
  227.     IF type_affpiste%=0               ! Selon la largeur d'une piste
  228.       a%=DIV(SUB(xm%,32),48)
  229.       b%=SUB(SUB(xm%,32),MUL(a%,48))
  230.     ELSE IF type_affpiste%=2
  231.       a%=DIV(SUB(xm%,32),96)
  232.       b%=SUB(SUB(xm%,32),MUL(a%,96))
  233.     ELSE
  234.       a%=DIV(SUB(xm%,32),80)
  235.       b%=SUB(SUB(xm%,32),MUL(a%,80))
  236.     ENDIF
  237.     IF km%=1
  238.       ' Bouton gauche: positionne le curseur
  239.       IF a%<nbr_colonnes%(n_preset%) AND b%<72
  240.         curs_col%=a%
  241.         curs_x%=MAX(0,SUB(SHR(b%,3),2))
  242.         a%=ADD(170,MUL(SHR(haut_lig%,1),6))
  243.         IF ym%<a%
  244.           posligne%=MAX(0,MIN(PRED(FN nbr_lines3),ADD(posligne%,DIV(SUB(ym%,ADD(a%,5)),6))))
  245.         ELSE IF ym%>ADD(a%,5)
  246.           posligne%=MAX(0,MIN(PRED(FN nbr_lines3),ADD(posligne%,DIV(SUB(ym%,a%),6))))
  247.         ENDIF
  248.         IF play%>0
  249.           DPOKE r_mod_linepos%,posligne%
  250.         ENDIF
  251.         GOSUB affiche_c_pattern
  252.         GOSUB wait_mouse(TRUE)
  253.       ENDIF
  254.       ' Bouton droit: track on/off
  255.     ELSE IF km%=2
  256.       IF a%<nbr_colonnes%(n_preset%)
  257.         a%=preset&(a%,n_preset%)
  258.         GOSUB chg_a_track_onoff(a%,ABS(SGN(FN track_onoff(a%))) XOR 1)
  259.         GOSUB wait_mouse(TRUE)
  260.       ENDIF
  261.     ENDIF
  262.   ELSE IF km%<>0 AND ym%>119 AND ym%<130 AND xm%>63
  263.     ' --- Track on/off, par appui sur les touches ----------------------------
  264.     a%=SHR(SUB(xm%,64),4)
  265.     IF a%<nbr_track%
  266.       IF km%=1          ! Track on/off
  267.         GOSUB chg_a_track_onoff(a%,ABS(SGN(FN track_onoff(a%))) XOR 1)
  268.       ELSE              ! Track cliquee on, les autres off
  269.         FOR i%=0 TO PRED(nbr_track%)
  270.           IF i%<>a%
  271.             GOSUB chg_track_onoff(i%,0)
  272.             GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  273.           ELSE
  274.             GOSUB chg_track_onoff(i%,1)
  275.             GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  276.           ENDIF
  277.         NEXT i%
  278.         GOSUB affiche_info_preset
  279.       ENDIF
  280.       GOSUB affiche_info_preset
  281.       GOSUB wait_mouse(TRUE)
  282.     ENDIF
  283.   ELSE IF km%>0
  284.     ' --- Toutes les autres icones -------------------------------------------
  285.     GOSUB gere_icones_panneaup
  286.   ENDIF
  287. fin_test_souris:
  288.   '
  289.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  290.   '
  291.   ' MIDI In
  292.   ' -------
  293.   IF edit%<>0 AND play%=0                       ! Seulement en Edit sans Play
  294.     IF CARD{r_midi_in_gfa_playline%}<>0         ! Une ou des notes frappees?
  295.       CARD{r_midi_in_gfa_playline%}=0
  296.       FOR i%=0 TO PRED(nbr_track%)
  297.         a%=ADD(r_new_note_buffer%,MUL(i%,6))
  298.         b%=FN adr_strk(songpos%,posligne%,i%)
  299.         IF BYTE{a%}<>0                          ! Si nouvelle note sur cette piste,
  300.           LONG{b%}=LONG{SUCC(a%)}               ! copie-la sur le pattern
  301.           BYTE{ADD(b%,4)}=BYTE{ADD(a%,5)}
  302.           BYTE{a%}=0
  303.         ENDIF
  304.         LONG{ADD(V:pattern_bidon%(8),MUL(i%,5))}=LONG{b%}
  305.         BYTE{ADD(V:pattern_bidon%(8),ADD(MUL(i%,5),4))}=BYTE{ADD(b%,4)}
  306.       NEXT i%
  307.       GOSUB play_pattern_bidon
  308.       GOSUB next_line
  309.     ENDIF
  310.   ENDIF
  311.   '
  312.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  313.   '
  314.   ' Clavier
  315.   ' -------
  316.   GOSUB gestion_clavier
  317.   '
  318.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  319.   '
  320.   ' Affichages
  321.   ' ----------
  322.   ' Pattern et horloge
  323.   IF play%>0
  324.     posligne%=DPEEK(r_mod_linepos%)
  325.     GOSUB affiche_c_pattern
  326.     IF play%=1 AND songpos%<>DPEEK(r_mod_songpos%)
  327.       songpos%=DPEEK(r_mod_songpos%)
  328.       GOSUB affiche_info_song
  329.     ENDIF
  330.     GOSUB affiche_temps
  331.   ENDIF
  332.   ' Raffraichissement du sous-menu Control
  333.   IF ss_menu%=6
  334.     IF ss_menuc%=1
  335.       GOSUB affiche_icones_controlc(FALSE)
  336.       GOSUB affiche_icones_controld(FALSE)
  337.     ELSE IF ss_menuc%=2
  338.       GOSUB affiche_icones_controlc2(FALSE)
  339.       GOSUB affiche_icones_controld2(FALSE)
  340.     ENDIF
  341.   ENDIF
  342.   ' Temps machine
  343.   IF play%>0 OR flag_cpu_display!
  344.     GOSUB affiche_cpu_time_pourcent
  345.   ENDIF
  346.   ' Blague
  347.   IF flag_blague!
  348.     IF INT(RND*SHR(periode_blague%,MUL(SGN(play%),2)))=0
  349.       a$=blague$(INT(RND*blague_nbr%))
  350.       GOSUB dialog("JOKE",a$,"Hahaha!!!|Bide...",SHR(scr_larg%,1),SHR(scr_haut%,1))
  351.       IF bouton%=0
  352.         GOSUB aff_message("Merci, j'en cherche une autre, voyons...")
  353.         periode_blague%=MAX(SHR(periode_blague%,1),1)
  354.       ELSE
  355.         GOSUB aff_message("Desole...")
  356.         periode_blague%=MIN(SHL(periode_blague%,1),262144)
  357.       ENDIF
  358.       GOSUB vide_buffer_clavier
  359.     ENDIF
  360.   ENDIF
  361.   SHOWM
  362.   ' Nouveau bouclage ?
  363.   IF flag_nvl_boucle_sample%>0
  364.     DEC flag_nvl_boucle_sample%
  365.     IF flag_nvl_boucle_sample%=0
  366.       GOSUB stop_voices
  367.       ~C:rr_boucle_sample%(W:num_nvl_boucle_sample%)
  368.     ENDIF
  369.   ENDIF
  370.   ' 2eme test de protection
  371.   IF (NOT flag_registered3!) AND flag_registered!
  372.     GOSUB teste_enregistrement2
  373.     flag_registered3!=TRUE
  374.   ENDIF
  375. LOOP
  376. '
  377. GOSUB br
  378. '
  379. '
  380. '
  381. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  382. ' *                                                                          *
  383. ' *                                Procedures                                *
  384. ' *                                                                          *
  385. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  386. '
  387. ' Systeme
  388. ' -------
  389. PROCEDURE rien
  390.   ' rien !!!
  391. RETURN
  392. PROCEDURE br
  393.   HIDEM
  394.   IF r_flag_the_end%>0
  395.     DPOKE r_flag_the_end%,1     ! A pu zik...
  396.   ENDIF
  397.   IF zone%<>0
  398.     ~MFREE(zone%)
  399.   ENDIF
  400.   IF oldscreenmode%<>0
  401.     ' Oh no, he's doing it AGAIN.
  402.     ' (If you don't know what I mean, look at my undocumented calls rant earlier on.)
  403.     ' oldscreenadr% is already set -- I'll kill this line.
  404.     '    oldscreenadr%=GEMDOS(21,L:oldscreensize%)
  405.     IF grmode_preserve%=0
  406.       ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,3,oldscreenmode%)
  407.     ELSE
  408.       ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,-1)
  409.     ENDIF
  410.     GOSUB restaure_palette                      ! Restaure la palette
  411.     ~MFREE(adrscrnblock%) ! /sjx - free the memory I reserved for the screen
  412.   ENDIF
  413.   ~XBIOS(&H82,5,3)
  414.   ~XBIOS(&H82,4,3)
  415.   SPOKE &H484,key_click%        ! Bip bip
  416.   ' /sjx - ...what, AFTER you restored the palette?
  417.   '  SETCOLOR 0,&HFFF
  418.   '  SETCOLOR 15,0
  419.   IF grmode_skipxbra%=0
  420.     WHILE xbra_remove$<>""        ! On remet les vecteurs a l'envers car il peut y avoir plusieurs fois le meme vecteur detourne
  421.       SLPOKE LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),8))},LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),4))}
  422.       xbra_remove$=LEFT$(xbra_remove$,SUB(LEN(xbra_remove$),8))
  423.     WEND
  424.   ENDIF
  425.   SHOWM
  426.   GOSUB bee(FALSE)
  427.   GOSUB sjx_unlock_scrn
  428.   EDIT                                  ! Outta here...
  429. RETURN
  430. PROCEDURE erreur_gfa_basic
  431.   erreur_gfa%=ERR
  432.   flag_erreur_gfa!=TRUE
  433.   PRINT CHR$(7);
  434.   GOSUB aff_message("ERROR : "+ERR$(erreur_gfa%)+" PRESS A KEY.")
  435.   ~GEMDOS(7)
  436.   GOSUB aff_message("NEXT MISTAKE... LAST MISTAKE!")
  437.   flag_erreur_gfa!=FALSE
  438.   RESUME NEXT
  439. RETURN
  440. '
  441. ' Initialisations
  442. ' ---------------
  443. PROCEDURE init_variables_prefs
  444.   '
  445.   ' Variables configurables dans les preferences
  446.   ' --------------------------------------------
  447.   LOCAL i%,n%,a1$,a2$,a3$,a4$,a5$
  448.   '
  449.   ' Tableaux
  450.   '
  451.   DIM keydef_val%(1,99)         ! 2 touches possibles, numero de commande
  452.   DIM keydef_mask%(1,99)        ! 2 touches possibles, numero de commande
  453.   DIM keydef_param%(99)         ! Numero de commande
  454.   ARRAYFILL keydef_val%(),0
  455.   ARRAYFILL keydef_mask%(),0
  456.   ARRAYFILL keydef_param%(),0
  457.   RESTORE default_keycodes
  458.   READ n%
  459.   FOR i%=0 TO PRED(n%)
  460.     READ a1$,a2$,a3$,a4$,a5$
  461.     keydef_mask%(0,i%)=VAL("$"+a1$)
  462.     keydef_val%(0,i%)=VAL("$"+a2$)
  463.     keydef_mask%(1,i%)=VAL("$"+a3$)
  464.     keydef_val%(1,i%)=VAL("$"+a4$)
  465.     keydef_param%(i%)=VAL("$"+a5$)
  466.   NEXT i%
  467.   '
  468.   ' Variables simples
  469.   '
  470.   system_memory%=262144         ! 256 Ko reserves pour le systeme (sjx - changed from 128K)
  471.   keyboard_type%=1              ! 0 = azerty, 1 = qwerty (sjx - changed)
  472.   color_pal$="00088FF00F4F800C6FF40F8F888AAACCCFFF889AABCCDFFF" ! La palette (RVB pour 16 couleurs)
  473.   grmode_overscan%=-1           ! -1 = suivant VGA/RGB/TV, 0 = aucun overscan, 1 = force l'overscan
  474.   grmode_80colonnes%=1          ! -1 = laisse, 0 = 40 colonnes, 1 = 80 colonnes
  475.   grmode_entrelace%=-1          ! -1 = laisse, 0 = 200/240 lignes, 1 = 400/480 lignes
  476.   grmode_puissance_plans%=2     ! -1 = laisse, 0 = 2 couleurs, 1 = 4, 2 = 16, 3 = 256, 4 = 65536
  477.   grmode_preserve%=0            ! 0 = change mode, 1 = never change mode
  478.   grmode_skipxbra%=0            ! 0 = remove NVDI/etc from vector chain, 1 = leave vectors alone
  479.   graoumf_logo_color%=4         ! Numero de la couleur du logo (marron)
  480.   path_displayed%=1             ! 0 = systeme, 1 = module, 2 = prefs, 3 = sample, 4 = instruments, 5 = autoload, 6 = misc
  481.   npath_sample$=npath_prog$     ! Chemin des samples
  482.   npath_module$=npath_prog$     ! Chemin des modules
  483.   npath_autoload$=npath_prog$   ! Chemin d'autochargement
  484.   npath_div$=npath_prog$        ! Chemin des operations diverses
  485.   nfile_sample$=""              ! Fichier par defaut pour les samples
  486.   nfile_module$=""              ! Fichier par defaut pour les modules
  487.   nfile_autoload$=""            ! Fichier par defaut a autocharger
  488.   nfile_p1$="DUMTRACK.PGT"      ! Nom du fichier contenant les routines diverses
  489.   nfile_p2$="GTPLAY.PGT"        ! Nom du fichier contenant le player
  490.   next_module$="*.GT2"          ! Extension pour les modules
  491.   next_sample$="*.AVR"          ! Extension pour les samples
  492.   nbr_track%=4                  ! Nombre de voies
  493.   nbr_lines%=64                 ! Nombre de lignes (n'a plus d'utilite mais sert encore)
  494.   instr%=1                      ! Instrument courant
  495.   sample%=1                     ! Sample courant
  496.   n_preset%=0                   ! Numero du preset courant
  497.   line_step%=1                  ! Saut de ligne a l'edition
  498.   haut_lig%=99999               ! Nombre de lignes de pattern affichees (99999 car min dans chgt de resol)
  499.   octave%=1                     ! Octave-1 (0-6 -> 1-7)
  500.   default_pattern_high%=nbr_lines%      ! Nombre de lignes a mettre sur un pattern lors de sa creation
  501.   ss_menu%=1                    ! 1 = disk, 2 = tools, 3 = instr, 4 = samples, 5 = enveloppes, 6 = midi
  502.   ss_menut%=1                   ! Numero de sous-menu du sous-menu Tools (1, 2 ou 3)
  503.   ss_menui%=1                   ! Numero de sous-menu du sous-menu Instruments (1 ou 2)
  504.   ss_menus%=1                   ! Numero de sous-menu du sous-menu Samples (1 ou 2)
  505.   ss_menue%=0                   ! Numero de sous-menu du sous-menu Envelopes (0, 1 ou 2)
  506.   ss_menuc%=1                   ! Numero de sous-menu du sous-menu Control (1 ou 2)
  507.   ss_menuc_npan%=0              ! Plage des pannings du sous-menu Control (0 = 1-8, 1 = 9-16, etc...)
  508.   ss_menuc2_npan%=0             ! Plage des volumes du sous-menu Control (0 = 1-8, 1 = 9-16, etc...)
  509.   ss_menum%=1                   ! Numero de sous-menu du sous-menu Midi (1 ou 2)
  510.   ss_menu2%=1                   ! Numero de sous-menu de l'editeur de sample (1, ...)
  511.   ss_menu2.fl%=1                ! Num ss-menu Flanger (1 ou 2)
  512.   ss_menu2.rev%=1               ! Num ss-menu Reverb (1 ou 2)
  513.   maskblock%=0                  ! 0 = all, 1 = masque
  514.   replaceblock%=0               ! 0 = replace, 1 = transparent
  515.   trackpat%=0                   ! 0 = piste, 1 = pattern, 2 = preset
  516.   bl_flagsong!=FALSE            ! Si l'operation de bloc porte sur toute la song
  517.   bl_maska1$=STRING$(5,0)       ! 0 = n'importe quoi, F = seulement bl_maska2%
  518.   bl_maska2$=STRING$(5,0)       ! Copie si (note AND bl_maska1)=bl_maska2
  519.   bl_maskb1$=STRING$(5,255)     ! F = n'importe quoi, 0 = seulement bl_maskb2%
  520.   bl_maskb2$=STRING$(5,0)       ! Masque de remplacement
  521.   bl_echo_lines%=2              ! Echo toutes les 2 lignes
  522.   bl_echo_feedback%=50          ! 50% de feedback dans l'echo
  523.   bl_echo_fadestep%=&H40        ! - $40 de volume a chaque echo
  524.   bl_echo_cont!=FALSE           ! Ne joue l'echo que de la derniere note
  525.   bl_echo_fdbk!=TRUE            ! True = feedback, False = fade
  526.   ext_note1%=&HFFFFFF           ! F = n'importe quoi, 0 = met qqc
  527.   ext_note2%=0                  ! (Effet AND ext_note1) OR ext_note2
  528.   signe_sam%=0                  ! A ajouter au sample quand sauve/charge
  529.   drumpad_flag%=0               ! 0 = No d'instr, 1 = drumpad
  530.   freq_buffer%=8363             ! Frequence de base du buffer
  531.   snapshot_number%=0            ! Numero du dernier snapshot effectue
  532.   snapshot_format%=1            ! Format du snapshot : 0 = TGA 16 couleurs, 1 = TGA 24 bits
  533.   flag_keep_buffer!=FALSE       ! S'il est mis, les modules detruisent le buffer au minimum
  534.   se_revbuffer!=FALSE           ! sjx - TRUE is old, slow behaviour (see sample_editor)
  535.   flag_gt2cnf!=FALSE            ! Sauvegarde de la configuration du GT dans les modules GT2
  536.   flag_backup_modules!=TRUE     ! Sauve les modules avec back up en fichier .BAK
  537.   flag_keyboard_buffer!=FALSE   ! False = vide le buffer clavier apres chaque pression de touche
  538.   flag_cpu_display!=FALSE       ! True = affiche le temps machine tout le temps, False = seulement en Play
  539.   type_affpiste%=1              ! Affichage des pistes : 0 = note+ins, 1 = normal, 2 = +volume
  540.   env_num&=1                    ! Numero de l'enveloppe editee
  541.   env_sect&=0                   ! Section de l'enveloppe editee : 0 = attack, 1 = key off
  542.   env_copy&=1                   ! Numero de l'enveloppe a copier
  543.   midi_flag_data_in!=FALSE      ! True = MIDI In possible
  544.   midi_flag_data_out!=FALSE     ! True = MIDI Out possible
  545.   midi_flag_synchro%=0          ! 0 = pas de synchro, 1 = GT suit la synchro, 2 = GT donne la synchro
  546.   midi_polyphonic_mode!=TRUE    ! False = Monophonic, True = Polyphonic
  547.   midi_monomode_channel_nbr%=1  ! Numero de canal MIDI en mode Monophonique (1-16)
  548.   midi_monomode_instr_nbr%=0    ! Numero d'instrument en mode Monophonique. 0 = instrument courant
  549.   midi_polymode_channel_nbr%=1  ! Numero de canal MIDI en mode Polyphonique (1-16)
  550.   '
  551.   de.display_type%=0            ! Type d'affichage du pat dans le Drum Editor: 0 = pattern, 1 = info pistes
  552.   '
  553.   se.mix_master_volume%=16384   ! Master volume (/32768) pour la fonction de mixage
  554.   se.rec_input_device%=0        ! Entree digitalisation : 0 = Falcon ADC, 1 = ST Replay pro
  555.   se.rec_canal%=1               ! Canal d'entree : 1 = Left, 2 = Right, 3 = Left+Right
  556.   se.rec_adc_freq%=1            ! Frequence de digit sur l'ADC du Falcon (freq type CODEC)
  557.   se.rec_ext_freq%=44100        ! Frequence de digit avec un autre ADC (ST Replay pro)
  558.   se.rec_trigger%=6553          ! Impulsion minimum pour commencer la digit /32768
  559.   se.rec_flag_trigger!=FALSE    ! False = trigger off, true = trigger on
  560.   se.freq_nfe%=16390            ! Nouvelle frequence d'echantillonnage
  561.   se.freq_ofn%=131              ! Ancienne frequence de note
  562.   se.freq_nfn%=131              ! Nouvelle frequence de note
  563.   se.freq_iptype%=1             ! Type d'interpolation : 0 = none, 1 = Linear, 2 = 3rd degree
  564.   se.freq_fftdisp%=0            ! 0 = affichage lineaire, 1 = affichage logarithmique
  565.   se.freq_fftwin%=0             ! Fenetrage FFT : 0 = rectangulaire, 1 = Blackman
  566.   se.freq_fftnoteon!=TRUE       ! Affichage ou non de la frequence de la note sur la FFT
  567.   se.freq_fft_cflag!=TRUE       ! Calcule la note du sample avec la FFT
  568.   se.freq_fft_pnbr%=640         ! Nombre de points a calculer pour la FFT
  569.   se.delay_flags%=&X1           ! Chaque bit (0-3) = tap on/off, bit 4 = mute in, bit 5 = multi-tap mode
  570.   se.delay_feedback%=0          ! Feedback du delay (/32768)
  571.   se.delay_timefeed%=375        ! Temps de repetition (ms)
  572.   se.delay_dry%=32768           ! Niveau du son clair (/32768)
  573.   se.delay_wet%=16384           ! Niveau du delay
  574.   se.delay_source%=0            ! Sample source : 0 = buffer, 1-255 = sample
  575.   se.delay_mutein%=500          ! Temps (ms) apres lequel le signal d'entree est coupe
  576.   se.flanger_dry%=16384         ! Niveau dry du flanger (/32768)
  577.   se.flanger_wet%=16384         ! Niveau wet
  578.   se.flanger_lsource%=0         ! Sample source gauche (0 = buffer)
  579.   se.flanger_rsource%=0         ! Sample source droit   " "    "
  580.   se.flanger_time%=1000         ! Delay du flanger (µs) -> 10 ms
  581.   se.flanger_freq%=500          ! Frequence du flanger (mHz)
  582.   se.flanger_depth%=500         ! Profondeur du flanger (µs) -> 6.35 ms
  583.   se.flanger_fdbkll%=9830       ! Feedback L -> L (30%)
  584.   se.flanger_fdbklr%=9830       ! Feedback L -> R (30%)
  585.   se.flanger_fdbkrr%=9830       ! Feedback R -> R (30%)
  586.   se.flanger_fdbkrl%=9830       ! Feedback R -> L (30%)
  587.   se.flanger_phase%=0           ! Phase intitiale (0-4095)
  588.   se.flanger_wave%=0            ! 0 = sin, 1 = carre, 2 = triangle, 3 = scie descendante, 4 = scie montante
  589.   se.flanger_stereo!=FALSE      ! Flag de stereophonie du flanger
  590.   se.rev_aprdelay%=5000         ! Delay de l'All Pass Reverb, en µs. Maxi : 0.25 s
  591.   se.rev_aprg%=22937            ! Feedback de l'All Pass reverb
  592.   se.rev_adlydelay%=26540       ! Delay de l'Alignement delay, en µs. Maxi : 0.25 s
  593.   se.rev_drylevel%=16384        ! Dry level (/32768)
  594.   se.rev_revlevel%=11469        ! Reverb level (/32768)
  595.   se.rev_ereflevel%=4915        ! Early reflection level (/32768)
  596.   se.rev_nbrtaps%=7             ! Nombre de taps pour l'Early reflection
  597.   se.rev_nbrcomb%=4             ! Nombre de comb filters
  598.   se.rev_combgain%=27852        ! Gain general des comb filters (/32768)
  599.   se.rev_source%=0              ! Sample source (0 = buffer)
  600.   se.rev_tappos%=0              ! Position dans la liste des taps de l'ER
  601.   se.rev_combpos%=0             ! Position dans la liste des comb filters
  602.   se.s2d_posstart%=0            ! Position de depart d'enregistrement
  603.   se.s2d_ligstart%=0            ! Ligne de depart d'enregistrement
  604.   se.s2d_posend%=0              ! Position de fin d'enregistrement
  605.   se.s2d_ligend%=0              ! Ligne de fin d'enregistrement
  606.   se.s2d_bits%=1                ! Enregistrement en 1 : 8 bits, 2 : 16 bits
  607.   se.s2d_stereo%=1              ! Enregistrement en 1 : mono, 2 : stereo
  608.   se.s2d_maxsize%=1024          ! Taille maximum (Ko)
  609.   se.s2d_out%=1                 ! Sortie sur 1 : block, 2 : disk
  610.   se.s2d_2ndtime!=FALSE         ! False : normal, True : attend un bouclage avant d'enregistrer
  611.   se.s2d_speed%=7               ! Vitesse d'enregistrement (0 = vite, 7 = lent). Agit sur _prediv%
  612.   se.s2d_prediv%=11             ! Prediviseur pour la vitesse DMA : 1 = 50KHz, 2 = 32 KHz... Depend de _speed%
  613.   se.s2d_monitor!=FALSE         ! True = ecoute pendant l'enregistrement, False = enregistrement en differe
  614.   se.comp_source%=0             ! Sample source (0 = buffer)
  615.   se.comp_speed%=10000          ! Periode de recalcul du taux de compression (1-99999) (µs)
  616.   se.comp_level%=16384          ! Niveau de compression (vol ideal a atteindre) (/32768)
  617.   se.comp_initvolume%=se.comp_level%    ! Volume presume de depart (/32768)
  618.   se.disto_source%=0            ! Sample source (0 = buffer)
  619.   se.disto_gain%=32768          ! Gain de la disto (/32768)
  620.   se.disto_initpower%=4         ! Facteur de puissance de la disto avec un gain < 100% (min = 1)
  621. RETURN
  622. PROCEDURE init_variables_post_prefs
  623.   '
  624.   ' Variables diverses non configurables dans les preferences
  625.   ' ---------------------------------------------------------
  626.   gamme$="C-C#D-D#E-F-F#G-G#A-A#B-"
  627.   gamme2$="C C#D D#E F F#G G#A A#B "
  628.   numericpad_scancodes$=MKI$(99)+MKI$(100)+MKI$(101)+MKI$(102)+MKI$(103)+MKI$(104)+MKI$(105)+MKI$(74)
  629.   numericpad_scancodes$=numericpad_scancodes$+MKI$(106)+MKI$(107)+MKI$(108)+MKI$(78)
  630.   numericpad_scancodes$=numericpad_scancodes$+MKI$(109)+MKI$(110)+MKI$(111)+MKI$(114)
  631.   adr_background%=0             ! Adresse du malloc pour un background (si <> 0, liberer a la fin).
  632.   songpos%=0                    ! Position courante dans la song
  633.   posligne%=0                   ! Ligne courante dans le pattern
  634.   curs_x%=0                     ! 0 = note, 1-2 = instr, 3-6 = effet, 7-8 = volume
  635.   curs_col%=0                   ! Colonne du curseur
  636.   play%=0                       ! 0 = stop, 1 = play song, 2 = play pattern
  637.   edit%=0                       ! 0 = stop, 1 = edit
  638.   flag_nvl_boucle_sample%=0     ! Flag de calcul du nouveau bouclage d'un sample
  639.   num_nvl_boucle_sample%=1      ! Le numero du sample
  640.   bl_start&=0                   ! Ligne de debut du bloc
  641.   bl_end&=0                     ! Ligne de fin du bloc
  642.   bl_pat&=0                     ! Pattern 0
  643.   bl_trk&=0                     ! Voie 1
  644.   sample_list_pos%=1            ! Position dans la liste des samples
  645.   instr_list_pos%=1             ! Position dans la liste des instruments
  646.   song_list_pos%=0              ! Position dans l'arrangement des patterns
  647.   instr_note_pos%=48            ! Position dans la liste des notes
  648.   instr_note_aff%=48            ! Affichage dans la liste des notes
  649.   instr_group!=TRUE             ! On manipule tout un groupe de notes
  650.   mark_1%=0                     ! Marqueur de debut de bloc dans le sample
  651.   mark_len%=FN lon_buffer       ! Marqueur de fin de bloc
  652.   mark_2%=ADD(mark_1%,mark_len%)! Marqueur fantome de fin de bloc
  653.   mark_rep%=0                   ! Marqueur de repetition
  654.   win_pos%=mark_1%              ! Debut de la fenetre de sample
  655.   win_lon%=mark_len%            ! Longueur de la fenetre
  656.   win_bits%=1                   ! Buffer 8 bits
  657.   erreur_gfa%=0                 ! Numero d'erreur de GFA Basic
  658.   treg_str1$=" by Laurent de SORAS and the Graoumf Devteam."
  659.   treg_str2$="USER.REG"
  660.   treg_str3$="version to"
  661.   treg_str4$=" licensed to "
  662.   treg_str5$=" (license is invalid)"
  663.   ' flag_registered!=TRUE         ! false = demo, true = normal
  664.   ' flag_registered2!=TRUE        ! false = demo, true = normal
  665.   flag_registered3!=FALSE       ! Indique si on a fait ou pas le 2eme test de protection
  666.   flag_erreur_gfa!=FALSE        ! Indique s'il y a eu une erreur
  667.   flag_blague!=FALSE            ! Ne sort pas de vanne a la Julien Boeuf pour l'instant
  668.   flag_autoload!=FALSE          ! N'est pas en cours d'autochargement
  669.   erreur%=0                     ! Sert localement pour la gestion des erreurs
  670.   periode_blague%=4096          ! Periode moyenne de sortie d'une vanne
  671.   debut_temps%=TIMER            ! Valeur du Timer pour le debut du chrono
  672.   env_posaff&=0                 ! Position de l'affichage de l'enveloppe, en commandes
  673.   env_poscurs&=0                ! Position du curseur dans l'enveloppe, en commandes
  674.   env_codpos&=0                 ! Position dans la liste des codes des enveloppes
  675.   progression_xpos%=0           ! Abscisse de la boite de progression (car)
  676.   progression_ypos%=0           ! Ordonnee de la boite de progression (pix)
  677.   progression_width%=64         ! Largeur de la barre de progression (pix)
  678.   progression_len%=65536        ! Valeur maxi de la valeur de progression
  679.   progression_oldval%=0         ! Ancienne valeur de progression, sert a la mise a jour de la barre.
  680.   se.sample_editor_flag!=FALSE  ! Indique si on est ou non dans l'editeur de samples
  681.   se.volume_ok!=FALSE           ! Indique si le volume du block est valable
  682.   se.volume_spl%=0              ! Volume du-dit block (/32768)
  683.   se.volume_fade_start%=32768   ! Volume de debut de fade (/32768)
  684.   se.volume_fade_end%=32768     ! Volume de fin de fade (/32768)
  685.   se.flag_best_volume!=FALSE    ! Garde le volume du sample quitte a saturer lors d'un effet (True : cherche le meilleur volume)
  686.   se.mark_selected%=0           ! Bits representant les presets de marques selectionnes
  687.   se.mark_set!=FALSE            ! Icone SET alumee ou pas
  688.   se.freq_fftmin%=20            ! Frequence minimum de la FFT (deja calculee)
  689.   se.freq_fftmax%=SHR(freq_buffer%,1)   ! Frequence maximum de la FFT (deja calculee)
  690.   se.freq_fftech%=freq_buffer%  ! Frequence d'echantillonnage du sample lors de la FFT (deja calculee)
  691.   se.freq_fftlon%=1             ! Nombre de frequences scannees par la FFT (deja calculee)
  692.   se.freq_fft_pstart%=0         ! Frequence de debut de calcul FFT
  693.   se.freq_fft_pend%=SHR(freq_buffer%,1) ! Frequence de fin de calcul FFT
  694. RETURN
  695. PROCEDURE init_tableaux
  696.   '
  697.   ' Dimentionnement des tableaux
  698.   ' ----------------------------
  699.   DIM scancode2ascii$(2,1)      ! Ligne de touches, Type de clavier
  700.   DIM icone$(4,2)               ! Icones du haut
  701.   DIM drumpad%(31,2)            ! Numero de touche, Instruments/ Samples/ Notes du drumpad
  702.   DIM presetpad%(31)            ! Numero de touche
  703.   DIM trackpad%(31)             ! Numero de touche
  704.   DIM preset&(31,31)            ! Numeros de pistes : (colonne,preset)
  705.   DIM nbr_colonnes%(31)         ! Nombre de colonnes affichees pour chaque preset
  706.   DIM t_note%(53)
  707.   DIM fft&(1023)                ! Resultats de FFT
  708.   DIM divbn$(63,31)             ! Noms de divers boutons des sous-menus
  709.   DIM divbi&(3,63,31)           ! Leurs coordonnees et taille
  710.   DIM popup_nbrlines%(7)        ! Nombre de lignes des popups: popup
  711.   DIM popup_code%(31,7)         ! Code de retour des popups: ligne, popup
  712.   DIM popup_txt$(31,7)          ! Textes des popups: ligne, popup
  713.   DIM help$(23,15)              ! Texte d'aide
  714.   DIM blague$(99)               ! Des blagues
  715.   DIM control_old%(20)          ! Anciennes valeurs pour les updates du sous-menu Control
  716.   DIM midi_in_channel%(31)      ! Numero du canal MIDI attribue a chaque piste en Mode Polyphonique
  717.   DIM midi_in_instr%(15)        ! Numero d'instrument assigne a chaque canal en Mode Polyphonique
  718.   DIM se.mix_param%(3,4)        ! Parametres de mixages du Sample_Editor : flags (+1=on, +2=loop) , n°de sample (0=buffer), volume debut/32768, volume fin/32768
  719.   DIM se.mark%(1,9)             ! Presets de samples (start/length,numero)
  720.   DIM se.mark$(9)               ! Le nom des presets
  721.   DIM se.delaytime%(3)          ! Temps (ms) de decalage pour chaque tap
  722.   DIM se.delaylevel%(3)         ! Niveau d'entree (/32768) pour chaque tap
  723.   DIM se.rev_tapdelay%(15)      ! Delay des taps de reverb, en µs. Maxi : 0.25 s
  724.   DIM se.rev_taplevel%(15)      ! Level des taps de reverb, (/32768)
  725.   DIM se.rev_combdelay%(15)     ! Delay des comb filters de reverb, en µs. Maxi : 0.25 s
  726.   DIM se.rev_comblpf%(15)       ! Niveau de gain des lpf dans la reverb (/32768)
  727.   DIM se.rev_buffer$(10)        ! Buffers pour la reverb : 3 (early, alignement, APR) + 8 (comb filters)
  728.   DIM env_code$(255)            ! Code des mnemoniques des commandes des enveloppes
  729.   DIM env_conv&(19,2)           ! Conversion (num ds la liste,type) -> Code d'enveloppe
  730.   DIM env_valdef&(19,2)         ! Valeurs par defaut pour les parametres des commandes d'enveloppes
  731.   DIM env_codmax&(2)            ! Nombre maxi de codes pour chaque type d'enveloppe
  732.   '
  733.   ' Remplissage des tableaux
  734.   ' ------------------------
  735.   '
  736.   ' Lecure de l'Help
  737.   '
  738.   RESTORE help_text
  739.   j%=0
  740.   READ a$
  741.   REPEAT
  742.     help$(0,j%)=a$
  743.     FOR i%=1 TO 23
  744.       READ help$(i%,j%)
  745.     NEXT i%
  746.     READ a$
  747.     INC j%
  748.   UNTIL a$="***"
  749.   help_pmax%=PRED(j%)
  750.   '
  751.   ' Initialisation des Marks du S.E.
  752.   '
  753.   FOR i%=0 TO 9
  754.     se.mark%(0,i%)=0
  755.     se.mark%(1,i%)=&HFFFFFE
  756.     se.mark$(i%)=SPACE$(21)
  757.   NEXT i%
  758.   '
  759.   ' Lecture des blagues
  760.   '
  761.   RESTORE textes_blagues
  762.   i%=0
  763.   READ a$
  764.   REPEAT
  765.     flag!=FALSE
  766.     blague$(i%)=""
  767.     REPEAT
  768.       IF flag!
  769.         blague$(i%)=blague$(i%)+"|"
  770.       ENDIF
  771.       blague$(i%)=blague$(i%)+a$
  772.       flag!=TRUE
  773.       READ a$
  774.     UNTIL a$="*"
  775.     INC i%
  776.     READ a$
  777.   UNTIL a$="***"
  778.   blague_nbr%=i%
  779.   '
  780.   ' Initialisation des pads
  781.   '
  782.   FOR i%=0 TO 31
  783.     drumpad%(i%,0)=SUCC(i%)
  784.     drumpad%(i%,1)=SUCC(i%)
  785.     drumpad%(i%,2)=ADD(&H3C000000,SHL(SUCC(i%),16))
  786.     presetpad%(i%)=i%
  787.     trackpad%(i%)=i%
  788.   NEXT i%
  789.   '
  790.   ' Lecture des icones des sous-menus
  791.   '
  792.   RESTORE icones_disk
  793.   ARRAYFILL divbi&(),-1
  794.   j%=0
  795.   READ n%
  796.   WHILE n%>0
  797.     READ x%,y%
  798.     FOR i%=0 TO PRED(n%)
  799.       READ a%                   ! Sert a rien pour l'instant
  800.       READ divbn$(i%,j%),divbi&(0,i%,j%),divbi&(1,i%,j%),divbi&(2,i%,j%)
  801.       ADD divbi&(0,i%,j%),x%
  802.       ADD divbi&(1,i%,j%),y%
  803.       READ divbi&(3,i%,j%)
  804.     NEXT i%
  805.     INC j%
  806.     READ n%
  807.   WEND
  808.   '
  809.   ' Donnees des Pop Up
  810.   '
  811.   RESTORE popup_mod_ext
  812.   j%=0
  813.   READ n%
  814.   WHILE n%>0
  815.     popup_nbrlines%(j%)=n%
  816.     FOR i%=0 TO PRED(n%)
  817.       READ popup_txt$(i%,j%)
  818.       READ popup_code%(i%,j%)
  819.     NEXT i%
  820.     INC j%
  821.     READ n%
  822.   WEND
  823.   '
  824.   ' Lecture des touches
  825.   '
  826.   RESTORE touches_notes
  827.   ARRAYFILL t_note%(),-1
  828.   FOR i%=0 TO 16
  829.     READ a%
  830.     t_note%(a%)=i%
  831.   NEXT i%
  832.   FOR i%=12 TO 32
  833.     READ a%
  834.     t_note%(a%)=i%
  835.   NEXT i%
  836.   '
  837.   ' Lecture des commandes d'enveloppes
  838.   '
  839.   RESTORE enveloppe_coms
  840.   ARRAYFILL env_conv&(),-1
  841.   c%=0
  842.   READ a%,b%
  843.   FOR i%=a% TO PRED(ADD(a%,b%))
  844.     READ env_code$(i%),d%
  845.     env_conv&(c%,0)=i%
  846.     env_conv&(c%,1)=i%
  847.     env_conv&(c%,2)=i%
  848.     env_valdef&(c%,0)=d%
  849.     env_valdef&(c%,1)=d%
  850.     env_valdef&(c%,2)=d%
  851.     INC c%
  852.   NEXT i%
  853.   FOR j%=0 TO 2
  854.     d%=c%
  855.     READ a%,b%
  856.     FOR i%=a% TO PRED(ADD(a%,b%))
  857.       READ env_code$(i%),env_valdef&(d%,j%)
  858.       env_conv&(d%,j%)=i%
  859.       INC d%
  860.     NEXT i%
  861.     env_codmax&(j%)=d%
  862.   NEXT j%
  863.   '
  864.   ' Lecture des delay/levels des taps pour la reverb
  865.   '
  866.   RESTORE rev_tap_delay_level
  867.   ARRAYFILL se.rev_tapdelay%(),0
  868.   ARRAYFILL se.rev_taplevel%(),0
  869.   FOR i%=0 TO 6
  870.     READ a#,b#
  871.     se.rev_tapdelay%(i%)=a#*1E+06
  872.     se.rev_taplevel%(i%)=b#*32768
  873.   NEXT i%
  874.   '
  875.   ' Lecture des delay/lpfs des comb filters pour la reverb
  876.   '
  877.   RESTORE rev_comb_delay_lpf
  878.   ARRAYFILL se.rev_combdelay%(),70000
  879.   ARRAYFILL se.rev_comblpf%(),0
  880.   FOR i%=0 TO 3
  881.     READ a#,b#
  882.     se.rev_combdelay%(i%)=a#*1E+06
  883.     se.rev_comblpf%(i%)=b#*32768
  884.   NEXT i%
  885.   '
  886.   ' Init des presets
  887.   '
  888.   FOR j%=0 TO 31
  889.     FOR i%=0 TO 31
  890.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  891.     NEXT i%
  892.   NEXT j%
  893.   ARRAYFILL nbr_colonnes%(),nbr_track%
  894.   '
  895.   ' Initialise les parametres de la fonction Mix du Sample_Editor
  896.   '
  897.   FOR i%=0 TO 4
  898.     se.mix_param%(0,i%)=(i%<2) AND 1            ! +1 : ON, +3 : LOOP
  899.     se.mix_param%(1,i%)=i%                      ! Numero de sample
  900.     se.mix_param%(2,i%)=32768                   ! Volume de debut
  901.     se.mix_param%(3,i%)=32768                   ! Volume de fin
  902.   NEXT i%
  903.   '
  904.   ' Init des fonctions de delay du S.E.
  905.   '
  906.   FOR i%=0 TO 3
  907.     se.delaytime%(i%)=375
  908.     se.delaylevel%(i%)=32768
  909.   NEXT i%
  910.   '
  911.   ' Init des tableaux MIDI
  912.   '
  913.   ARRAYFILL midi_in_channel%(),0                ! Aucun canal MIDI
  914.   ARRAYFILL midi_in_instr%(),1                  ! Numero 1 par defaut
  915.   '
  916.   ' Scancode -> Ascii
  917.   '
  918.   RESTORE key_scancode_to_ascii
  919.   FOR i%=0 TO 1
  920.     FOR j%=0 TO 2
  921.       READ scancode2ascii$(j%,i%)
  922.     NEXT j%
  923.   NEXT i%
  924. RETURN
  925. PROCEDURE init_fonctions_simples
  926.   '
  927.   ' Definition des fonctions simples
  928.   ' --------------------------------
  929.   DEFFN zone_start=zone%
  930.   DEFFN zone_end=ADD(FN zone_start,place_totale%)
  931.   ' Fonctions concernant les samples
  932.   DEFFN adrsamchk(s%)=LONG{ADD(r_adr_sample%,SHL(s%,2))}
  933.   DEFFN lonsamchk(s%)=LONG{ADD(FN adrsamchk(s%),4)}
  934.   DEFFN adresse(s%)=ADD(FN adrsamchk(s%),64)
  935.   DEFFN volume(s%)=CARD{ADD(FN adrsamchk(s%),58)}
  936.   DEFFN finetune(s%)=INT{ADD(FN adrsamchk(s%),60)}
  937.   DEFFN length(s%)=LONG{ADD(FN adrsamchk(s%),46)}
  938.   DEFFN repeat(s%)=LONG{ADD(FN adrsamchk(s%),50)}
  939.   DEFFN replen(s%)=LONG{ADD(FN adrsamchk(s%),54)}
  940.   DEFFN freqech(s%)=CARD{ADD(FN adrsamchk(s%),44)}
  941.   DEFFN resol(s%)=SHR(CARD{ADD(FN adrsamchk(s%),42)},3)
  942.   DEFFN autobal(s%)=CARD{ADD(FN adrsamchk(s%),40)}
  943.   DEFFN total_length=SUB(ADD(FN adrsamchk(255),FN lonsamchk(255)),FN adrsamchk(0))      ! Memoire totale occupee par les samples
  944.   ' Fonctions concernant les pistes
  945.   DEFFN track_onoff(t%)=CARD{ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,t%))}
  946.   DEFFN track_interpol(t%)=CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,t%))}
  947.   DEFFN balance(i%)=CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,i%))}       ! Balance (0-31)
  948.   DEFFN track_volume_lin(i%)=CARD{ADD(ADD(r_info_track%,r_mix_volume_t%),MUL(r_itl%,i%))}
  949.   DEFFN track_volume_exp(i%)=CARD{ADD(ADD(r_info_track%,r_mix_volume_e_t%),MUL(r_itl%,i%))}
  950.   ' Fonctions concernant les instruments
  951.   DEFFN ivolume(i%)=SHR(instrset%(10,i%),16)
  952.   DEFFN ievol(i%)=SHR(instrset%(11,i%),16)
  953.   DEFFN ieton(i%)=instrset%(11,i%) AND &HFFFF
  954.   DEFFN iepan(i%)=SHR(instrset%(12,i%),16)
  955.   DEFFN itransp(i%,j%)=FN sbyte(BYTE{ADD(V:instrset%(15,i%),SUCC(SHL(j%,1)))})  ! Octet signe
  956.   DEFFN isample(i%,j%)=BYTE{ADD(V:instrset%(15,i%),SHL(j%,1))}
  957.   ' Fonctions concernant la song
  958.   DEFFN song_length=module&(101)
  959.   DEFFN song_repeat=module&(102)
  960.   DEFFN mod_tempo=CARD{r_mod_tempo%}
  961.   DEFFN mod_speed=CARD{r_mod_speed%}
  962.   ' Fonctions concernant les patterns
  963.   DEFFN adr_patchunk(i%)=LONG{ADD(r_adr_pattern%,SHL(i%,2))}
  964.   DEFFN lon_patchunk(i%)=LONG{ADD(FN adr_patchunk(i%),4)}
  965.   DEFFN nbr_lines(i%)=CARD{ADD(FN adr_patchunk(i%),28)}
  966.   DEFFN nbr_lines2(i%)=FN nbr_lines(song&(i%))
  967.   DEFFN nbr_lines3=FN nbr_lines(song&(songpos%))
  968.   DEFFN nbr_track(i%)=CARD{ADD(FN adr_patchunk(i%),30)}
  969.   DEFFN nbr_track2(i%)=FN nbr_track(song&(i%))
  970.   DEFFN nbr_track3=FN nbr_track(song&(songpos%))
  971.   ' adresse du pattern a%, ligne b%, piste c%
  972.   DEFFN adr_pat(a%)=ADD(FN adr_patchunk(a%),32)
  973.   DEFFN adr_line(a%,b%)=ADD(FN adr_pat(a%),MUL(MUL(nbr_track%,5),b%))
  974.   DEFFN adr_trk(a%,b%,c%)=ADD(FN adr_line(a%,b%),MUL(c%,5))
  975.   ' adresse du pattern de la position a%, ligne b%, piste c%
  976.   DEFFN adr_spat(a%)=FN adr_pat(song&(a%))
  977.   DEFFN adr_sline(a%,b%)=FN adr_line(song&(a%),b%)
  978.   DEFFN adr_strk(a%,b%,c%)=FN adr_trk(song&(a%),b%,c%)
  979.   ' Fonctions concernant le MIDI
  980.   DEFFN get_midi_flag_velocity(can%)=INT{ADD(r_midi_in_velo_flag%,SHL(PRED(can%),1))}
  981.   DEFFN get_midi_flag_note_off(can%)=INT{ADD(r_midi_in_noteoff_flag%,SHL(PRED(can%),1))}
  982.   ' Fonctions concernant le buffer de sample
  983.   DEFFN adr_buffer=ADD(FN adrsamchk(255),FN lonsamchk(255)) AND -2      ! Adresse de debut du buffer
  984.   DEFFN lon_buffer=SUB(FN zone_end,FN adr_buffer) AND -2                ! Longueur du buffer
  985.   ' Divers
  986.   DEFFN zone_free=FN lon_buffer         ! Memoire libre pour les patterns, enveloppes et samples
  987.   DEFFN zone_free2=SUB(FN zone_end,ADD(FN zone_start,80000))    ! Memoire restante quand le module est minimum (environ)
  988.   DEFFN freq2note(f#)=ROUND(LOG(f#/440)*12/LOG(2)+69)     ! Conversion frequence -> note (codage MIDI)
  989.   DEFFN note2freq(n#)=440*2^((n#-69)/12)                  ! Conversion note -> frequence
  990. RETURN
  991. PROCEDURE sjx_res_save
  992.   ' Possibly put some Videl stuff here, if this doesn't work?
  993.   oldscreenadr%=XBIOS(2)
  994.   oldscreenmode%=XBIOS(88,-1)
  995.   oldscreensize%=XBIOS(91,oldscreenmode%)
  996.   GOSUB sauve_palette                           ! Sauve la palette
  997.   GOSUB sjx_kill_xbra
  998. RETURN
  999. PROCEDURE sjx_system_to_gtk
  1000.   ' Return to the graoumf screen after temporarily exiting to gem
  1001.   ' (i.e., for the fileselector).
  1002.   ' -- LOCK SCREEN HERE
  1003.   GOSUB sjx_lock_scrn
  1004.   HIDEM
  1005.   GOSUB sjx_res_save
  1006.   IF flag_falcon_screen!                        ! Sinon la taille de l'ecran est erronnee
  1007.     ~XBIOS(88,newscreenmode%)
  1008.   ENDIF
  1009.   IF grmode_preserve%=0
  1010.     ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,3,newscreenmode%)
  1011.   ELSE
  1012.     ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,-1)
  1013.   ENDIF
  1014.   GOSUB nouvelle_palette(color_pal$)
  1015.   '  SHOWM
  1016.   '  GOSUB bee(FALSE)
  1017.   ' The main screen *shouldn't* need redrawing, but it does.
  1018.   ' I'm looking into this, but it seems that xbios 5 tries to be helpful
  1019.   ' and clears the screen.
  1020.   ' Quite why it does this when it usually gets the length wrong is unknown.
  1021.   ' But the clearing certainly happens *during* the xbios call, so I don't
  1022.   ' *think* it's GFA.
  1023. RETURN
  1024. PROCEDURE sjx_system_to_gem
  1025.   ' Temporarily exits to the gem screen, etc, again.
  1026.   ' Similar to the content of br - but NOT identical, as br frees the
  1027.   ' screen and exits!
  1028.   HIDEM
  1029.   IF grmode_preserve%=0
  1030.     ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,3,oldscreenmode%)
  1031.   ELSE
  1032.     ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,-1)
  1033.   ENDIF
  1034.   ' Hooray! Finally proper palette on the fileselector ;-)
  1035.   GOSUB restaure_palette                      ! Restaure la palette
  1036.   '  ~XBIOS(&H82,5,3)  ! We won't restore the sound until Graoumf actually exits.
  1037.   '  ~XBIOS(&H82,4,3)
  1038.   '  SPOKE &H484,key_click%        ! Bip bip
  1039.   IF grmode_skipxbra%=0
  1040.     WHILE xbra_remove$<>""        ! On remet les vecteurs a l'envers car il peut y avoir plusieurs fois le meme vecteur detourne
  1041.       SLPOKE LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),8))},LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),4))}
  1042.       xbra_remove$=LEFT$(xbra_remove$,SUB(LEN(xbra_remove$),8))
  1043.     WEND
  1044.   ENDIF
  1045.   SHOWM
  1046.   GOSUB bee(FALSE)
  1047.   ' -- UNLOCK SCREEN HERE
  1048.   GOSUB sjx_unlock_scrn
  1049. RETURN
  1050. PROCEDURE sjx_lock_scrn  ! nyi
  1051.   ' Once implemented, this together with sjx_unlock_scrn will ensure that
  1052.   ' the aes knows we're using the screen instead, and that our clicks don't
  1053.   ' "fall through" Graoumf to the desktop in a multitasking environment.
  1054.   ' Sadly, my knowledge of GFA is limited in the area of the AES - while
  1055.   ' I'd be at home coding this in 68K, I'll have to read up on how GFA will
  1056.   ' react. I know this, though: Only use HIDEM *after* lock_scrn, and SHOWM
  1057.   ' *before* unlock_scrn.
  1058.   ~FORM_DIAL(0,0,0,10000,10000,0,0,10000,10000)
  1059.   ' wind_update(BEG_UPDATE)
  1060.   ~WIND_UPDATE(1)
  1061.   ' wind_update(BEG_MCTRL)
  1062.   ~WIND_UPDATE(3)
  1063.   ' should I do form_dial as well?
  1064.   ' Yes, I should, otherwise it won't redraw. :)
  1065.   ' gemxres%=work_out(0)
  1066.   ' gemyres%=work_out(1)
  1067.   ' Sod them :)
  1068. RETURN
  1069. PROCEDURE sjx_unlock_scrn  ! nyi
  1070.   ' See notes on sjx_lock_scrn, above.
  1071.   ' wind_update(END_MCTRL)
  1072.   ~WIND_UPDATE(2)
  1073.   ' wind_update(END_UPDATE)
  1074.   ~WIND_UPDATE(0)
  1075.   ' This should handle the redraws
  1076.   ~FORM_DIAL(3,0,0,10000,10000,0,0,10000,10000)
  1077. RETURN
  1078. PROCEDURE sjx_kill_xbra
  1079.   '
  1080.   ' Enleve les XBRA genants
  1081.   '
  1082.   ' Unhooks third-party utilities via XBRA
  1083.   ' (caution! This is not system legal)
  1084.   ' If one desires system legal operation, ensure that Accent, Falconscreen,
  1085.   ' - and most wrenchingly of all, at the moment, NVDI, are NOT loaded, and
  1086.   ' set "grmode_skipxbra = true" in the config file.
  1087.   ' Disclaimer: I didn't write this, de Soras did. I just moved it here. :)
  1088.   ' The restoration of vectors is not similarly organised, but you'll find it
  1089.   ' in br, and in sjx_system_to_gem - that section shouldn't need changing, though.
  1090.   IF grmode_skipxbra%<>1
  1091.     ~FN vire_xbra(&HB4,CVL("ACCx"),&HFFFFFF00,TRUE)       ! Accent 1, 2 et 3 du Feroce Lapin
  1092.     ~FN vire_xbra(&H70,CVL("NVDI"),-1,TRUE)               ! NVDI: VBL interrupt
  1093.     ~FN vire_xbra(&H84,CVL("NVDI"),-1,TRUE)               ! NVDI: GEMDOS
  1094.     ~FN vire_xbra(&H88,CVL("NVDI"),-1,TRUE)               ! NVDI: AES/VDI
  1095.     ~FN vire_xbra(&HB4,CVL("NVDI"),-1,TRUE)               ! NVDI: BIOS
  1096.     ~FN vire_xbra(&HB8,CVL("NVDI"),-1,TRUE)               ! NVDI: XBIOS
  1097.     flag_falcon_screen!=FN vire_xbra(&HB8,CVL("ΣFSC"),-1,FALSE)   ! Teste seulement Falcon Screen
  1098.   ENDIF
  1099. RETURN
  1100. PROCEDURE change_resolution
  1101.   ' Passage en resolution 80 colonnes 16 couleurs
  1102.   ' ---------------------------------------------
  1103.   ' This core routine is used on startup - it saves the old resolution,
  1104.   ' sets up memory for the new one, then changes to the new one.
  1105.   ' Call it only once, at the beginning, never twice. Once the
  1106.   ' resolution is set up, use sjx_system_to_gtk and sjx_system_to_gem
  1107.   ' to flip to and from it (respectively).
  1108.   LOCAL a%,b%,c%,i%,mon%,flag!,a$
  1109.   GOSUB sjx_lock_scrn
  1110.   oldscreenadr%=XBIOS(2)
  1111.   oldscreenmode%=XBIOS(88,-1)
  1112.   oldscreensize%=XBIOS(91,oldscreenmode%)
  1113.   GOSUB sauve_palette                           ! Sauve la palette
  1114.   mon%=XBIOS(&H59)
  1115.   SELECT mon%
  1116.   CASE 0        ! Monochrome
  1117.     SHOWM
  1118.     ALERT 3,"GRAOUMF TRACKER|don't work on|monochrome screen",1,"Fuck!|Chier...|Ahh??",a%
  1119.     HIDEM
  1120.     GOSUB br
  1121.   CASE 1        ! RGB
  1122.     IF grmode_overscan%=-1                      ! Overscan par defaut
  1123.       grmode_overscan%=1
  1124.     ENDIF
  1125.   CASE 2        ! VGA
  1126.     IF grmode_overscan%=-1                      ! Pas d'overscan par defaut
  1127.       grmode_overscan%=0
  1128.     ENDIF
  1129.   CASE 3        ! TV
  1130.     ALERT 2,"GRAOUMF TRACKER :|Overscan ???",1,"Yes|Dnt know|No",a%
  1131.     IF a%=3 OR (a%=2 AND RND>0.5)
  1132.       grmode_overscan%=0
  1133.     ENDIF
  1134.   ENDSELECT
  1135.   GOSUB sjx_kill_xbra
  1136.   ON BREAK GOSUB br
  1137.   '
  1138.   ' Calcule le nouveau mode ecran
  1139.   '
  1140.   ' 4 plans, 80 colonnes, overscan
  1141.   newscreenmode%=oldscreenmode% AND (NOT &H80)  ! Pas de resolution compatible ST
  1142.   IF grmode_overscan%=0
  1143.     newscreenmode%=newscreenmode% AND (NOT &H40)
  1144.   ELSE IF grmode_overscan%=1
  1145.     newscreenmode%=newscreenmode% OR &H40
  1146.   ENDIF
  1147.   '
  1148.   IF grmode_80colonnes%=0
  1149.     newscreenmode%=newscreenmode% AND (NOT &H8)
  1150.   ELSE IF grmode_80colonnes%=1
  1151.     newscreenmode%=newscreenmode% OR &H8
  1152.   ENDIF
  1153.   '
  1154.   IF grmode_puissance_plans%<>-1
  1155.     newscreenmode%=(newscreenmode% AND (NOT &H7)) OR grmode_puissance_plans%
  1156.   ENDIF
  1157.   '
  1158.   IF grmode_entrelace%=0
  1159.     IF mon%=2                                   ! VGA
  1160.       newscreenmode%=newscreenmode% OR &H100
  1161.     ELSE                                        ! RVB/TV
  1162.       newscreenmode%=newscreenmode% AND (NOT &H100)
  1163.     ENDIF
  1164.   ELSE IF grmode_entrelace%=1
  1165.     IF mon%=2                                   ! VGA
  1166.       newscreenmode%=newscreenmode% AND (NOT &H100)
  1167.     ELSE                                        ! RVB/TV
  1168.       newscreenmode%=newscreenmode% OR &H100
  1169.     ENDIF
  1170.   ENDIF
  1171.   '
  1172.   IF flag_falcon_screen!                        ! Sinon la taille de l'ecran est erronnee
  1173.     ~XBIOS(88,newscreenmode%)
  1174.   ENDIF
  1175.   ' Using a screen expander that doesn't patch xbios 91 is a Bad Thing.
  1176.   screensize%=XBIOS(91,newscreenmode%)
  1177.   ' RESERVE -MAX(screensize%,system_memory%) ! / What the hell is he doing *here*?!
  1178.   ' ( in the code, seems to call UNRESERVE, but fails 'cause it can't grow the block...!)
  1179.   '
  1180.   ' adrlogscr%=ADD(GEMDOS(21,L:screensize%),255) AND -256 ! Ecran logique a 256 pres
  1181.   '
  1182.   '   At this point:      ^^    I finally decided de Soras didn't have a fucking clue.
  1183.   '   GEMDOS 21 (0x15) isn't listed in the Atari Compendium or Atari ST Internals. It's
  1184.   ' a stupid man who relies on undocumented system calls, and looking at the code, yep,
  1185.   ' that fits de Soras pretty well. <sigh>
  1186.   '   It's in the GEMDOS jumptables, and by careful following of the trap, it seems to
  1187.   ' do something with the memory blocks - I'm not sure what, because *I* can't get
  1188.   ' it to work, although what it seems actually to return in this case is the
  1189.   ' address of the logical screen (also found at $44E and readable by adrlogscr%=XBIOS(3)
  1190.   ' (which by the way, just flips into super mode and reads $44E, but hey.))
  1191.   ' ... After further examination, I *think* (unsure) that it returns the address of a
  1192.   ' block WHICH ALREADY EXISTS the size of which equals the parameter you pass it.
  1193.   ' That block could be *anyone's* screen or an innocent bystander and because he's
  1194.   ' changing resolution, it's probably too small anyway! No wonder it's undocumented.
  1195.   '   In short, I'll *have* to rewrite this, and *I'll* use bloody Mxalloc like a sane
  1196.   ' person would.
  1197.   '                                               -- /sjx.
  1198.   ' BUGBUG: Not sure if the Compendium is right on this, I think OS's just ignore bits
  1199.   ' they don't know. Maybe I should check for the MiNT cookie and... actually, yeah I'll
  1200.   ' probably do that by release.  :)
  1201.   '  adrscrnblock%=GEMDOS(&H48,L:screensize%,&H28)    ! Mxalloc - reserve ST RAM for screen
  1202.   ' Note: For some reason, GFA still barfs at the above, even though I changed it to malloc.
  1203.   ' I think I'd better take a look at the libs.
  1204. gimmesc:
  1205.   ' ^ for debugging, may remove - xref will tag as deadcode anyway :)
  1206.   adrscrnblock%=MALLOC(ADD(screensize%,4096))
  1207.   IF adrscrnblock%=0                    ! If de Soras did this more often, Graoumf would bomb less...
  1208.     IF flag_falcon_screen!
  1209.       ~XBIOS(88,oldscreenmode%)         ! Just in case.
  1210.     ENDIF
  1211.     oldscreenmode%=0                    ! Er, fuck. No ST ram for the screen.
  1212.     GOSUB br                            ! I'd better get outta here.
  1213.   ENDIF
  1214.   adrlogscr%=ADD(adrscrnblock%,255) AND -256        ! Not strictly necessary, but OK
  1215.   ' -- finished here, except for screen freeing (see 'br').
  1216.   adrphyscr%=adrlogscr%                         ! Ecran physique
  1217.   HIDEM
  1218.   IF grmode_preserve%=0
  1219.     ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,3,newscreenmode%)
  1220.   ELSE
  1221.     ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,-1)
  1222.   ENDIF
  1223.   '  HIDEM sjx, 8776, exp
  1224.   ' -- a small assembly routine by de Soras to get the address of the lineA table.
  1225.   a$=MKL$(&H48E77FFE)+MKL$(&HA0002008)+MKL$(&H4CDF7FFE)+MKI$(&H4E75)
  1226.   a%=V:a$
  1227.   b%=C:a%(0)                                    ! b% = adresse des variables line A
  1228.   scr_larg%=DPEEK(SUB(b%,12))                   ! Largeur de l'ecran en pixels
  1229.   scr_haut%=DPEEK(SUB(b%,4))                    ! Hauteur de l'ecran en pixels
  1230.   ' /sjx - he forgot to check the colours... FIXME
  1231.   IF scr_larg%<640 OR scr_haut%<200             ! Largeur et hauteur minimum
  1232.     SHOWM
  1233.     ALERT 3,"Screen mode too small!|Graoumf Tracker needs|640x200 16 colours minimum!",1,"Damn",a%
  1234.     HIDEM
  1235.     GOSUB br
  1236.   ENDIF
  1237.   scr_ncol%=SHR(scr_larg%,3)                    ! ...et en colonnes de caracteres
  1238.   GOSUB chg_type_affpiste(type_affpiste%)       ! Nombre de pistes affichables
  1239.   haut_lig%=MIN(DIV(SUB(scr_haut%,180),6) OR 1,haut_lig%)       ! Nombre de lignes de pattern affichees
  1240.   GOSUB nouvelle_palette(color_pal$)
  1241. RETURN
  1242. PROCEDURE charge_g_routines
  1243.   ' Charge les routines graphiques (et autres routines)
  1244.   ' ---------------------------------------------------
  1245.   LOCAL a%
  1246.   ' Damn you and your fixed buffers... why don't you look at the program header?
  1247.   DIM g_routines%(12288)         ! 48 Ko environ
  1248.   BLOAD npath_prog$+nfile_p1$,V:g_routines%(0)
  1249.   a%=ADD(V:g_routines%(0),28)
  1250.   g_relocation%=a%
  1251.   g_fabrique_fonte_ombr%=ADD(a%,4)
  1252.   g_cadre_centre%=ADD(a%,8)
  1253.   g_dessine_cadre_int%=ADD(a%,12)
  1254.   g_dessine_cadre_ext%=ADD(a%,16)
  1255.   g_affchaine_trans%=ADD(a%,20)
  1256.   g_affchaine_trans_ombr%=ADD(a%,24)
  1257.   g_affchaine_notrans%=ADD(a%,28)
  1258.   g_affcar8x6%=ADD(a%,32)
  1259.   g_affcar8x6_dec%=ADD(a%,36)
  1260.   g_affcar8x6_ombr%=ADD(a%,40)
  1261.   g_affcar8x6_ombr_dec%=ADD(a%,44)
  1262.   g_affcar8x6nt_ombr%=ADD(a%,48)
  1263.   g_affiche_pattern%=ADD(a%,52)
  1264.   g_affiche_sample%=ADD(a%,56)
  1265.   g_convert_nt_2_gtk%=ADD(a%,60)
  1266.   g_convert_669_2_gtk%=ADD(a%,64)
  1267.   g_convert_mtmv_2_gtk%=ADD(a%,68)
  1268.   g_signe_sample%=ADD(a%,72)
  1269.   g_stereo_2_mono_one%=ADD(a%,76)
  1270.   g_stereo_2_mono_ave%=ADD(a%,80)
  1271.   g_convert_mmd1_2_gtk%=ADD(a%,84)
  1272.   g_teste_icones%=ADD(a%,88)
  1273.   g_convert_s3m_2_gtk%=ADD(a%,92)
  1274.   g_intel_16_bits%=ADD(a%,96)
  1275.   g_convert_ult_2_gtk%=ADD(a%,100)
  1276.   g_convert_gtk_2_gtk_vol%=ADD(a%,104)
  1277.   g_clear_note_block%=ADD(a%,108)
  1278.   g_paste_note_block%=ADD(a%,112)
  1279.   g_atomic_35_unpack%=ADD(a%,116)
  1280.   g_swap_note_block%=ADD(a%,120)
  1281.   g_transpose_note_block%=ADD(a%,124)
  1282.   g_packice_21_unpack%=ADD(a%,128)
  1283.   g_invert_memory%=ADD(a%,132)
  1284.   g_affiche_marqueur_sample%=ADD(a%,136)
  1285.   g_efface_marqueur_sample%=ADD(a%,140)
  1286.   g_copy_sample_8_2_16%=ADD(a%,144)
  1287.   g_copy_sample_16_2_8%=ADD(a%,148)
  1288.   g_convert_gtk_2_nt%=ADD(a%,152)
  1289.   g_cherche_volume_sample%=ADD(a%,156)
  1290.   g_change_volume_sample%=ADD(a%,160)
  1291.   g_mixage_sample%=ADD(a%,164)
  1292.   g_affiche_vumetre%=ADD(a%,168)
  1293.   g_start_sample_recording%=ADD(a%,172)
  1294.   g_cherche_volume_buffer_stereo%=ADD(a%,176)
  1295.   g_change_sample_frequency%=ADD(a%,180)
  1296.   g_trans_fourier%=ADD(a%,184)
  1297.   g_fx_delay%=ADD(a%,188)
  1298.   g_convert_dtm_2_gtk%=ADD(a%,192)
  1299.   g_dtm_next_chunk%=ADD(a%,196)
  1300.   g_convert_gtk_2_s3m%=ADD(a%,200)
  1301.   g_convert_ft2_2_gtk%=ADD(a%,204)
  1302.   g_absolu_2_delta%=ADD(a%,208)
  1303.   g_delta_2_absolu%=ADD(a%,212)
  1304.   g_bmove%=ADD(a%,216)
  1305.   g_fx_stereo_flanger%=ADD(a%,220)
  1306.   g_packice_24_unpack%=ADD(a%,224)
  1307.   g_reverberation%=ADD(a%,228)
  1308.   g_grise_surface%=ADD(a%,232)
  1309.   g_convert_stereo16%=ADD(a%,236)
  1310.   g_start_song_recording%=ADD(a%,240)
  1311.   g_stop_song_recording%=ADD(a%,244)
  1312.   g_fx_compression%=ADD(a%,248)
  1313.   g_affiche_image_presentation%=ADD(a%,252)
  1314.   g_find_key_function%=ADD(a%,256)
  1315.   g_find_used_samples_and_instruments%=ADD(a%,260)
  1316.   g_speedpacker_unpack%=ADD(a%,264)
  1317.   a%=V:g_routines%(0)
  1318.   g_adrecr%=C:g_relocation%(L:a%)               ! Reloge la routine
  1319.   g_linewidth%=ADD(g_adrecr%,4)
  1320.   g_flag_sample_rec%=ADD(g_adrecr%,6)
  1321.   g_flag_sample_rec2%=ADD(g_adrecr%,8)
  1322.   g_adr_record_inf%=LONG{ADD(g_adrecr%,10)}     ! C'est directement l'adresse des infos de digit
  1323.   g_rec_sam_buffer%=LONG{ADD(g_adrecr%,14)}     ! C'est directement l'adresse du buffer 1 de digit
  1324.   g_sngrec_paramadr%=ADD(g_adrecr%,26)          ! Adresse des parametres de Song-2-Disk (DUMTRACK.PGT)
  1325.   g_progression_pos%=ADD(g_adrecr%,58)          ! Position de la progression
  1326.   g_progression_len%=ADD(g_adrecr%,62)          ! Longueur de la progression
  1327.   LPOKE g_adrecr%,adrlogscr%
  1328.   DPOKE g_linewidth%,SHR(scr_larg%,1)
  1329.   ~C:g_fabrique_fonte_ombr%(0)                  ! Fabrique la fonte ombree
  1330. RETURN
  1331. PROCEDURE charge_r_routines
  1332.   LOCAL a$,a%,b%,i%
  1333.   ' /sjx - all reserves removed and replaced with a $m655360 instead...
  1334.   ' RESERVE 655360                                ! Il reste 640 Ko pour nous
  1335.   ' /sjx - this, too, needs some attention. And I think I have an idea.  : ALLMEM
  1336.   ' /sjx - idea implemented. Positive system_memory leaves that much for the system.
  1337.   ' Negative system_memory *takes* that much from the system for Graoumf.
  1338. resmem:
  1339.   '  IF system_memory%<0
  1340.   '    place_totale%=(-system_memory%) AND -4          ! Take that much, not leave it
  1341.   '  ELSE
  1342.   place_totale%=SUB(MALLOC(-1),system_memory%) AND -4   ! La place qu'il reste pour patterns+samples
  1343.   ' ENDIF
  1344.   IF place_totale%<1
  1345.     GOSUB br
  1346.   ENDIF
  1347.   ' /sjx - I'm pretty sure this'll be OK and will use TTRAM if available. Depends on the flags though.
  1348.   ' zone% is the big continuous block of memory that graoumf works with.
  1349.   zone%=MALLOC(place_totale%)                   ! Les patterns, enveloppes et samples
  1350.   IF zone%=0
  1351.     GOSUB br
  1352.   ENDIF
  1353.   DIM module&(103)                              ! Le debut du module
  1354.   DIM song&(255)                                ! La song
  1355.   DIM instrset%(78,255)                         ! 256 * 316 octets pour les instruments
  1356.   DIM r_mod%(80000)                             ! 320 Ko pour la routine de replay
  1357.   ' ...and if it's bigger, what then? Why didn't you take the size of REPLAY.PGT? <sigh>
  1358.   DIM pattern_bidon%(20500)                     ! 2 * (32 + 64 * 32 * 5) : Patterns 256 et 257
  1359.   DIM module_bidon%(52)
  1360.   DIM song_bidon%(127)
  1361.   ARRAYFILL song_bidon%(),&H1010101
  1362.   song_bidon%(0)=&H1000101
  1363.   a$="GTK"+CHR$(gtk_file_vnum%)+SPACE$(192)+MKI$(255)+MKI$(nbr_lines%)+MKI$(nbr_track%)+MKI$(2)+MKI$(1)
  1364.   BMOVE V:a$,V:module_bidon%(0),208
  1365.   BLOAD npath_prog$+nfile_p2$,V:r_mod%(0)
  1366.   a%=V:r_mod%(0)
  1367.   b%=ADD(a%,28)
  1368.   rr_player_on%=ADD(b%,4)                       ! Routine d'activation du player
  1369.   rr_boucle_sample%=ADD(b%,8)                   ! Routine de bouclage d'un instrument
  1370.   rr_play_one_sample%=ADD(b%,12)                ! Routine de replay d'un sample sur une voie
  1371.   rr_play_one_note%=ADD(b%,16)                  ! Routine de replay d'une note sur une voie
  1372.   rr_songrecord_routine_no_realtime%=ADD(b%,20) ! Routine d'enregistrement d'un module
  1373.   a%=C:b%(L:a%)                                 ! On reloge
  1374.   r_itl%=DPEEK(a%)                              ! Taille des informations concernant 1 voie
  1375.   r_nbrvoies%=LPEEK(ADD(a%,2))
  1376.   r_master_vol%=LPEEK(ADD(a%,6))
  1377.   r_adr_sample%=LPEEK(ADD(a%,10))
  1378.   r_adr_module%=LPEEK(ADD(a%,14))
  1379.   r_adr_instrset%=LPEEK(ADD(a%,18))
  1380.   r_adr_song%=LPEEK(ADD(a%,22))
  1381.   r_adr_pattern%=LPEEK(ADD(a%,26))
  1382.   r_mod_nbrtrack%=LPEEK(ADD(a%,30))
  1383.   r_mix_volume_e_t%=LPEEK(ADD(a%,34))
  1384.   r_mod_songlen%=LPEEK(ADD(a%,38))
  1385.   r_mod_songrep%=LPEEK(ADD(a%,42))
  1386.   r_mod_songpos%=LPEEK(ADD(a%,46))
  1387.   r_mod_numpat%=LPEEK(ADD(a%,50))
  1388.   r_mod_linepos%=LPEEK(ADD(a%,54))
  1389.   r_mod_speed%=LPEEK(ADD(a%,58))
  1390.   r_mod_nbrvbl%=LPEEK(ADD(a%,62))
  1391.   r_info_track%=LPEEK(ADD(a%,66))
  1392.   r_repeatbuffer%=LPEEK(ADD(a%,70))
  1393.   r_flag_stop_voices%=LPEEK(ADD(a%,74))
  1394.   r_mix_volume_t%=LPEEK(ADD(a%,78))
  1395.   r_flag_the_end%=LPEEK(ADD(a%,82))
  1396.   r_onoff_t%=LPEEK(ADD(a%,86))
  1397.   r_nbits_t%=LPEEK(ADD(a%,90))
  1398.   r_fech_t%=LPEEK(ADD(a%,94))
  1399.   r_bal_t%=LPEEK(ADD(a%,98))
  1400.   r_flag_mt_display%=LPEEK(ADD(a%,102))
  1401.   r_vblsize%=LPEEK(ADD(a%,106))
  1402.   r_mod_patrep%=LPEEK(ADD(a%,110))
  1403.   r_vblnumber%=LPEEK(ADD(a%,114))
  1404.   r_adr_replay_frequency%=LONG{ADD(a%,118)}
  1405.   r_adr_evol%=LONG{ADD(a%,122)}
  1406.   r_adr_eton%=LONG{ADD(a%,126)}
  1407.   r_adr_epan%=LONG{ADD(a%,130)}
  1408.   r_songrecord_state%=LONG{ADD(a%,134)}
  1409.   r_songrecord_routine%=LONG{ADD(a%,138)}
  1410.   r_mod_tempo%=LONG{ADD(a%,142)}
  1411.   r_interpol_t%=LONG{ADD(a%,146)}
  1412.   r_adr_adr_inter%=LONG{ADD(a%,150)}
  1413.   r_current_play_mode%=LONG{ADD(a%,154)}
  1414.   r_current_edit_mode%=LONG{ADD(a%,158)}
  1415.   r_midi_in_gfa_playline%=LONG{ADD(a%,162)}
  1416.   r_midi_instr_map%=LONG{ADD(a%,166)}
  1417.   r_midi_track_state%=LONG{ADD(a%,170)}
  1418.   r_midi_ts_next%=LONG{ADD(a%,174)}
  1419.   r_new_note_buffer%=LONG{ADD(a%,178)}
  1420.   r_midi_in_noteoff_flag%=LONG{ADD(a%,182)}
  1421.   r_midi_in_velo_flag%=LONG{ADD(a%,186)}
  1422.   r_midi_in_sync_flag%=LONG{ADD(a%,190)}
  1423.   r_midi_in_sync_cpt%=LONG{ADD(a%,194)}
  1424.   r_midi_in_on%=LONG{ADD(a%,198)}
  1425.   r_cpu_time_pourcent%=LONG{ADD(a%,202)}
  1426.   r_flag_overload%=LONG{ADD(a%,206)}
  1427.   ' Initialisation du player
  1428.   garbage%=0
  1429.   GOSUB clear_patterns
  1430.   garbage%=1
  1431.   GOSUB clear_instr
  1432.   garbage%=2
  1433.   GOSUB clear_samples2
  1434.   garbage%=3
  1435.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  1436.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  1437.   b%=V:pattern_bidon%(0)
  1438.   FOR i%=256 TO 257
  1439.     CARD{ADD(V:a$,8)}=i%
  1440.     BMOVE V:a$,b%,LEN(a$)
  1441.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  1442.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  1443.     ADD b%,a%
  1444.   NEXT i%
  1445.   LPOKE r_adr_module%,V:module_bidon%(0)
  1446.   LPOKE r_adr_song%,V:song_bidon%(0)
  1447.   LPOKE r_adr_instrset%,V:instrset%(0,0)
  1448.   DPOKE r_flag_mt_display%,0
  1449.   ~C:rr_player_on%(W:1)                 ! Player active (mais ne joue rien)
  1450. RETURN
  1451. PROCEDURE teste_enregistrement
  1452.   LOCAL a%,b%,a$,c$,i%,user_nbr%
  1453.   flag_registered!=TRUE
  1454.   SHOWM
  1455.   GOSUB bee(TRUE)
  1456.   ' El Bog Standard Key Routine, 1 of 2.
  1457.   ' Left in for those registered users who like to see their name in lights.
  1458.   mes_registred$=treg_str1$
  1459.   IF FN exist(npath_prog$+treg_str2$)
  1460.     OPEN "i",#0,npath_prog$+treg_str2$
  1461.     IF LOF(#0)=1032
  1462.       c$=STRING$(1032,0)
  1463.       BGET #0,V:c$,1032
  1464.       a%=0                              ! Teste la somme de controle
  1465.       b%=1
  1466.       FOR i%=0 TO 1027
  1467.         a%=ADD(a%,MUL(b%,BYTE{ADD(V:c$,i%)} XOR 255))
  1468.         INC b%
  1469.       NEXT i%
  1470.       IF a%=LONG{ADD(V:c$,1028)}
  1471.         user%=LONG{ADD(V:c$,512)}
  1472.         a%=&H5BA3
  1473.         a$=""
  1474.         FOR i%=0 TO 510 STEP 2
  1475.           b%=CARD{ADD(V:c$,i%)}
  1476.           a$=a$+MKI$(b% XOR a%)
  1477.           a%=SUB(a%,b%) AND &HFFFF
  1478.         NEXT i%
  1479.         IF a$=MID$(c$,517,512) AND user%<>10
  1480.           flag_registered!=TRUE
  1481.           a%=ADD(INSTR(c$,treg_str3$),13)
  1482.           b%=INSTR(RIGHT$(c$,SUCC(SUB(LEN(c$),a%))),","+CHR$(13))
  1483.           mes_registred$=treg_str4$+MID$(c$,a%,PRED(b%))
  1484.         ELSE
  1485.           GOTO erreur_user.reg
  1486.         ENDIF
  1487.       ELSE
  1488.         GOTO erreur_user.reg
  1489.       ENDIF
  1490.     ELSE
  1491.     erreur_user.reg:
  1492.       mes_registred$=treg_str5$
  1493.     ENDIF
  1494.     CLOSE #0
  1495.   ENDIF
  1496.   GOSUB bee(FALSE)
  1497. RETURN
  1498. PROCEDURE charge_image_presentation
  1499.   LOCAL adr_img%,adr_logo%,col%,haut%,haut_img%,i%,j%,lig_aff%,lig_img%,lon_fic%,plan%,x_logo%
  1500.   LOCAL header%
  1501.   LOCAL dummy#
  1502.   LOCAL pal$,logo$
  1503.   RANDOMIZE TIMER
  1504.   IF FN exist(npath_prog$+nfile_present$) AND FN exist(npath_prog$+nfile_logo$)
  1505.     logo$=STRING$(32034,0)
  1506.     BLOAD npath_prog$+nfile_logo$,V:logo$
  1507.     ~C:g_atomic_35_unpack%(L:V:logo$)           ! Au cas ou il serait packe
  1508.     OPEN "i",#0,npath_prog$+nfile_present$
  1509.     BGET #0,V:header%,4
  1510.     IF MKL$(header%)="ATM5"
  1511.       BGET #0,V:lon_fic%,4
  1512.     ELSE
  1513.       lon_fic%=LOF(#0)
  1514.     ENDIF
  1515.     SEEK #0,0
  1516.     IF lon_fic%<SUB(FRE(0),65536)
  1517.       GOSUB nouvelle_palette(STRING$(44,48))
  1518.       DIM image_presentation%(SHR(ADD(lon_fic%,3),2))
  1519.       adr_img%=V:image_presentation%(0)
  1520.       BGET #0,adr_img%,LOF(#0)
  1521.       ~C:g_atomic_35_unpack%(L:adr_img%)        ! Au cas ou il serait packe
  1522.       '
  1523.       ' Affichage de l'image puis du logo.
  1524.       '
  1525.       haut_img%=LONG{ADD(adr_img%,4)}
  1526.       IF DIV(scr_larg%,scr_haut%)<2             ! Mode video avec pixels carres
  1527.         haut%=MIN(scr_haut%,haut_img%)
  1528.         lig_img%=MIN(SUB(haut_img%,haut%),30)
  1529.         lig_aff%=SHR(SUB(scr_haut%,haut%),1)
  1530.         col%=SHR(SUB(scr_larg%,LONG{adr_img%}),4)
  1531.         VOID C:g_affiche_image_presentation%(L:adr_img%,W:col%,W:lig_aff%,W:lig_img%,W:haut%,W:FALSE)
  1532.         x_logo%=SHR(SUB(scr_larg%,320),1)
  1533.         adr_logo%=ADD(V:logo$,34)
  1534.         FOR i%=0 TO 119
  1535.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),PRED(x_logo%),i%,4
  1536.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),SUCC(x_logo%),i%,4
  1537.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),x_logo%,MAX(PRED(i%),0),4
  1538.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),x_logo%,SUCC(i%),4
  1539.         NEXT i%
  1540.         FOR i%=0 TO 119
  1541.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),x_logo%,i%,7
  1542.         NEXT i%
  1543.       ELSE                                      ! Mode video avec pixels rectangulaires
  1544.         DIV haut_img%,2
  1545.         haut%=MIN(scr_haut%,haut_img%)
  1546.         lig_img%=MIN(SUB(haut_img%,haut%),32)
  1547.         lig_aff%=SHR(SUB(scr_haut%,haut%),1)
  1548.         col%=SHR(SUB(scr_larg%,LONG{adr_img%}),4)
  1549.         VOID C:g_affiche_image_presentation%(L:adr_img%,W:col%,W:lig_aff%,W:lig_img%,W:haut%,W:TRUE)
  1550.         x_logo%=SHR(SUB(scr_larg%,320),1)
  1551.         adr_logo%=ADD(V:logo$,34)
  1552.         FOR i%=0 TO 59
  1553.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),PRED(x_logo%),i%,4
  1554.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),SUCC(x_logo%),i%,4
  1555.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),x_logo%,MAX(PRED(i%),0),4
  1556.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),x_logo%,SUCC(i%),4
  1557.         NEXT i%
  1558.         FOR i%=0 TO 59
  1559.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),x_logo%,i%,7
  1560.         NEXT i%
  1561.       ENDIF
  1562.       ERASE image_presentation%()
  1563.       '
  1564.       ' Palette de l'image
  1565.       '
  1566.       pal$=""
  1567.       dummy#=RND
  1568.       IF dummy#<0.85
  1569.         FOR i%=0 TO 15
  1570.           pal$=pal$+HEX$(MUL(i%,&H111),3)
  1571.         NEXT i%
  1572.       ELSE IF dummy#<0.95
  1573.         FOR i%=0 TO 15
  1574.           pal$=pal$+HEX$(MUL(SUB(15,i%),&H111),3)
  1575.         NEXT i%
  1576.       ELSE IF dummy#<0.975
  1577.         FOR i%=0 TO 15
  1578.           pal$=pal$+HEX$(ADD(MUL(i%,&H100),MUL(SUB(15,i%),&H10)),3)
  1579.         NEXT i%
  1580.       ELSE
  1581.         FOR i%=0 TO 15
  1582.           IF i%<8
  1583.             j%=ADD(i%,3)
  1584.           ELSE
  1585.             j%=SUB(19,i%)
  1586.           ENDIF
  1587.           pal$=pal$+HEX$(MUL(j%,&H111),3)
  1588.         NEXT i%
  1589.       ENDIF
  1590.       GOSUB nouvelle_palette(pal$)
  1591.       '
  1592.       ' Constitue le logo pour l'affichage dans le programme
  1593.       '
  1594.       graoumf_logo_mask$=MID$(logo$,35,19200)   ! 120 lignes de 160 octets
  1595.       graoumf_logo$=graoumf_logo_mask$
  1596.       FOR plan%=0 TO 3                          ! Met a 0 les bitplans non utilises, suivant la couleur
  1597.         IF NOT BTST(graoumf_logo_color%,plan%)
  1598.           adr_logo%=V:graoumf_logo$
  1599.           FOR i%=ADD(adr_logo%,SHL(plan%,1)) TO ADD(ADD(adr_logo%,SHL(plan%,1)),19192) STEP 8
  1600.             CARD{i%}=0
  1601.           NEXT i%
  1602.         ENDIF
  1603.       NEXT plan%
  1604.       attente_fin_presentation%=2               ! On laissera admirer 2 secondes l'image...
  1605.     ENDIF
  1606.     CLOSE #0
  1607.   ENDIF
  1608. RETURN
  1609. PROCEDURE sauve_palette
  1610.   LOCAL i%
  1611.   oldpalette$=""
  1612.   FOR i%=&HFFFF9800 TO &H0 STEP 4
  1613.     oldpalette$=oldpalette$+MKL$(LPEEK(i%))
  1614.   NEXT i%
  1615. RETURN
  1616. PROCEDURE nouvelle_palette(pal$)
  1617.   LOCAL a%,b%,c%
  1618.   FOR a%=0 TO 15
  1619.     ' Palette Falcon
  1620.     b%=SHL(VAL("&"+MID$(pal$,ADD(MUL(a%,3),3),1)),4)
  1621.     ADD b%,SHL(VAL("&"+MID$(pal$,ADD(MUL(a%,3),2),1)),20)
  1622.     ADD b%,SHL(VAL("&"+MID$(pal$,SUCC(MUL(a%,3)),1)),28)
  1623.     SLPOKE ADD(&HFFFF9800,SHL(a%,2)),b%
  1624.     ' Palette ST
  1625.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),3),1))
  1626.     b%=ADD(SHR(c%,1),SHL(c% AND 1,3))
  1627.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),2),1))
  1628.     ADD b%,SHL(ADD(SHR(c%,1),SHL(c% AND 1,3)),4)
  1629.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),1),1))
  1630.     ADD b%,SHL(ADD(SHR(c%,1),SHL(c% AND 1,3)),8)
  1631.     SDPOKE ADD(&HFFFF8240,SHL(a%,1)),b%
  1632.   NEXT a%
  1633. RETURN
  1634. PROCEDURE restaure_palette
  1635.   LOCAL iiiii%
  1636.   FOR iiiii%=0 TO &H3C STEP 4
  1637.     SLPOKE ADD(iiiii%,&HFFFF9800),CVL(MID$(oldpalette$,SUCC(iiiii%),4))
  1638.   NEXT iiiii%
  1639. RETURN
  1640. '
  1641. ' Affichages de base
  1642. ' ------------------
  1643. PROCEDURE resync_tv_screen
  1644.   ' Isn't this just a tiny bit dangerous how he forgets to check what the monitor is?
  1645.   ' He probably only put this in here because of those horrendous reschange routines... /sjx
  1646.   LOCAL a%
  1647.   a%=GEMDOS(7) AND 255
  1648.   SELECT a%
  1649.   CASE "1"                                  ! Normal non entrelace
  1650.     SDPOKE &HFF8282,&H1FF
  1651.     SDPOKE &HFF8284,&H160
  1652.     SDPOKE &HFF8286,&HA7
  1653.     SDPOKE &HFF8288,&H70
  1654.     SDPOKE &HFF828A,&H120
  1655.     SDPOKE &HFF828C,&H1B4
  1656.     SDPOKE &HFF82A2,&H20D
  1657.     SDPOKE &HFF82A4,&H201
  1658.     SDPOKE &HFF82A6,&H32
  1659.     SDPOKE &HFF82A8,&H4D
  1660.     SDPOKE &HFF82AA,&H1DD
  1661.     SDPOKE &HFF82AC,&H207
  1662.   CASE "2"                                  ! Normal entrelace
  1663.     SDPOKE &HFF8282,&H1FF
  1664.     SDPOKE &HFF8284,&H160
  1665.     SDPOKE &HFF8286,&HA7
  1666.     SDPOKE &HFF8288,&H70
  1667.     SDPOKE &HFF828A,&H120
  1668.     SDPOKE &HFF828C,&H1B4
  1669.     SDPOKE &HFF82A2,&H20C
  1670.     SDPOKE &HFF82A4,&H201
  1671.     SDPOKE &HFF82A6,&H32
  1672.     SDPOKE &HFF82A8,&H4C
  1673.     SDPOKE &HFF82AA,&H1DC
  1674.     SDPOKE &HFF82AC,&H207
  1675.   CASE "4"                                  ! Overscan non entrelace
  1676.     SDPOKE &HFF8282,&H1FF
  1677.     SDPOKE &HFF8284,&H180
  1678.     SDPOKE &HFF8286,&H7F
  1679.     SDPOKE &HFF8288,&H2D
  1680.     SDPOKE &HFF828A,&H15D
  1681.     SDPOKE &HFF828C,&H1A1
  1682.     SDPOKE &HFF82A2,&H20D
  1683.     SDPOKE &HFF82A4,&H207
  1684.     SDPOKE &HFF82A6,&H25
  1685.     SDPOKE &HFF82A8,&H25
  1686.     SDPOKE &HFF82AA,&H205
  1687.     SDPOKE &HFF82AC,&H207
  1688.   CASE "5"                                  ! Overscan entrelace
  1689.     SDPOKE &HFF8282,&H1FF
  1690.     SDPOKE &HFF8284,&H180
  1691.     SDPOKE &HFF8286,&H7F
  1692.     SDPOKE &HFF8288,&H2D
  1693.     SDPOKE &HFF828A,&H15D
  1694.     SDPOKE &HFF828C,&H1A1
  1695.     SDPOKE &HFF82A2,&H20C
  1696.     SDPOKE &HFF82A4,&H207
  1697.     SDPOKE &HFF82A6,&H25
  1698.     SDPOKE &HFF82A8,&H24
  1699.     SDPOKE &HFF82AA,&H204
  1700.     SDPOKE &HFF82AC,&H207
  1701.   ENDSELECT
  1702. RETURN
  1703. PROCEDURE cadre_int(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1704.   LOCAL aaaa$,iiii%
  1705.   HIDEM
  1706.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1707.   iiii%=V:aaaa$
  1708.   ~C:g_dessine_cadre_int%(L:iiii%)
  1709. RETURN
  1710. PROCEDURE cadre_ext(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1711.   LOCAL aaaa$,iiii%
  1712.   HIDEM
  1713.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1714.   iiii%=V:aaaa$
  1715.   ~C:g_dessine_cadre_ext%(L:iiii%)
  1716. RETURN
  1717. PROCEDURE cadre_o_int(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1718.   LOCAL aaaa$,iiii%
  1719.   HIDEM
  1720.   GOSUB cadre_int(ADD(aaaa%,1),ADD(bbbb%,4),MAX(MIN(cccc%,SUB(SUB(scr_ncol%,aaaa%),2)),0),MAX(MIN(dddd%,SUB(SUB(scr_haut%,bbbb%),2)),0),0,0,0,0)
  1721.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1722.   iiii%=V:aaaa$
  1723.   ~C:g_dessine_cadre_int%(L:iiii%)
  1724. RETURN
  1725. PROCEDURE cadre_o_ext(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1726.   LOCAL aaaa$,iiii%
  1727.   HIDEM
  1728.   GOSUB cadre_ext(ADD(aaaa%,1),ADD(bbbb%,4),MAX(MIN(cccc%,SUB(SUB(scr_ncol%,aaaa%),2)),0),MAX(MIN(dddd%,SUB(SUB(scr_haut%,bbbb%),2)),0),0,0,0,0)
  1729.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1730.   iiii%=V:aaaa$
  1731.   ~C:g_dessine_cadre_ext%(L:iiii%)
  1732. RETURN
  1733. PROCEDURE cadre_texte(aaaa$,xxxx%,yyyy%,llll%)
  1734.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1735.   HIDEM
  1736.   IF aaaa$=""
  1737.     aaaa$=CHR$(0)
  1738.   ENDIF
  1739.   cccc$=aaaa$+CHR$(0)
  1740.   aaaa%=V:cccc$
  1741.   bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1742.   bbbb%=V:bbbb$
  1743.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1744. RETURN
  1745. PROCEDURE cadre_texte2(aaaa$,xxxx%,yyyy%,llll%,pppp%)
  1746.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1747.   HIDEM
  1748.   IF aaaa$=""
  1749.     aaaa$=CHR$(0)
  1750.   ENDIF
  1751.   cccc$=aaaa$+CHR$(0)
  1752.   aaaa%=V:cccc$
  1753.   IF pppp%=0
  1754.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1755.   ELSE
  1756.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(8)+CHR$(10)
  1757.   ENDIF
  1758.   bbbb%=V:bbbb$
  1759.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1760. RETURN
  1761. PROCEDURE cadre_texte3(aaaa$,xxxx%,yyyy%,llll%,hhhh%,pppp%)
  1762.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1763.   HIDEM
  1764.   IF aaaa$=""
  1765.     aaaa$=CHR$(0)
  1766.   ENDIF
  1767.   cccc$=aaaa$+CHR$(0)
  1768.   aaaa%=V:cccc$
  1769.   IF pppp%=0
  1770.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1771.   ELSE
  1772.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(9)+CHR$(9)+CHR$(8)+CHR$(10)
  1773.   ENDIF
  1774.   bbbb%=V:bbbb$
  1775.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1776. RETURN
  1777. PROCEDURE cadre_texte_b(aaaa$,xxxx%,yyyy%,llll%)
  1778.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1779.   HIDEM
  1780.   IF aaaa$=""
  1781.     aaaa$=CHR$(0)
  1782.   ENDIF
  1783.   cccc$=aaaa$+CHR$(0)
  1784.   aaaa%=V:cccc$
  1785.   bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1786.   bbbb%=V:bbbb$
  1787.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1788. RETURN
  1789. PROCEDURE cadre_texte2_b(aaaa$,xxxx%,yyyy%,llll%,pppp%)
  1790.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1791.   HIDEM
  1792.   IF aaaa$=""
  1793.     aaaa$=CHR$(0)
  1794.   ENDIF
  1795.   cccc$=aaaa$+CHR$(0)
  1796.   aaaa%=V:cccc$
  1797.   IF pppp%=0
  1798.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1799.   ELSE
  1800.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(12)+CHR$(14)
  1801.   ENDIF
  1802.   bbbb%=V:bbbb$
  1803.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1804. RETURN
  1805. PROCEDURE cadre_texte3_b(aaaa$,xxxx%,yyyy%,llll%,hhhh%,pppp%)
  1806.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1807.   HIDEM
  1808.   IF aaaa$=""
  1809.     aaaa$=CHR$(0)
  1810.   ENDIF
  1811.   cccc$=aaaa$+CHR$(0)
  1812.   aaaa%=V:cccc$
  1813.   IF pppp%=0
  1814.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1815.   ELSE
  1816.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(13)+CHR$(13)+CHR$(12)+CHR$(14)
  1817.   ENDIF
  1818.   bbbb%=V:bbbb$
  1819.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1820. RETURN
  1821. PROCEDURE grise_surface(xxxx%,yyyy%,llll%,hhhh%)
  1822.   ~C:g_grise_surface%(W:xxxx%,W:yyyy%,W:llll%,W:hhhh%)
  1823. RETURN
  1824. PROCEDURE grise_icone(nnn%,ttt%,xxxd%,yyyd%)
  1825.   GOSUB grise_surface(ADD(divbi&(0,nnn%,ttt%),xxxd%),ADD(divbi&(1,nnn%,ttt%),yyyd%),divbi&(2,nnn%,ttt%),divbi&(3,nnn%,ttt%))
  1826. RETURN
  1827. PROCEDURE affchaine_notrans(aaaa$,xxxx%,yyyy%,cccc%)
  1828.   LOCAL aaaa%,bbbb$
  1829.   IF aaaa$<>""
  1830.     HIDEM
  1831.     bbbb$=aaaa$+CHR$(0)
  1832.     aaaa%=V:bbbb$
  1833.     ~C:g_affchaine_notrans%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%)
  1834.   ENDIF
  1835. RETURN
  1836. PROCEDURE affchaine_trans(aaaa$,xxxx%,yyyy%,cccc%)
  1837.   LOCAL aaaa%,bbbb$
  1838.   IF aaaa$<>""
  1839.     HIDEM
  1840.     bbbb$=aaaa$+CHR$(0)
  1841.     aaaa%=V:bbbb$
  1842.     ~C:g_affchaine_trans%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%)
  1843.   ENDIF
  1844. RETURN
  1845. PROCEDURE affchaine_trans_ombr(aaaa$,xxxx%,yyyy%,cccc%,cccc2%)
  1846.   LOCAL aaaa%,bbbb$
  1847.   IF aaaa$<>""
  1848.     HIDEM
  1849.     bbbb$=aaaa$+CHR$(0)
  1850.     aaaa%=V:bbbb$
  1851.     ~C:g_affchaine_trans_ombr%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%,W:cccc2%)
  1852.   ENDIF
  1853. RETURN
  1854. PROCEDURE affchaine_tronque(aaa$,xxx%,yyy%,ccc%,lll%)
  1855.   IF LEN(aaa$)>lll%
  1856.     aaa$=LEFT$(aaa$,PRED(lll%))+CHR$(11)
  1857.   ENDIF
  1858.   GOSUB affchaine_notrans(aaa$,xxx%,yyy%,ccc%)
  1859. RETURN
  1860. PROCEDURE affiche_icone(nnn%,ttt%,xxxd%,yyyd%,ccc%)
  1861.   GOSUB cadre_texte3(divbn$(nnn%,ttt%),ADD(divbi&(0,nnn%,ttt%),xxxd%),ADD(divbi&(1,nnn%,ttt%),yyyd%),divbi&(2,nnn%,ttt%),divbi&(3,nnn%,ttt%),ccc%)
  1862. RETURN
  1863. PROCEDURE affiche_icone_b(nnn%,ttt%,xxxd%,yyyd%,ccc%)
  1864.   GOSUB cadre_texte3_b(divbn$(nnn%,ttt%),ADD(divbi&(0,nnn%,ttt%),xxxd%),ADD(divbi&(1,nnn%,ttt%),yyyd%),divbi&(2,nnn%,ttt%),divbi&(3,nnn%,ttt%),ccc%)
  1865. RETURN
  1866. PROCEDURE affiche_bloc_icones(dd%,nn%,tt%,xxd%,yyd%)
  1867.   LOCAL ii%
  1868.   FOR ii%=dd% TO ADD(dd%,PRED(nn%))
  1869.     GOSUB affiche_icone(ii%,tt%,xxd%,yyd%,0)
  1870.   NEXT ii%
  1871. RETURN
  1872. PROCEDURE affiche_bloc_icones_b(dd%,nn%,tt%,xxd%,yyd%)
  1873.   LOCAL ii%
  1874.   FOR ii%=dd% TO ADD(dd%,PRED(nn%))
  1875.     GOSUB affiche_icone_b(ii%,tt%,xxd%,yyd%,0)
  1876.   NEXT ii%
  1877. RETURN
  1878. PROCEDURE affiche_pattern(pat%,lig%,pre%)
  1879.   LOCAL a%,b%,xm%,ym%,km%
  1880.   a%=V:para_affiche_pattern$
  1881.   BMOVE V:preset&(0,pre%),ADD(a%,8),64
  1882.   CARD{ADD(a%,2)}=FN nbr_lines(pat%)
  1883.   CARD{ADD(a%,4)}=MIN(nbr_colonnes%(pre%),nbr_col%)
  1884.   b%=FN adr_pat(pat%)
  1885.   MOUSE xm%,ym%,km%
  1886.   IF xm%>23 AND ym%>153 AND ym%<ADD(170,MUL(haut_lig%,6))
  1887.     HIDEM
  1888.   ELSE
  1889.     SHOWM
  1890.   ENDIF
  1891.   ~C:g_affiche_pattern%(W:lig%,L:a%,L:b%,L:adr_af_pat%,W:curs_col%,W:curs_x%)
  1892.   SHOWM
  1893. RETURN
  1894. PROCEDURE affiche_c_pattern
  1895.   LOCAL a%,b%,xm%,ym%,km%
  1896.   a%=V:para_affiche_pattern$
  1897.   BMOVE V:preset&(0,n_preset%),ADD(a%,8),64
  1898.   CARD{ADD(a%,2)}=FN nbr_lines2(songpos%)
  1899.   CARD{ADD(a%,4)}=MIN(nbr_colonnes%(n_preset%),nbr_col%)
  1900.   b%=FN adr_pat(song&(songpos%))
  1901.   MOUSE xm%,ym%,km%
  1902.   IF xm%>23 AND ym%>153 AND ym%<ADD(170,MUL(haut_lig%,6))
  1903.     HIDEM
  1904.   ELSE
  1905.     SHOWM
  1906.   ENDIF
  1907.   ~C:g_affiche_pattern%(W:posligne%,L:a%,L:b%,L:adr_af_pat%,W:curs_col%,W:curs_x%)
  1908.   SHOWM
  1909. RETURN
  1910. PROCEDURE save_background(x%,y%,l%,h%)
  1911.   LOCAL i%,size%,adrinc%
  1912.   adrinc%=SHR(ADD(l%,15) AND -16,1)
  1913.   size%=MUL(adrinc%,h%)
  1914.   IF MALLOC(-1)>ADD(size%,8)
  1915.     adr_background%=MALLOC(ADD(size%,8))
  1916.     CARD{adr_background%}=x%
  1917.     CARD{ADD(adr_background%,2)}=y%
  1918.     CARD{ADD(adr_background%,4)}=l%
  1919.     CARD{ADD(adr_background%,6)}=h%
  1920.     a%=ADD(adr_background%,8)
  1921.     HIDEM
  1922.     FOR i%=0 TO PRED(h%)
  1923.       RC_COPY XBIOS(3),x%,ADD(y%,i%),l%,1 TO a%,0,0
  1924.       ADD a%,adrinc%
  1925.     NEXT i%
  1926.   ELSE
  1927.     adr_background%=0
  1928.   ENDIF
  1929. RETURN
  1930. PROCEDURE restore_background
  1931.   LOCAL i%,x%,y%,l%,h%,adrinc%
  1932.   IF adr_background%<>0
  1933.     x%=CARD{adr_background%}
  1934.     y%=CARD{ADD(adr_background%,2)}
  1935.     l%=CARD{ADD(adr_background%,4)}
  1936.     h%=CARD{ADD(adr_background%,6)}
  1937.     a%=ADD(adr_background%,8)
  1938.     adrinc%=SHR(ADD(l%,15) AND -16,1)
  1939.     HIDEM
  1940.     FOR i%=0 TO PRED(h%)
  1941.       RC_COPY a%,0,0,l%,1 TO XBIOS(3),x%,ADD(y%,i%)
  1942.       ADD a%,adrinc%
  1943.     NEXT i%
  1944.     ~MFREE(adr_background%)
  1945.     adr_background%=0
  1946.   ELSE
  1947.     GOSUB affiche_panneau_principal
  1948.   ENDIF
  1949. RETURN
  1950. '
  1951. ' Sous-menus du tracker
  1952. ' --------------------
  1953. PROCEDURE aff_nssmenu
  1954.   LOCAL iiii%
  1955.   FOR iiii%=1 TO 7
  1956.     IF ss_menu%=iiii%
  1957.       GOSUB affiche_icone_b(ADD(iiii%,9),24,0,0,-1)
  1958.     ELSE
  1959.       GOSUB affiche_icone(ADD(iiii%,9),24,0,0,0)
  1960.     ENDIF
  1961.   NEXT iiii%
  1962. RETURN
  1963. PROCEDURE affiche_icones_commande
  1964.   GOSUB affiche_bloc_icones(0,17,24,0,0)
  1965.   GOSUB grise_icone(3,24,0,0)                   ! Prefs
  1966.   GOSUB grise_icone(4,24,0,0)                   ! Score
  1967.   GOSUB grise_icone(8,24,0,0)                   ! Drum Editor
  1968.   GOSUB aff_nssmenu
  1969. RETURN
  1970. PROCEDURE gere_icones_haut
  1971.   LOCAL a%,b%,d%,i%,srt%
  1972.   LOCAL a$
  1973.   a%=V:divbi&(0,0,0)
  1974.   srt%=C:g_teste_icones%(L:a%,W:24,W:xm%,W:ym%)
  1975.   IF srt%>=0
  1976.     GOSUB affiche_icone(srt%,24,0,0,-1)
  1977.     GOSUB wait_mouse(TRUE)
  1978.     SELECT srt%
  1979.       ' ----------------------------------------------------------------------
  1980.     CASE 0      ! Play song
  1981.       GOSUB edit_mode_off
  1982.       IF km%=2
  1983.         GOSUB play_song(TRUE)
  1984.       ELSE
  1985.         GOSUB play_song(FALSE)
  1986.       ENDIF
  1987.       ' ----------------------------------------------------------------------
  1988.     CASE 1      ! Edit
  1989.       GOSUB edit_mode_on
  1990.       SLPOKE &HFFFF983C,&HFF            ! Bleu
  1991.       GOSUB aff_ps_pp_e
  1992.       GOSUB aff_message("Edit mode activated.")
  1993.       ' ----------------------------------------------------------------------
  1994.     CASE 5      ! Play pattern
  1995.       GOSUB edit_mode_off
  1996.       IF km%=2
  1997.         GOSUB play_pattern(TRUE)
  1998.       ELSE
  1999.         GOSUB play_pattern(FALSE)
  2000.       ENDIF
  2001.       ' ----------------------------------------------------------------------
  2002.     CASE 10     ! Disk
  2003.       ss_menu%=1
  2004.       GOSUB aff_nssmenu
  2005.       GOSUB affiche_icones_disk
  2006.       ' ----------------------------------------------------------------------
  2007.     CASE 11     ! Tools
  2008.       ss_menu%=2
  2009.       GOSUB aff_nssmenu
  2010.       GOSUB affiche_icones_tools
  2011.       ' ----------------------------------------------------------------------
  2012.     CASE 12     ! Instruments
  2013.       ss_menu%=3
  2014.       GOSUB aff_nssmenu
  2015.       GOSUB affiche_icones_instr
  2016.       ' ----------------------------------------------------------------------
  2017.     CASE 13     ! Samples
  2018.       ss_menu%=4
  2019.       GOSUB aff_nssmenu
  2020.       GOSUB affiche_icones_sample
  2021.       ' ----------------------------------------------------------------------
  2022.     CASE 14     ! Envelopes
  2023.       ss_menu%=5
  2024.       GOSUB aff_nssmenu
  2025.       GOSUB affiche_icones_enveloppe
  2026.       ' ----------------------------------------------------------------------
  2027.     CASE 15     ! Control
  2028.       ss_menu%=6
  2029.       GOSUB aff_nssmenu
  2030.       GOSUB affiche_icones_control
  2031.       ' ----------------------------------------------------------------------
  2032.     CASE 16     ! Midi
  2033.       ss_menu%=7
  2034.       GOSUB aff_nssmenu
  2035.       GOSUB affiche_icones_midi
  2036.       ' ----------------------------------------------------------------------
  2037.     DEFAULT
  2038.       ' Icones normales
  2039.       SELECT srt%
  2040.         ' --------------------------------------------------------------------
  2041.       CASE 2      ! Insert position
  2042.         IF FN song_length<256
  2043.           GOSUB stop_voices
  2044.           IF songpos%<PRED(FN song_length)
  2045.             FOR i%=PRED(FN song_length) DOWNTO songpos%
  2046.               song&(SUCC(i%))=song&(i%)
  2047.             NEXT i%
  2048.           ENDIF
  2049.           INC module&(101)
  2050.           IF FN song_repeat>songpos%
  2051.             INC module&(102)
  2052.           ENDIF
  2053.           INC songpos%
  2054.           IF km%=2        ! Clic droit  : Nouveau pattern inutilise
  2055.             a%=0
  2056.             i%=0
  2057.             REPEAT
  2058.               IF a%=song&(i%)
  2059.                 INC a%
  2060.                 i%=-1
  2061.               ENDIF
  2062.               INC i%
  2063.             UNTIL i%=>FN song_length
  2064.             song&(songpos%)=a%
  2065.             IF FN nbr_lines(a%)=1               ! Initialise la hauteur du pattern s'il est vide
  2066.               GOSUB bee(TRUE)
  2067.               b%=FN adr_pat(a%)
  2068.               i%=nbr_track%
  2069.               WHILE LONG{b%}=0 AND BYTE{ADD(b%,4)}=0 AND i%>0
  2070.                 DEC i%
  2071.                 ADD b%,5
  2072.               WEND
  2073.               IF i%=0
  2074.                 GOSUB change_pattern_high(a%,default_pattern_high%)
  2075.               ENDIF
  2076.               GOSUB bee(FALSE)
  2077.             ENDIF
  2078.           ENDIF
  2079.           a$=TRIM$(FN patternname$(song&(songpos%)))
  2080.           IF a$<>""
  2081.             a$=" ("+a$+")"
  2082.           ENDIF
  2083.           GOSUB aff_message("Pattern "+HEX$(song&(songpos%),2)+a$+" inserted at position "+HEX$(songpos%,2)+".")
  2084.           GOSUB affiche_info_song
  2085.           GOSUB affiche_c_pattern
  2086.         ENDIF
  2087.         ' --------------------------------------------------------------------
  2088.       CASE 3      ! Preferences
  2089.         ' Rien
  2090.         ' GOSUB prefs
  2091.         ' --------------------------------------------------------------------
  2092.       CASE 4      ! Score
  2093.         ' Rien
  2094.         ' --------------------------------------------------------------------
  2095.       CASE 6      ! Stop
  2096.         GOSUB edit_mode_off
  2097.         GOSUB stop_voices
  2098.         SLPOKE &HFFFF983C,&HFFFF00FF      ! Blanc
  2099.         GOSUB aff_ps_pp_e
  2100.         GOSUB aff_message("Song stopped and Edit mode deactivated.")
  2101.         ' --------------------------------------------------------------------
  2102.       CASE 7      ! Delete position
  2103.         IF songpos%<PRED(FN song_length)
  2104.           FOR i%=SUCC(songpos%) TO PRED(FN song_length)
  2105.             song&(PRED(i%))=song&(i%)
  2106.           NEXT i%
  2107.           DEC module&(101)
  2108.           song&(FN song_length)=0
  2109.           IF FN song_repeat>songpos%
  2110.             DEC module&(102)
  2111.           ENDIF
  2112.           GOSUB affiche_info_song
  2113.           GOSUB affiche_c_pattern
  2114.           GOSUB aff_message("Position "+HEX$(songpos%,2)+" deleted.")
  2115.         ENDIF
  2116.         ' --------------------------------------------------------------------
  2117.         ' CASE 8            ! Help
  2118.         ' GOSUB help(0)
  2119.       CASE 8            ! Drum Editor
  2120.         GOSUB drum_editor
  2121.         GOSUB affiche_panneau_principal
  2122.         ' --------------------------------------------------------------------
  2123.       CASE 9            ! Sample Editor
  2124.         GOSUB sample_editor
  2125.         GOSUB affiche_panneau_principal
  2126.         ' --------------------------------------------------------------------
  2127.       ENDSELECT
  2128.       GOSUB affiche_icone(srt%,24,0,0,0)
  2129.       GOSUB grise_icone(3,24,0,0)               ! Prefs
  2130.       GOSUB grise_icone(4,24,0,0)               ! Score
  2131.       GOSUB grise_icone(8,24,0,0)               ! Drum Editor
  2132.     ENDSELECT
  2133.     GOSUB wait_mouse(flag_relachement!)
  2134.     GOSUB vide_buffer_clavier
  2135.   ENDIF
  2136. RETURN
  2137. PROCEDURE gere_icones_panneaup
  2138.   LOCAL a%,b%,d%,h%,i%,srt%
  2139.   LOCAL flag_relachement!
  2140.   flag_relachement!=TRUE
  2141.   a%=V:divbi&(0,0,0)
  2142.   srt%=C:g_teste_icones%(L:a%,W:16,W:xm%,W:ym%)
  2143.   IF srt%>=0
  2144.     SELECT srt%
  2145.       ' Radio-boutons, Flip-flops ou champs de texte
  2146.       ' ----------------------------------------------------------------------
  2147.     CASE 12                     ! Numero d'instrument
  2148.       IF km%=2
  2149.         instr%=sample%
  2150.         ss_menu%=3
  2151.         GOSUB aff_nssmenu
  2152.         GOSUB affiche_icones_instr
  2153.         GOSUB affiche_info_sample
  2154.       ELSE
  2155.         d%=0
  2156.         GOSUB chg_instrument
  2157.       ENDIF
  2158.       ' ----------------------------------------------------------------------
  2159.     CASE 15                     ! Numero de sample
  2160.       IF km%=2
  2161.         sample%=FN isample(instr%,instr_note_pos%)
  2162.         ss_menu%=4
  2163.         GOSUB aff_nssmenu
  2164.         GOSUB affiche_icones_sample
  2165.         GOSUB affiche_info_sample
  2166.       ELSE
  2167.         d%=0
  2168.         GOSUB chg_sample
  2169.       ENDIF
  2170.       ' ----------------------------------------------------------------------
  2171.     CASE 0,3,6,9,18             ! Autres icones: Edition des numeros
  2172.       d%=0
  2173.       ON DIV(ADD(srt%,3),3) GOSUB chg_songpos,chg_pattern,chg_songlen,chg_songrep,rien,rien,chg_linestep
  2174.       ' ----------------------------------------------------------------------
  2175.     CASE 1,4,7,10,13,16,19      ! Numero +
  2176.       d%=1
  2177.       ON DIV(ADD(srt%,2),3) GOSUB chg_songpos,chg_pattern,chg_songlen,chg_songrep,chg_instrument,chg_sample,chg_linestep
  2178.       flag_relachement!=FALSE
  2179.       ' ----------------------------------------------------------------------
  2180.     CASE 2,5,8,11,14,17,20      ! Numero -
  2181.       d%=-1
  2182.       ON DIV(ADD(srt%,1),3) GOSUB chg_songpos,chg_pattern,chg_songlen,chg_songrep,chg_instrument,chg_sample,chg_linestep
  2183.       flag_relachement!=FALSE
  2184.       ' ----------------------------------------------------------------------
  2185.     CASE 21                     ! Songname
  2186.       GOSUB edite_chaine(FN songname$,ADD(divbi&(0,srt%,16),9),ADD(divbi&(1,srt%,16),2),32,0)
  2187.       BMOVE V:bbbb$,V:module&(2),32
  2188.       GOSUB affiche_info_song
  2189.       ' ----------------------------------------------------------------------
  2190.     CASE 22                     ! Instrname
  2191.       GOSUB edite_chaine(FN instrname$(instr%),ADD(divbi&(0,srt%,16),9),ADD(divbi&(1,srt%,16),2),28,0)
  2192.       GOSUB chg_instrname(bbbb$,instr%)
  2193.       GOSUB affiche_info_song
  2194.       ' ----------------------------------------------------------------------
  2195.     CASE 23                     ! Track
  2196.       GOSUB edite_chaine(STR$(nbr_track%,2),ADD(divbi&(0,srt%,16),7),ADD(divbi&(1,srt%,16),2),2,2)
  2197.       a%=MAX(MIN(VAL(bbbb$),32),1)
  2198.       IF a%<>nbr_track%
  2199.         GOSUB change_format(a%)
  2200.       ELSE
  2201.         GOSUB affiche_panneau_principal
  2202.       ENDIF
  2203.       ' ----------------------------------------------------------------------
  2204.     CASE 24                     ! Lines
  2205.       a%=song&(songpos%)
  2206.       IF km%=1
  2207.         GOSUB edite_chaine(STR$(FN nbr_lines(a%),3),ADD(divbi&(0,srt%,16),6),ADD(divbi&(1,srt%,16),2),3,2)
  2208.         h%=MAX(MIN(VAL(bbbb$),256),1)
  2209.         GOSUB bee(TRUE)
  2210.         GOSUB change_pattern_high(song&(songpos%),h%)
  2211.       ELSE                                      ! Initialise la hauteur du pattern avec la valeur predefinie
  2212.         GOSUB bee(TRUE)
  2213.         GOSUB change_pattern_high(a%,default_pattern_high%)
  2214.       ENDIF
  2215.       GOSUB affiche_info_song
  2216.       GOSUB affiche_c_pattern
  2217.       GOSUB bee(FALSE)
  2218.       ' ----------------------------------------------------------------------
  2219.     CASE 25                     ! Horloge
  2220.       debut_temps%=TIMER
  2221.       GOSUB affiche_temps
  2222.       ' ----------------------------------------------------------------------
  2223.     CASE 27                     ! Preset
  2224.       ' Rien
  2225.       ' ----------------------------------------------------------------------
  2226.     CASE 3,4                    ! Prefs & Score
  2227.       ' Rien
  2228.       ' ----------------------------------------------------------------------
  2229.     DEFAULT
  2230.       ' Icones normales
  2231.       GOSUB affiche_icone(srt%,16,0,0,-1)
  2232.       ' GOSUB wait_mouse(TRUE)
  2233.       SELECT srt%
  2234.         ' --------------------------------------------------------------------
  2235.       CASE 26                   ! ON/OFF
  2236.         IF km%=1                        ! Bouton gauche : toutes les voies ON
  2237.           GOSUB all_track_on(TRUE)
  2238.         ELSE                            ! Bouton droit : inversion de l'etat de chaque voie
  2239.           FOR i%=0 TO PRED(nbr_track%)
  2240.             GOSUB chg_track_onoff(i%,ABS(SGN(FN track_onoff(i%))) XOR 1)
  2241.             GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  2242.           NEXT i%
  2243.         ENDIF
  2244.         GOSUB affiche_info_preset
  2245.         ' --------------------------------------------------------------------
  2246.       ENDSELECT
  2247.       GOSUB affiche_icone(srt%,16,0,0,0)
  2248.     ENDSELECT
  2249.     GOSUB wait_mouse(flag_relachement!)
  2250.     GOSUB vide_buffer_clavier
  2251.   ENDIF
  2252. RETURN
  2253. ' Disk
  2254. PROCEDURE affiche_icones_disk
  2255.   LOCAL i%
  2256.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2257.   GOSUB affiche_bloc_icones_b(0,16,0,0,0)
  2258.   GOSUB cadre_ext(ADD(divbi&(0,8,0),8),ADD(divbi&(1,8,0),2),15,5,0,13,12,14)
  2259.   GOSUB cadre_ext(SUCC(divbi&(0,9,0)),ADD(divbi&(1,9,0),2),SUB(divbi&(2,9,0),2),5,0,13,12,14)
  2260.   GOSUB cadre_ext(ADD(divbi&(0,10,0),12),ADD(divbi&(1,10,0),2),4,5,0,13,12,14)
  2261.   GOSUB affchaine_trans("SAVE CONF",134,82,14)
  2262.   GOSUB grise_icone(4,0,0,0)
  2263.   GOSUB grise_icone(5,0,0,0)
  2264.   GOSUB grise_icone(6,0,0,0)
  2265.   GOSUB grise_icone(7,0,0,0)
  2266.   GOSUB affiche_icones_diskb
  2267. RETURN
  2268. PROCEDURE affiche_icones_diskb
  2269.   LOCAL a$,b$
  2270.   SELECT path_displayed%
  2271.   CASE 0
  2272.     a$=npath_prog$
  2273.     b$="System"
  2274.   CASE 1
  2275.     a$=npath_module$+nfile_module$
  2276.     b$="Module"
  2277.   CASE 2
  2278.     a$=npath_prefs$+nfile_prefs$
  2279.     b$="Preferences"
  2280.   CASE 3
  2281.     a$=npath_sample$+nfile_sample$
  2282.     b$="Sample # "+HEX$(sample%,2)
  2283.   CASE 4
  2284.     a$=npath_sample$
  2285.     b$="Instrument # "+HEX$(instr%,2)
  2286.   CASE 5
  2287.     a$=npath_autoload$
  2288.     b$="Autoload"
  2289.   CASE 6
  2290.     a$=npath_div$
  2291.     b$="Miscellaneous"
  2292.   ENDSELECT
  2293.   IF LEN(a$)<58
  2294.     a$=a$+SPACE$(SUB(58,LEN(a$)))
  2295.   ENDIF
  2296.   b$=b$+SPACE$(SUB(16,LEN(b$)))
  2297.   GOSUB affchaine_notrans(b$,ADD(divbi&(0,8,0),8),ADD(divbi&(1,8,0),2),1)
  2298.   GOSUB affchaine_tronque(a$,SUCC(divbi&(0,9,0)),ADD(divbi&(1,9,0),2),1,SUB(divbi&(2,9,0),1))
  2299.   a$=SPACE$(SUB(5,LEN(next_module$)))+next_module$
  2300.   GOSUB affchaine_notrans(a$,ADD(divbi&(0,10,0),12),ADD(divbi&(1,10,0),2),1)
  2301.   GOSUB affiche_icone_b(16,0,0,0,flag_gt2cnf!)
  2302. RETURN
  2303. PROCEDURE gere_icones_disk
  2304.   LOCAL a%,srt%
  2305.   LOCAL a$
  2306.   a%=V:divbi&(0,0,0)
  2307.   srt%=C:g_teste_icones%(L:a%,W:0,W:xm%,W:ym%)
  2308.   ~FRE(0)
  2309.   SELECT srt%
  2310.     ' ------------------------------------------------------------------------
  2311.   CASE 0 TO 7,11 TO 15
  2312.     GOSUB affiche_icone_b(srt%,0,0,0,1)
  2313.     GOSUB wait_mouse(TRUE)
  2314.     IF srt%<=7
  2315.       ON SUCC(srt%) GOSUB load_module,save_module,load_prefs,save_prefs,rien,rien,rien,rien
  2316.     ELSE
  2317.       ON SUB(srt%,10) GOSUB make_directory,delete_directory,rename_file,delete_file,format_disk
  2318.     ENDIF
  2319.     GOSUB affiche_icone_b(srt%,0,0,0,0)
  2320.     ' ------------------------------------------------------------------------
  2321.   CASE 8
  2322.     a%=FN popup(2,path_displayed%,MOUSEX,MOUSEY)
  2323.     IF a%>=0
  2324.       path_displayed%=a% AND &HFFFF
  2325.     ENDIF
  2326.     GOSUB affiche_icones_diskb
  2327.     ' ------------------------------------------------------------------------
  2328.   CASE 9
  2329.     ON SUCC(path_displayed%) GOSUB rien,selpath_module,selpath_prefs,selpath_sample,selpath_sample,selpath_autoload,rien
  2330.     GOSUB affiche_icones_diskb
  2331.     ' ------------------------------------------------------------------------
  2332.   CASE 10
  2333.     ' That's right, people, he uses 'a$' as a global variable. /sjx
  2334.     a$="GT2GTKMODS3MDTMMMDMTM669ULTXM  *  "
  2335.     a%=INSTR(a$,RIGHT$(next_module$,SUB(LEN(next_module$),INSTR(next_module$,"."))))
  2336.     IF a%>0
  2337.       a%=DIV(PRED(a%),3)
  2338.     ELSE
  2339.       a%=-1
  2340.     ENDIF
  2341.     a%=FN popup(0,a%,MOUSEX,MOUSEY)
  2342.     IF a%>=0
  2343.       a%=a% AND &HFFFF
  2344.       next_module$="*."+TRIM$(MID$(a$,SUCC(MUL(a%,3)),3))
  2345.     ENDIF
  2346.     GOSUB affiche_icones_diskb
  2347.     ' ------------------------------------------------------------------------
  2348.   CASE 16
  2349.     flag_gt2cnf!=NOT flag_gt2cnf!
  2350.     GOSUB affiche_icones_diskb
  2351.     GOSUB wait_mouse(TRUE)
  2352.     ' ------------------------------------------------------------------------
  2353.   ENDSELECT
  2354. RETURN
  2355. ' Tools
  2356. PROCEDURE affiche_icones_tools
  2357.   LOCAL i%
  2358.   IF ss_menut%=2
  2359.     GOSUB affiche_icones_tools2
  2360.   ELSE IF ss_menut%=3
  2361.     GOSUB affiche_icones_tools3
  2362.   ELSE
  2363.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2364.     GOSUB cadre_int(20,35,11,39,13,13,14,12)
  2365.     GOSUB cadre_int(32,35,27,39,13,13,14,12)
  2366.     GOSUB cadre_int(60,35,9,39,13,13,14,12)
  2367.     GOSUB cadre_int(70,35,9,43,13,13,14,12)
  2368.     GOSUB cadre_int(20,75,41,29,13,13,14,12)
  2369.     GOSUB affiche_bloc_icones_b(0,9,1,0,0)
  2370.     GOSUB affiche_bloc_icones_b(16,7,1,0,0)
  2371.     GOSUB cadre_ext(ADD(divbi&(0,16,1),11),ADD(divbi&(1,16,1),2),10,5,0,13,12,14)
  2372.     GOSUB cadre_ext(ADD(divbi&(0,17,1),11),ADD(divbi&(1,17,1),2),10,5,0,13,12,14)
  2373.     GOSUB cadre_ext(ADD(divbi&(0,18,1),9),ADD(divbi&(1,18,1),2),5,5,0,13,12,14)
  2374.     GOSUB affchaine_trans("BLOCK",42,37,14)
  2375.     GOSUB affchaine_trans("ACTION",106,37,14)
  2376.     GOSUB affchaine_trans("CLEAR",SHL(divbi&(0,19,1),1),SUB(divbi&(1,19,1),8),14)
  2377.     GOSUB affiche_icones_toolsb
  2378.   ENDIF
  2379. RETURN
  2380. PROCEDURE affiche_icones_toolsb
  2381.   LOCAL a%,b%,c%,d%,i%,x1%,x2%,x3%,y1%,y2%,y3%,a1%,a2%,b1%,b2%
  2382.   IF ss_menut%=2
  2383.     GOSUB affiche_icones_toolsb2
  2384.   ELSE IF ss_menut%=3
  2385.     GOSUB affiche_icones_toolsb3
  2386.   ELSE
  2387.     GOSUB affiche_icone_b(9,1,0,0,replaceblock%=0)
  2388.     GOSUB affiche_icone_b(12,1,0,0,replaceblock%=1)
  2389.     GOSUB affiche_icone_b(10,1,0,0,maskblock%=0)
  2390.     GOSUB affiche_icone_b(13,1,0,0,maskblock%=1)
  2391.     GOSUB affiche_icone_b(11,1,0,0,trackpat%=0)
  2392.     GOSUB affiche_icone_b(14,1,0,0,trackpat%=1)
  2393.     GOSUB affiche_icone_b(15,1,0,0,trackpat%=2)
  2394.     GOSUB affiche_icone_b(23,1,0,0,bl_flagsong!)
  2395.     x1%=ADD(divbi&(0,16,1),11)
  2396.     y1%=ADD(divbi&(1,16,1),2)
  2397.     x2%=ADD(divbi&(0,17,1),11)
  2398.     y2%=ADD(divbi&(1,17,1),2)
  2399.     x3%=ADD(divbi&(0,18,1),9)
  2400.     y3%=ADD(divbi&(1,18,1),2)
  2401.     a1%=V:bl_maska1$
  2402.     a2%=V:bl_maska2$
  2403.     b1%=V:bl_maskb1$
  2404.     b2%=V:bl_maskb2$
  2405.     IF BYTE{a1%}=0
  2406.       GOSUB affchaine_notrans("?  ",x1%,y1%,1)
  2407.     ELSE
  2408.       IF BYTE{a2%}=0
  2409.         GOSUB affchaine_notrans("---",x1%,y1%,1)
  2410.       ELSE
  2411.         GOSUB affchaine_notrans(MID$(gamme$,SUCC(SHL(BYTE{a2%} MOD 12,1)),2)+STR$(SUB(DIV(BYTE{a2%},12),2),1),x1%,y1%,1)
  2412.       ENDIF
  2413.     ENDIF
  2414.     IF BYTE{b1%}=255
  2415.       GOSUB affchaine_notrans("?  ",x2%,y2%,1)
  2416.     ELSE
  2417.       IF BYTE{b2%}=0
  2418.         GOSUB affchaine_notrans("---",x2%,y2%,1)
  2419.       ELSE
  2420.         GOSUB affchaine_notrans(MID$(gamme$,SUCC(SHL(BYTE{b2%} MOD 12,1)),2)+STR$(SUB(DIV(BYTE{b2%},12),2),1),x2%,y2%,1)
  2421.       ENDIF
  2422.     ENDIF
  2423.     a1%=LONG{SUCC(a1%)}
  2424.     a2%=LONG{SUCC(a2%)}
  2425.     b1%=LONG{SUCC(b1%)}
  2426.     b2%=LONG{SUCC(b2%)}
  2427.     FOR i%=0 TO 7
  2428.       IF (SHL(a1%,SHL(i%,2)) AND &H0)=&H0
  2429.         GOSUB affchaine_notrans("?",ADD(ADD(x1%,i%),3),y1%,1)
  2430.       ELSE
  2431.         GOSUB affchaine_notrans(HEX$(SHR(a2%,SUB(28,SHL(i%,2))) AND 15,1),ADD(ADD(x1%,i%),3),y1%,1)
  2432.       ENDIF
  2433.       IF (SHL(b1%,SHL(i%,2)) AND &H0)=&H0
  2434.         GOSUB affchaine_notrans("?",ADD(ADD(x2%,i%),3),y2%,1)
  2435.       ELSE
  2436.         GOSUB affchaine_notrans(HEX$(SHR(b2%,SUB(28,SHL(i%,2))) AND 15,1),ADD(ADD(x2%,i%),3),y2%,1)
  2437.       ENDIF
  2438.       IF i%<6
  2439.         IF (SHL(ext_note1%,SHL(i%,2)) AND &HF00000)=&HF00000
  2440.           GOSUB affchaine_notrans("?",ADD(x3%,i%),y3%,1)
  2441.         ELSE
  2442.           GOSUB affchaine_notrans(HEX$(SHR(ext_note2%,SUB(20,SHL(i%,2))) AND 15,1),ADD(x3%,i%),y3%,1)
  2443.         ENDIF
  2444.       ENDIF
  2445.     NEXT i%
  2446.   ENDIF
  2447. RETURN
  2448. PROCEDURE gere_icones_tools
  2449.   LOCAL a%,b%,c%,d%,i%,srt%
  2450.   IF ss_menut%=2
  2451.     GOSUB gere_icones_tools2
  2452.   ELSE IF ss_menut%=3
  2453.     GOSUB gere_icones_tools3
  2454.   ELSE
  2455.     a%=V:divbi&(0,0,0)
  2456.     srt%=C:g_teste_icones%(L:a%,W:1,W:xm%,W:ym%)
  2457.     IF srt%=>0
  2458.       SELECT srt%
  2459.         ' --------------------------------------------------------------------
  2460.       CASE 9
  2461.         replaceblock%=0
  2462.         GOSUB affiche_icones_toolsb
  2463.         ' --------------------------------------------------------------------
  2464.       CASE 10
  2465.         maskblock%=0
  2466.         GOSUB affiche_icones_toolsb
  2467.         ' --------------------------------------------------------------------
  2468.       CASE 11
  2469.         trackpat%=0
  2470.         GOSUB affiche_icones_toolsb
  2471.         ' --------------------------------------------------------------------
  2472.       CASE 12
  2473.         replaceblock%=1
  2474.         GOSUB affiche_icones_toolsb
  2475.         ' --------------------------------------------------------------------
  2476.       CASE 13
  2477.         maskblock%=1
  2478.         GOSUB affiche_icones_toolsb
  2479.         ' --------------------------------------------------------------------
  2480.       CASE 14
  2481.         trackpat%=1
  2482.         GOSUB affiche_icones_toolsb
  2483.         ' --------------------------------------------------------------------
  2484.       CASE 15
  2485.         trackpat%=2
  2486.         GOSUB affiche_icones_toolsb
  2487.         ' --------------------------------------------------------------------
  2488.       CASE 16       ! Mask on
  2489.         GOSUB edite_mask1(bl_maska1$,bl_maska2$,ADD(divbi&(0,16,1),11),ADD(divbi&(1,16,1),2),0,0)
  2490.         bl_maska1$=zzzz1$
  2491.         bl_maska2$=zzzz2$
  2492.         ' --------------------------------------------------------------------
  2493.       CASE 17       ! Replace by
  2494.         GOSUB edite_mask1(bl_maskb1$,bl_maskb2$,ADD(divbi&(0,17,1),11),ADD(divbi&(1,17,1),2),-1,0)
  2495.         bl_maskb1$=zzzz1$
  2496.         bl_maskb2$=zzzz2$
  2497.         ' --------------------------------------------------------------------
  2498.       CASE 18       ! Ext note
  2499.         GOSUB edite_mask1(CHR$(0)+MKL$(ext_note1%),CHR$(0)+MKL$(ext_note2%),ADD(divbi&(0,18,1),9),ADD(divbi&(1,18,1),2),-1,1)
  2500.         ext_note1%=LONG{SUCC(V:zzzz1$)} AND &HFFFFFF
  2501.         ext_note2%=LONG{SUCC(V:zzzz2$)} AND &HFFFFFF
  2502.         ' --------------------------------------------------------------------
  2503.       CASE 19       ! Clear song
  2504.         GOSUB dialog("CLEAR SONG","Do you really want|to do that ?","Ok|Cancel",MOUSEX,MOUSEY)
  2505.         IF bouton%=0
  2506.           GOSUB aff_message("Clearing song & patterns...")
  2507.           GOSUB bee(TRUE)
  2508.           GOSUB clear_song(TRUE)
  2509.           GOSUB aff_message("Song cleared.")
  2510.           GOSUB bee(FALSE)
  2511.           GOSUB affiche_info_song
  2512.           GOSUB affiche_info_preset
  2513.         ENDIF
  2514.         ' --------------------------------------------------------------------
  2515.       CASE 20       ! Clear instr
  2516.         GOSUB dialog("CLEAR SAMPLES","Do you really want|to clear your samples,|instruments and envelopes ?","Ok|Cancel",MOUSEX,MOUSEY)
  2517.         IF bouton%=0
  2518.           GOSUB aff_message("Clearing samples...")
  2519.           GOSUB bee(TRUE)
  2520.           GOSUB clear_instr
  2521.           GOSUB aff_message("Clearing instruments & envelopes...")
  2522.           GOSUB bee(TRUE)
  2523.           GOSUB clear_samples
  2524.           GOSUB aff_message("Samples cleared.")
  2525.           GOSUB bee(FALSE)
  2526.           GOSUB affiche_info_song
  2527.           GOSUB affiche_info_sample
  2528.         ENDIF
  2529.         ' --------------------------------------------------------------------
  2530.       CASE 21       ! Clear all
  2531.         GOSUB dialog("CLEAR ALL","Do you really want|to clear all your module ?","Ok|Cancel",MOUSEX,MOUSEY)
  2532.         IF bouton%=0
  2533.           GOSUB aff_message("Clearing song & patterns...")
  2534.           GOSUB bee(TRUE)
  2535.           GOSUB clear_song(TRUE)
  2536.           GOSUB aff_message("Clearing samples...")
  2537.           GOSUB bee(TRUE)
  2538.           GOSUB clear_samples
  2539.           GOSUB aff_message("Clearing instruments & envelopes...")
  2540.           GOSUB bee(TRUE)
  2541.           GOSUB clear_instr
  2542.           GOSUB aff_message("Module cleared.")
  2543.           GOSUB bee(FALSE)
  2544.           GOSUB affiche_info_song
  2545.           GOSUB affiche_info_sample
  2546.           GOSUB affiche_info_preset
  2547.         ENDIF
  2548.         ' --------------------------------------------------------------------
  2549.       CASE 22       ! Page suivante
  2550.         GOSUB affiche_icone_b(srt%,1,0,0,1)
  2551.         GOSUB wait_mouse(TRUE)
  2552.         ss_menut%=2
  2553.         GOSUB affiche_icones_tools2
  2554.         ' --------------------------------------------------------------------
  2555.       CASE 23       ! Operations sur la song entiere
  2556.         bl_flagsong!=NOT bl_flagsong!
  2557.         GOSUB affiche_icones_toolsb
  2558.         GOSUB wait_mouse(TRUE)      ! Flip-flop alors on attend un relâchement
  2559.         ' --------------------------------------------------------------------
  2560.       DEFAULT
  2561.         GOSUB affiche_icone_b(srt%,1,0,0,1)
  2562.         GOSUB wait_mouse(TRUE)
  2563.         SELECT srt%
  2564.           ' ------------------------------------------------------------------
  2565.         CASE 0
  2566.           GOSUB block_start
  2567.           GOSUB affiche_c_pattern
  2568.           ' ------------------------------------------------------------------
  2569.         CASE 1
  2570.           GOSUB bee(TRUE)
  2571.           GOSUB paste_block
  2572.           GOSUB bee(FALSE)
  2573.           GOSUB affiche_c_pattern
  2574.           SELECT trackpat%
  2575.           CASE 0
  2576.             GOSUB aff_message("Track pasted.")
  2577.           CASE 1
  2578.             GOSUB aff_message("Pattern pasted.")
  2579.           CASE 2
  2580.             GOSUB aff_message("Preset pasted.")
  2581.           ENDSELECT
  2582.           ' ------------------------------------------------------------------
  2583.         CASE 2
  2584.           GOSUB bee(TRUE)
  2585.           GOSUB clear_block
  2586.           GOSUB bee(FALSE)
  2587.           GOSUB affiche_c_pattern
  2588.           SELECT trackpat%
  2589.           CASE 0
  2590.             GOSUB aff_message("Track cleared.")
  2591.           CASE 1
  2592.             GOSUB aff_message("Pattern cleared.")
  2593.           CASE 2
  2594.             GOSUB aff_message("Preset cleared.")
  2595.           ENDSELECT
  2596.           ' ------------------------------------------------------------------
  2597.         CASE 3
  2598.           GOSUB bee(TRUE)
  2599.           IF km%=2
  2600.             FOR i%=0 TO 11
  2601.               GOSUB note_up_general             ! Octave Up
  2602.             NEXT i%
  2603.           ELSE
  2604.             GOSUB note_up_general
  2605.           ENDIF
  2606.           GOSUB bee(FALSE)
  2607.           GOSUB affiche_c_pattern
  2608.           ' ------------------------------------------------------------------
  2609.         CASE 4
  2610.           GOSUB block_end
  2611.           GOSUB affiche_c_pattern
  2612.           ' ------------------------------------------------------------------
  2613.         CASE 5
  2614.           GOSUB bee(TRUE)
  2615.           GOSUB insert_block
  2616.           GOSUB bee(FALSE)
  2617.           GOSUB affiche_c_pattern
  2618.           SELECT trackpat%
  2619.           CASE 0
  2620.             GOSUB aff_message("Track inserted.")
  2621.           CASE 1
  2622.             GOSUB aff_message("Pattern inserted.")
  2623.           CASE 2
  2624.             GOSUB aff_message("Preset inserted.")
  2625.           ENDSELECT
  2626.           ' ------------------------------------------------------------------
  2627.         CASE 6
  2628.           GOSUB bee(TRUE)
  2629.           GOSUB delete_block
  2630.           GOSUB bee(FALSE)
  2631.           GOSUB affiche_c_pattern
  2632.           SELECT trackpat%
  2633.           CASE 0
  2634.             GOSUB aff_message("Track deleted.")
  2635.           CASE 1
  2636.             GOSUB aff_message("Pattern deleted.")
  2637.           CASE 2
  2638.             GOSUB aff_message("Preset deleted.")
  2639.           ENDSELECT
  2640.           ' ------------------------------------------------------------------
  2641.         CASE 7
  2642.           GOSUB bee(TRUE)
  2643.           IF km%=2
  2644.             FOR i%=0 TO 11
  2645.               GOSUB note_down_general
  2646.             NEXT i%
  2647.           ELSE
  2648.             GOSUB note_down_general
  2649.           ENDIF
  2650.           GOSUB bee(FALSE)
  2651.           GOSUB affiche_c_pattern
  2652.           ' ------------------------------------------------------------------
  2653.         CASE 8
  2654.           GOSUB bee(TRUE)
  2655.           GOSUB swap_block
  2656.           GOSUB bee(FALSE)
  2657.           GOSUB affiche_c_pattern
  2658.           GOSUB aff_message("Track swapped.")
  2659.           ' ------------------------------------------------------------------
  2660.         ENDSELECT
  2661.         GOSUB affiche_icone_b(srt%,1,0,0,0)
  2662.       ENDSELECT
  2663.     ENDIF
  2664.   ENDIF
  2665. RETURN
  2666. PROCEDURE affiche_icones_tools2
  2667.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2668.   GOSUB cadre_int(20,35,19,69,13,13,14,12)
  2669.   GOSUB affiche_bloc_icones_b(0,11,11,0,0)
  2670.   GOSUB affchaine_trans("ECHO",42,37,14)
  2671.   GOSUB cadre_ext(ADD(divbi&(0,3,11),6),ADD(divbi&(1,3,11),2),1,5,0,13,12,14)
  2672.   GOSUB cadre_ext(ADD(divbi&(0,7,11),10),ADD(divbi&(1,7,11),2),2,5,0,13,12,14)
  2673.   GOSUB cadre_ext(ADD(divbi&(0,9,11),10),ADD(divbi&(1,9,11),2),2,5,0,13,12,14)
  2674.   GOSUB affiche_icones_toolsb2
  2675. RETURN
  2676. PROCEDURE affiche_icones_toolsb2
  2677.   GOSUB affiche_icone_b(2,11,0,0,bl_echo_cont!)
  2678.   GOSUB affiche_icone_b(6,11,0,0,bl_echo_fdbk!)
  2679.   GOSUB affiche_icone_b(8,11,0,0,NOT bl_echo_fdbk!)
  2680.   GOSUB affchaine_notrans(HEX$(bl_echo_lines%,2),ADD(divbi&(0,3,11),6),ADD(divbi&(1,3,11),2),1)
  2681.   GOSUB affchaine_notrans(STR$(bl_echo_feedback%,3),ADD(divbi&(0,7,11),10),ADD(divbi&(1,7,11),2),1)
  2682.   GOSUB affchaine_notrans("-"+HEX$(bl_echo_fadestep%,2),ADD(divbi&(0,9,11),10),ADD(divbi&(1,9,11),2),1)
  2683. RETURN
  2684. PROCEDURE gere_icones_tools2
  2685.   ' Les autres var. locales sont dans le tools1
  2686.   LOCAL flag_relachement!
  2687.   flag_relachement!=TRUE
  2688.   a%=V:divbi&(0,0,0)
  2689.   srt%=C:g_teste_icones%(L:a%,W:11,W:xm%,W:ym%)
  2690.   IF srt%>=0
  2691.     SELECT srt%
  2692.       ' Radio-boutons, Flip-flops ou champs de texte
  2693.       ' ----------------------------------------------------------------------
  2694.     CASE 2
  2695.       bl_echo_cont!=NOT bl_echo_cont!
  2696.       GOSUB affiche_icones_toolsb2
  2697.       ' ----------------------------------------------------------------------
  2698.     CASE 3              ! Lines
  2699.       GOSUB edite_chaine(HEX$(bl_echo_lines%,2),ADD(divbi&(0,3,11),6),ADD(divbi&(1,3,11),2),2,1)
  2700.       bl_echo_lines%=MIN(MAX(VAL("$"+bbbb$),1),&HFF)
  2701.       GOSUB affiche_icones_toolsb2
  2702.       ' ----------------------------------------------------------------------
  2703.     CASE 4,5            ! Lines +/-
  2704.       bl_echo_lines%=MIN(MAX(ADD(bl_echo_lines%,SUB(9,SHL(srt%,1))),1),&HFF)
  2705.       PAUSE SUB(6,SHL(km%,1))
  2706.       GOSUB affiche_icones_toolsb2
  2707.       flag_relachement!=FALSE
  2708.       ' ----------------------------------------------------------------------
  2709.     CASE 6              ! Flag feedback
  2710.       bl_echo_fdbk!=TRUE
  2711.       GOSUB affiche_icones_toolsb2
  2712.       ' ----------------------------------------------------------------------
  2713.     CASE 8              ! Flag fade
  2714.       bl_echo_fdbk!=FALSE
  2715.       GOSUB affiche_icones_toolsb2
  2716.       ' ----------------------------------------------------------------------
  2717.     CASE 7              ! Feedback
  2718.       GOSUB edite_chaine(STR$(bl_echo_feedback%,3),ADD(divbi&(0,7,11),10),ADD(divbi&(1,7,11),2),3,2)
  2719.       bl_echo_feedback%=MIN(MAX(VAL(bbbb$),1),100)
  2720.       GOSUB affiche_icones_toolsb2
  2721.       ' ----------------------------------------------------------------------
  2722.     CASE 9              ! Fade
  2723.       GOSUB edite_chaine(HEX$(bl_echo_fadestep%,2),ADD(divbi&(0,9,11),11),ADD(divbi&(1,9,11),2),2,1)
  2724.       bl_echo_fadestep%=MIN(MAX(VAL("$"+bbbb$),0),&HFF)
  2725.       GOSUB affiche_icones_toolsb2
  2726.       ' ----------------------------------------------------------------------
  2727.     DEFAULT
  2728.       ' Icones normales
  2729.       GOSUB affiche_icone_b(srt%,11,0,0,-1)
  2730.       GOSUB wait_mouse(TRUE)
  2731.       SELECT srt%
  2732.         ' --------------------------------------------------------------------
  2733.       CASE 0            ! .../...
  2734.         ss_menut%=3
  2735.         ' --------------------------------------------------------------------
  2736.       CASE 1            ! Echo
  2737.         GOSUB echo_block
  2738.         GOSUB affiche_c_pattern
  2739.         ' --------------------------------------------------------------------
  2740.       CASE 10           ! Volume slide
  2741.         GOSUB volume_slide(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  2742.         GOSUB affiche_c_pattern
  2743.         ' --------------------------------------------------------------------
  2744.       ENDSELECT
  2745.       GOSUB affiche_icone_b(srt%,11,0,0,0)
  2746.     ENDSELECT
  2747.     GOSUB wait_mouse(flag_relachement!)
  2748.     GOSUB vide_buffer_clavier
  2749.     IF ss_menut%=3
  2750.       GOSUB affiche_icones_tools3
  2751.     ENDIF
  2752.   ENDIF
  2753. RETURN
  2754. PROCEDURE affiche_icones_tools3
  2755.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2756.   GOSUB affiche_bloc_icones_b(0,6,18,0,0)
  2757.   GOSUB cadre_ext(divbi&(0,6,18),divbi&(1,6,18),21,59,0,13,12,14)
  2758.   GOSUB affchaine_trans("SONG",88,87,14)
  2759.   GOSUB affiche_icones_toolsb3
  2760. RETURN
  2761. PROCEDURE affiche_icones_toolsb3
  2762.   ' Var. locales de toolsb1
  2763.   song_list_pos%=MAX(MIN(song_list_pos%,SUB(FN song_length,10)),0)
  2764.   b%=song_list_pos%
  2765.   FOR a%=0 TO 9
  2766.     IF b%=songpos%
  2767.       c%=2
  2768.     ELSE
  2769.       c%=1
  2770.     ENDIF
  2771.     d%=32
  2772.     IF b%=FN song_repeat
  2773.       d%=253
  2774.     ENDIF
  2775.     IF b%<FN song_length
  2776.       GOSUB affchaine_notrans(HEX$(b%,2)+CHR$(d%)+HEX$(song&(b%),2)+" "+FN patternname$(song&(b%)),divbi&(0,ADD(a%,6),18),divbi&(1,ADD(a%,6),18),c%)
  2777.     ELSE
  2778.       GOSUB affchaine_notrans(SPACE$(22),divbi&(0,ADD(a%,6),18),divbi&(1,ADD(a%,6),18),1)
  2779.     ENDIF
  2780.     INC b%
  2781.   NEXT a%
  2782. RETURN
  2783. PROCEDURE gere_icones_tools3
  2784.   ' Les autres var. locales sont dans tools1
  2785.   flag_relachement!=TRUE
  2786.   a%=V:divbi&(0,0,0)
  2787.   srt%=C:g_teste_icones%(L:a%,W:18,W:xm%,W:ym%)
  2788.   IF srt%>=0
  2789.     SELECT srt%
  2790.       ' Radio-boutons, Flip-flops ou champs de texte
  2791.       ' ----------------------------------------------------------------------
  2792.     CASE 0              ! .../...
  2793.       ' /sjx - there was a cosmetic bug here -- sorted
  2794.       GOSUB affiche_icone_b(srt%,18,0,0,-1)
  2795.       GOSUB wait_mouse(TRUE)
  2796.       ss_menut%=1
  2797.       GOSUB affiche_icones_tools
  2798.       ' ----------------------------------------------------------------------
  2799.     CASE 1              ! Up
  2800.       song_list_pos%=MAX(SUB(song_list_pos%,SUB(km%,MUL(km%=3,7))),0)       ! Pas de -1, -2 et -10
  2801.       GOSUB affiche_icones_toolsb3
  2802.       flag_relachement!=FALSE
  2803.       ' ----------------------------------------------------------------------
  2804.     CASE 2              ! Down
  2805.       song_list_pos%=MAX(MIN(ADD(song_list_pos%,SUB(km%,MUL(km%=3,7))),SUB(FN song_length,10)),0)       ! Pas de 1, 2 et 10
  2806.       GOSUB affiche_icones_toolsb3
  2807.       flag_relachement!=FALSE
  2808.       ' ----------------------------------------------------------------------
  2809.     CASE 6 TO 15        ! Choix d'une position sur la liste
  2810.       IF km%=1                  ! Bouton gauche : changement de position
  2811.         songpos%=-1
  2812.         d%=MIN(ADD(song_list_pos%,SUB(srt%,5)),FN song_length)  ! songpos+1
  2813.         km%=1
  2814.         GOSUB chg_songpos
  2815.       ELSE                      ! Bonton droit : edition du nom du pattern
  2816.         a%=song&(MIN(ADD(song_list_pos%,SUB(srt%,6)),PRED(FN song_length)))
  2817.         GOSUB edite_chaine(FN patternname$(a%),ADD(divbi&(0,srt%,18),6),divbi&(1,srt%,18),16,0)
  2818.         GOSUB chg_patternname(bbbb$,a%)
  2819.         GOSUB affiche_icones_toolsb3
  2820.       ENDIF
  2821.       ' ----------------------------------------------------------------------
  2822.     DEFAULT
  2823.       ' Icones normales
  2824.       GOSUB affiche_icone_b(srt%,18,0,0,-1)
  2825.       GOSUB wait_mouse(TRUE)
  2826.       SELECT srt%
  2827.         ' --------------------------------------------------------------------
  2828.       CASE 3            ! Top
  2829.         song_list_pos%=0
  2830.         GOSUB affiche_icones_toolsb3
  2831.         ' --------------------------------------------------------------------
  2832.       CASE 4            ! Insert pos
  2833.         IF FN song_length<256
  2834.           GOSUB stop_voices
  2835.           IF songpos%<PRED(FN song_length)
  2836.             FOR i%=PRED(FN song_length) DOWNTO songpos%
  2837.               song&(SUCC(i%))=song&(i%)
  2838.             NEXT i%
  2839.           ENDIF
  2840.           INC module&(101)
  2841.           IF FN song_repeat>songpos%
  2842.             INC module&(102)
  2843.           ENDIF
  2844.           INC songpos%
  2845.           IF km%=2              ! Clic droit  : Nouveau pattern inutilise
  2846.             a%=0
  2847.             i%=0
  2848.             REPEAT
  2849.               IF a%=song&(i%)
  2850.                 INC a%
  2851.                 i%=-1
  2852.               ENDIF
  2853.               INC i%
  2854.             UNTIL i%=>FN song_length
  2855.             song&(songpos%)=a%
  2856.           ENDIF
  2857.           GOSUB affiche_info_song
  2858.           GOSUB affiche_c_pattern
  2859.         ENDIF
  2860.         ' --------------------------------------------------------------------
  2861.       CASE 5            ! Delete pos
  2862.         IF songpos%<PRED(FN song_length)
  2863.           FOR i%=SUCC(songpos%) TO PRED(FN song_length)
  2864.             song&(PRED(i%))=song&(i%)
  2865.           NEXT i%
  2866.           DEC module&(101)
  2867.           song&(FN song_length)=0
  2868.           IF FN song_repeat>songpos%
  2869.             DEC module&(102)
  2870.           ENDIF
  2871.           GOSUB affiche_info_song
  2872.           GOSUB affiche_c_pattern
  2873.         ENDIF
  2874.       ENDSELECT
  2875.       GOSUB affiche_icone_b(srt%,18,0,0,0)
  2876.       ' --------------------------------------------------------------------
  2877.     ENDSELECT
  2878.     GOSUB wait_mouse(flag_relachement!)
  2879.     GOSUB vide_buffer_clavier
  2880.   ENDIF
  2881. RETURN
  2882. ' Instrument
  2883. PROCEDURE affiche_icones_instr
  2884.   LOCAL i%
  2885.   IF ss_menui%=2
  2886.     GOSUB affiche_icones_instr2
  2887.   ELSE
  2888.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2889.     GOSUB affiche_bloc_icones_b(16,25,12,0,0)
  2890.     GOSUB affchaine_trans("ENVELOPES",130,42,14)
  2891.     GOSUB affchaine_trans("SAMPLE",41,92,14)
  2892.     GOSUB affchaine_trans("TRANSPOSE",69,92,14)
  2893.     GOSUB cadre_ext(divbi&(0,0,12),divbi&(1,0,12),1,47,0,13,12,14)
  2894.     GOSUB cadre_ext(divbi&(0,1,12),divbi&(1,1,12),11,47,0,13,12,14)
  2895.     GOSUB cadre_ext(ADD(divbi&(0,1,12),13),divbi&(1,1,12),2,47,0,13,12,14)
  2896.     GOSUB cadre_ext(ADD(divbi&(0,1,12),17),divbi&(1,1,12),2,47,0,13,12,14)
  2897.     FOR i%=18 TO 24 STEP 3
  2898.       GOSUB cadre_ext(ADD(divbi&(0,i%,12),7),ADD(divbi&(1,i%,12),2),2,5,0,13,12,14)
  2899.       GOSUB cadre_ext(ADD(divbi&(0,ADD(i%,9),12),7),ADD(divbi&(1,ADD(i%,9),12),2),1,5,0,13,12,14)
  2900.     NEXT i%
  2901.     GOSUB affiche_icones_instrb
  2902.   ENDIF
  2903. RETURN
  2904. PROCEDURE affiche_icones_instrb
  2905.   LOCAL a%,c%,i%,d%,a$
  2906.   IF ss_menui%=2
  2907.     GOSUB affiche_icones_instrb2
  2908.   ELSE
  2909.     instr_note_pos%=MAX(MIN(instr_note_pos%,127),24)
  2910.     instr_note_aff%=MAX(MIN(instr_note_aff%,instr_note_pos%),SUB(instr_note_pos%,7))
  2911.     GOSUB affiche_icone_b(41,12,0,0,instr_group!)
  2912.     FOR i%=0 TO 7
  2913.       d%=ADD(i%,instr_note_aff%)
  2914.       IF d%>127
  2915.         GOSUB affchaine_notrans("  ",divbi&(0,SHL(i%,1),12),divbi&(1,SHL(i%,1),12),c%)
  2916.         GOSUB affchaine_notrans(SPACE$(12),divbi&(0,SUCC(SHL(i%,1)),12),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2917.         GOSUB affchaine_notrans("   ",ADD(divbi&(0,SUCC(SHL(i%,1)),12),13),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2918.         GOSUB affchaine_notrans("   ",ADD(divbi&(0,SUCC(SHL(i%,1)),12),17),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2919.       ELSE
  2920.         IF d%=instr_note_pos%
  2921.           c%=2
  2922.         ELSE
  2923.           c%=1
  2924.         ENDIF
  2925.         a%=FN isample(instr%,d%)
  2926.         GOSUB affchaine_notrans(HEX$(a%,2),divbi&(0,SHL(i%,1),12),divbi&(1,SHL(i%,1),12),c%)
  2927.         GOSUB affchaine_notrans(LEFT$(FN samplename$(a%),12),divbi&(0,SUCC(SHL(i%,1)),12),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2928.         a%=FN itransp(instr%,d%)
  2929.         IF a%<0
  2930.           a$="-"
  2931.         ELSE
  2932.           a$="+"
  2933.         ENDIF
  2934.         a$=a$+STR$(ABS(a%),2)
  2935.         GOSUB affchaine_notrans(a$,ADD(divbi&(0,SUCC(SHL(i%,1)),12),13),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2936.         a$=MID$(gamme$,SUCC(SHL(d% MOD 12,1)),2)+STR$(SUB(DIV(d%,12),2),1)
  2937.         GOSUB affchaine_notrans(a$,ADD(divbi&(0,SUCC(SHL(i%,1)),12),17),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2938.       ENDIF
  2939.     NEXT i%
  2940.     '
  2941.     a%=MAX(FN ins_deb_zone(instr%,instr_note_pos%),24)
  2942.     a$=MID$(gamme$,SUCC(SHL(a% MOD 12,1)),2)+STR$(SUB(DIV(a%,12),2),1)
  2943.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,18,12),7),ADD(divbi&(1,18,12),2),1)
  2944.     a%=FN ins_fin_zone(instr%,instr_note_pos%)
  2945.     a$=MID$(gamme$,SUCC(SHL(a% MOD 12,1)),2)+STR$(SUB(DIV(a%,12),2),1)
  2946.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,21,12),7),ADD(divbi&(1,21,12),2),1)
  2947.     '
  2948.     GOSUB affchaine_notrans(HEX$(FN ivolume(instr%),3),ADD(divbi&(0,24,12),7),ADD(divbi&(1,24,12),2),1)
  2949.     IF FN ievol(instr%)>0
  2950.       GOSUB affchaine_notrans(HEX$(FN ievol(instr%),2),ADD(divbi&(0,27,12),7),ADD(divbi&(1,27,12),2),1)
  2951.     ELSE
  2952.       GOSUB affchaine_notrans(STRING$(2,5),ADD(divbi&(0,27,12),7),ADD(divbi&(1,27,12),2),1)
  2953.     ENDIF
  2954.     IF FN ieton(instr%)>0
  2955.       GOSUB affchaine_notrans(HEX$(FN ieton(instr%),2),ADD(divbi&(0,30,12),7),ADD(divbi&(1,30,12),2),1)
  2956.     ELSE
  2957.       GOSUB affchaine_notrans(STRING$(2,5),ADD(divbi&(0,30,12),7),ADD(divbi&(1,30,12),2),1)
  2958.     ENDIF
  2959.     IF FN iepan(instr%)>0
  2960.       GOSUB affchaine_notrans(HEX$(FN iepan(instr%),2),ADD(divbi&(0,33,12),7),ADD(divbi&(1,33,12),2),1)
  2961.     ELSE
  2962.       GOSUB affchaine_notrans(STRING$(2,5),ADD(divbi&(0,33,12),7),ADD(divbi&(1,33,12),2),1)
  2963.     ENDIF
  2964.   ENDIF
  2965. RETURN
  2966. PROCEDURE gere_icones_instr             !!!
  2967.   LOCAL a%,b%,c%,d%,i%,srt%
  2968.   LOCAL a$,b$
  2969.   LOCAL flag_relachement!
  2970.   IF ss_menui%=2
  2971.     GOSUB gere_icones_instr2
  2972.   ELSE
  2973.     flag_relachement!=TRUE
  2974.     a%=V:divbi&(0,0,0)
  2975.     srt%=C:g_teste_icones%(L:a%,W:12,W:xm%,W:ym%)
  2976.     IF srt%>=0
  2977.       SELECT srt%
  2978.         ' Radio-boutons, Flip-flops ou champs de texte
  2979.         ' --------------------------------------------------------------------
  2980.       CASE 0 TO 15      ! Numero de sample
  2981.         instr_note_pos%=MIN(ADD(instr_note_aff%,SHR(srt%,1)),127)
  2982.         GOSUB affiche_icones_instrb
  2983.         ' --------------------------------------------------------------------
  2984.       CASE 16,17        ! Haut/Bas
  2985.         a%=MUL(SUB(1,SHL(SUB(srt%,16),1)),SHL(1,PRED(km%)))
  2986.         instr_note_pos%=MAX(MIN(SUB(instr_note_pos%,a%),127),24)
  2987.         instr_note_aff%=MAX(MIN(instr_note_aff%,instr_note_pos%),SUB(instr_note_pos%,7))
  2988.         GOSUB affiche_icones_instrb
  2989.         flag_relachement!=FALSE
  2990.         ' --------------------------------------------------------------------
  2991.       CASE 18           ! From note
  2992.         '
  2993.         '
  2994.         '
  2995.         '
  2996.         ' --------------------------------------------------------------------
  2997.       CASE 19           ! +
  2998.         a%=FN ins_deb_zone(instr%,instr_note_pos%)
  2999.         IF a%>1 AND a%<instr_note_pos%
  3000.           b%=MIN(ADD(PRED(a%),SHL(1,PRED(km%))),PRED(instr_note_pos%))
  3001.           c%=FN isample(instr%,PRED(a%))
  3002.           d%=FN itransp(instr%,PRED(a%))
  3003.           FOR i%=a% TO b%
  3004.             GOSUB chg_ins_sample(instr%,i%,c%)
  3005.             GOSUB chg_ins_transp(instr%,i%,d%)
  3006.           NEXT i%
  3007.         ENDIF
  3008.         GOSUB affiche_icones_instrb
  3009.         ' --------------------------------------------------------------------
  3010.       CASE 20           ! -
  3011.         a%=FN ins_deb_zone(instr%,instr_note_pos%)
  3012.         IF a%>1
  3013.           b%=MAX(SUB(a%,SHL(1,PRED(km%))),1)
  3014.           c%=FN isample(instr%,instr_note_pos%)
  3015.           d%=FN itransp(instr%,instr_note_pos%)
  3016.           FOR i%=b% TO PRED(a%)
  3017.             GOSUB chg_ins_sample(instr%,i%,c%)
  3018.             GOSUB chg_ins_transp(instr%,i%,d%)
  3019.           NEXT i%
  3020.         ENDIF
  3021.         GOSUB affiche_icones_instrb
  3022.         ' --------------------------------------------------------------------
  3023.       CASE 21           ! To note
  3024.         '
  3025.         '
  3026.         '
  3027.         '
  3028.         ' --------------------------------------------------------------------
  3029.       CASE 22           ! +
  3030.         a%=FN ins_fin_zone(instr%,instr_note_pos%)
  3031.         IF a%<127
  3032.           b%=MIN(ADD(a%,SHL(1,PRED(km%))),127)
  3033.           c%=FN isample(instr%,instr_note_pos%)
  3034.           d%=FN itransp(instr%,instr_note_pos%)
  3035.           FOR i%=SUCC(a%) TO b%
  3036.             GOSUB chg_ins_sample(instr%,i%,c%)
  3037.             GOSUB chg_ins_transp(instr%,i%,d%)
  3038.           NEXT i%
  3039.         ENDIF
  3040.         GOSUB affiche_icones_instrb
  3041.         ' --------------------------------------------------------------------
  3042.       CASE 23           ! -
  3043.         a%=FN ins_fin_zone(instr%,instr_note_pos%)
  3044.         IF a%<127 AND a%>instr_note_pos%
  3045.           b%=MAX(SUB(SUCC(a%),SHL(1,PRED(km%))),SUCC(instr_note_pos%))
  3046.           c%=FN isample(instr%,SUCC(a%))
  3047.           d%=FN itransp(instr%,SUCC(a%))
  3048.           FOR i%=b% TO a%
  3049.             GOSUB chg_ins_sample(instr%,i%,c%)
  3050.             GOSUB chg_ins_transp(instr%,i%,d%)
  3051.           NEXT i%
  3052.         ENDIF
  3053.         GOSUB affiche_icones_instrb
  3054.         ' --------------------------------------------------------------------
  3055.       CASE 24           ! Volume
  3056.         GOSUB edite_chaine(HEX$(FN ivolume(instr%),3),ADD(divbi&(0,24,12),7),ADD(divbi&(1,24,12),2),3,1)
  3057.         GOSUB chg_ins_volume(instr%,MIN(MAX(VAL("$"+bbbb$),0),256))
  3058.         GOSUB affiche_icones_instrb
  3059.         ' --------------------------------------------------------------------
  3060.       CASE 25,26        ! +/-
  3061.         a%=MUL(SUB(1,SHL(SUB(srt%,25),1)),SHL(1,PRED(km%)))
  3062.         GOSUB chg_ins_volume(instr%,MAX(MIN(ADD(FN ivolume(instr%),a%),256),0))
  3063.         GOSUB affiche_icones_instrb
  3064.         IF km%=1
  3065.           PAUSE 6
  3066.         ENDIF
  3067.         flag_relachement!=FALSE
  3068.         ' --------------------------------------------------------------------
  3069.       CASE 27           ! Enveloppe de volume
  3070.         '
  3071.         '
  3072.         '
  3073.         '
  3074.         ' --------------------------------------------------------------------
  3075.       CASE 28,29        ! +/-
  3076.         a%=MUL(SUB(1,SHL(SUB(srt%,28),1)),SHL(1,PRED(km%)))
  3077.         GOSUB chg_ins_evol(instr%,MAX(MIN(ADD(FN ievol(instr%),a%),63),0))
  3078.         GOSUB affiche_icones_instrb
  3079.         IF km%=1
  3080.           PAUSE 6
  3081.         ENDIF
  3082.         flag_relachement!=FALSE
  3083.         ' --------------------------------------------------------------------
  3084.       CASE 30           ! Enveloppe de tonalite
  3085.         '
  3086.         '
  3087.         '
  3088.         '
  3089.         ' --------------------------------------------------------------------
  3090.       CASE 31,32        ! +/-
  3091.         a%=MUL(SUB(1,SHL(SUB(srt%,31),1)),SHL(1,PRED(km%)))
  3092.         GOSUB chg_ins_eton(instr%,MAX(MIN(ADD(FN ieton(instr%),a%),63),0))
  3093.         GOSUB affiche_icones_instrb
  3094.         IF km%=1
  3095.           PAUSE 6
  3096.         ENDIF
  3097.         flag_relachement!=FALSE
  3098.         ' --------------------------------------------------------------------
  3099.       CASE 33           ! Enveloppe de panning
  3100.         '
  3101.         '
  3102.         '
  3103.         '
  3104.         ' --------------------------------------------------------------------
  3105.       CASE 34,35        ! +/-
  3106.         a%=MUL(SUB(1,SHL(SUB(srt%,34),1)),SHL(1,PRED(km%)))
  3107.         GOSUB chg_ins_epan(instr%,MAX(MIN(ADD(FN iepan(instr%),a%),63),0))
  3108.         GOSUB affiche_icones_instrb
  3109.         IF km%=1
  3110.           PAUSE 6
  3111.         ENDIF
  3112.         flag_relachement!=FALSE
  3113.         ' --------------------------------------------------------------------
  3114.       CASE 36,37        ! +/- Sample
  3115.         a%=MUL(SUB(1,SHL(SUB(srt%,36),1)),SHL(1,PRED(km%)))
  3116.         a%=MAX(MIN(ADD(FN isample(instr%,instr_note_pos%),a%),255),1)
  3117.         IF instr_group!
  3118.           b%=FN ins_deb_zone(instr%,instr_note_pos%)
  3119.           c%=FN ins_fin_zone(instr%,instr_note_pos%)
  3120.         ELSE
  3121.           b%=instr_note_pos%
  3122.           c%=instr_note_pos%
  3123.         ENDIF
  3124.         FOR i%=b% TO c%
  3125.           GOSUB chg_ins_sample(instr%,i%,a%)
  3126.         NEXT i%
  3127.         GOSUB affiche_icones_instrb
  3128.         IF km%=1
  3129.           PAUSE 6
  3130.         ENDIF
  3131.         flag_relachement!=FALSE
  3132.         ' --------------------------------------------------------------------
  3133.       CASE 38,39        ! +/- Transpose
  3134.         a%=MUL(SUB(1,SHL(SUB(srt%,38),1)),SHL(1,PRED(km%)))
  3135.         b%=MAX(MIN(ADD(FN itransp(instr%,instr_note_pos%),a%),96),-96)
  3136.         IF instr_group!
  3137.           a%=FN ins_deb_zone(instr%,instr_note_pos%)
  3138.           c%=FN ins_fin_zone(instr%,instr_note_pos%)
  3139.         ELSE
  3140.           a%=instr_note_pos%
  3141.           c%=instr_note_pos%
  3142.         ENDIF
  3143.         FOR i%=a% TO c%
  3144.           GOSUB chg_ins_transp(instr%,i%,b%)
  3145.         NEXT i%
  3146.         GOSUB affiche_icones_instrb
  3147.         IF km%=1
  3148.           PAUSE 6
  3149.         ENDIF
  3150.         flag_relachement!=FALSE
  3151.         ' --------------------------------------------------------------------
  3152.       CASE 40           ! Liste des instruments
  3153.         GOSUB affiche_icone_b(srt%,12,0,0,-1)
  3154.         GOSUB wait_mouse(TRUE)
  3155.         ss_menui%=2
  3156.         GOSUB affiche_icones_instr
  3157.         ' --------------------------------------------------------------------
  3158.       CASE 41           ! Group
  3159.         instr_group!=NOT instr_group!
  3160.         GOSUB affiche_icones_instrb
  3161.         ' --------------------------------------------------------------------
  3162.       DEFAULT
  3163.         ' Icones normales
  3164.         GOSUB affiche_icone_b(srt%,12,0,0,-1)
  3165.         GOSUB wait_mouse(TRUE)
  3166.         SELECT srt%
  3167.         ENDSELECT
  3168.         GOSUB affiche_icone_b(srt%,12,0,0,0)
  3169.       ENDSELECT
  3170.       GOSUB wait_mouse(flag_relachement!)
  3171.       GOSUB vide_buffer_clavier
  3172.     ENDIF
  3173.   ENDIF
  3174. RETURN
  3175. PROCEDURE affiche_icones_instr2
  3176.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3177.   GOSUB affiche_bloc_icones_b(0,7,13,0,0)
  3178.   GOSUB cadre_ext(divbi&(0,7,13),divbi&(1,7,13),30,59,0,13,12,14)
  3179.   GOSUB affchaine_trans("INSTRUMENT LIST",106,87,14)
  3180.   GOSUB affiche_icones_instrb2
  3181. RETURN
  3182. PROCEDURE affiche_icones_instrb2
  3183.   ' Var. locales de instrb1
  3184.   instr_list_pos%=MAX(MIN(instr_list_pos%,246),1)
  3185.   FOR a%=0 TO 9
  3186.     IF ADD(a%,instr_list_pos%)=instr%
  3187.       GOSUB affchaine_notrans(HEX$(ADD(a%,instr_list_pos%),2)+" "+FN instrname$(ADD(a%,instr_list_pos%)),divbi&(0,ADD(a%,7),13),divbi&(1,ADD(a%,7),13),2)
  3188.     ELSE
  3189.       GOSUB affchaine_notrans(HEX$(ADD(a%,instr_list_pos%),2)+" "+FN instrname$(ADD(a%,instr_list_pos%)),divbi&(0,ADD(a%,7),13),divbi&(1,ADD(a%,7),13),1)
  3190.     ENDIF
  3191.   NEXT a%
  3192. RETURN
  3193. PROCEDURE gere_icones_instr2            !!!
  3194.   ' Les autres var. locales sont dans instr1
  3195.   flag_relachement!=TRUE
  3196.   a%=V:divbi&(0,0,0)
  3197.   srt%=C:g_teste_icones%(L:a%,W:13,W:xm%,W:ym%)
  3198.   IF srt%>=0
  3199.     SELECT srt%
  3200.       ' Radio-boutons, Flip-flops ou champs de texte
  3201.       ' ----------------------------------------------------------------------
  3202.     CASE 0              ! Page 1
  3203.       GOSUB affiche_icone_b(srt%,13,0,0,-1)
  3204.       GOSUB wait_mouse(TRUE)
  3205.       ss_menui%=1
  3206.       GOSUB affiche_icones_instr
  3207.       ' ----------------------------------------------------------------------
  3208.     CASE 1              ! Up
  3209.       instr_list_pos%=MAX(SUB(instr_list_pos%,SUB(km%,MUL(km%=3,7))),1)         ! Pas de -1, -2 et -10
  3210.       GOSUB affiche_icones_instrb2
  3211.       flag_relachement!=FALSE
  3212.       ' ----------------------------------------------------------------------
  3213.     CASE 2              ! Down
  3214.       instr_list_pos%=MIN(ADD(instr_list_pos%,SUB(km%,MUL(km%=3,7))),246)       ! Pas de 1, 2 et 10
  3215.       GOSUB affiche_icones_instrb2
  3216.       flag_relachement!=FALSE
  3217.       ' ----------------------------------------------------------------------
  3218.     CASE 7 TO 16        ! Choix d'un sample sur la liste
  3219.       instr%=ADD(instr_list_pos%,SUB(srt%,7))
  3220.       GOSUB affiche_info_sample
  3221.       ' ----------------------------------------------------------------------
  3222.     DEFAULT
  3223.       ' Icones normales
  3224.       GOSUB affiche_icone_b(srt%,13,0,0,-1)
  3225.       GOSUB wait_mouse(TRUE)
  3226.       SELECT srt%
  3227.         ' --------------------------------------------------------------------
  3228.       CASE 3            ! Top
  3229.         instr_list_pos%=1
  3230.         GOSUB affiche_icones_instrb2
  3231.         ' --------------------------------------------------------------------
  3232.       CASE 4            ! Load instrument
  3233.         GOSUB stop_voices
  3234.         GOSUB load_instrument
  3235.         ' --------------------------------------------------------------------
  3236.       CASE 5            ! Load and replace samples
  3237.         GOSUB stop_voices
  3238.         b$=""
  3239.         FOR i%=1 TO 127                         ! Cherche tous les samples contenus dans l'instrument
  3240.           a%=FN isample(instr%,i%)
  3241.           IF a%<>0
  3242.             IF INSTR(b$,CHR$(a%))=0
  3243.               b$=b$+CHR$(a%)
  3244.             ENDIF
  3245.           ENDIF
  3246.         NEXT i%
  3247.         '
  3248.         '
  3249.         '
  3250.         '
  3251.         ' GOSUB chg_taille_sample(sample%,0)
  3252.         ' a$="SAMP"+MKL$(64)+MKI$(sample%)+SPACE$(28)+MKI$(0)+MKI$(&HFFFF)+MKI$(8)+MKI$(8363)+MKL$(0)+MKL$(0)+MKL$(2)+MKI$(0)+MKI$(0)+MKI$(0)
  3253.         ' BMOVE V:a$,FN adrsamchk(sample%),64
  3254.         '
  3255.         '
  3256.         '
  3257.         '
  3258.         ' --------------------------------------------------------------------
  3259.       CASE 6            ! Save instrument
  3260.         GOSUB save_instrument
  3261.         ' --------------------------------------------------------------------
  3262.       ENDSELECT
  3263.       GOSUB affiche_icone_b(srt%,13,0,0,0)
  3264.     ENDSELECT
  3265.     GOSUB wait_mouse(flag_relachement!)
  3266.     GOSUB vide_buffer_clavier
  3267.   ENDIF
  3268. RETURN
  3269. ' Sample
  3270. PROCEDURE affiche_icones_sample
  3271.   LOCAL i%
  3272.   IF ss_menus%=2
  3273.     GOSUB affiche_icones_sample2
  3274.   ELSE
  3275.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3276.     GOSUB affiche_bloc_icones_b(0,33,14,0,0)
  3277.     GOSUB cadre_ext(ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),1,5,0,13,12,14)
  3278.     GOSUB cadre_ext(ADD(divbi&(0,3,14),5),ADD(divbi&(1,3,14),2),27,5,0,13,12,14)
  3279.     GOSUB cadre_ext(ADD(divbi&(0,4,14),7),ADD(divbi&(1,4,14),2),5,5,0,13,12,14)
  3280.     GOSUB cadre_ext(ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),5,5,0,13,12,14)
  3281.     GOSUB cadre_ext(ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),5,5,0,13,12,14)
  3282.     GOSUB cadre_ext(ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),2,5,0,13,12,14)
  3283.     GOSUB cadre_ext(ADD(divbi&(0,16,14),9),ADD(divbi&(1,16,14),2),1,5,0,13,12,14)
  3284.     GOSUB cadre_ext(ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),2,5,0,13,12,14)
  3285.     GOSUB cadre_ext(ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),4,5,0,13,12,14)
  3286.     GOSUB cadre_ext(ADD(divbi&(0,25,14),13),ADD(divbi&(1,25,14),2),1,5,0,13,12,14)
  3287.     GOSUB cadre_ext(ADD(divbi&(0,32,14),12),ADD(divbi&(1,32,14),2),4,5,0,13,12,14)
  3288.     GOSUB affiche_icones_sampleb
  3289.     GOSUB affiche_icones_samplec
  3290.   ENDIF
  3291. RETURN
  3292. PROCEDURE affiche_icones_sampleb
  3293.   LOCAL a%,b%,c%,a$
  3294.   IF ss_menus%=2
  3295.     GOSUB affiche_icones_sampleb2
  3296.   ELSE
  3297.     GOSUB affchaine_notrans(HEX$(sample%,2),ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),1)
  3298.     GOSUB affchaine_notrans(FN samplename$(sample%),ADD(divbi&(0,3,14),5),ADD(divbi&(1,3,14),2),1)
  3299.     GOSUB affchaine_notrans(HEX$(FN length(sample%),6),ADD(divbi&(0,4,14),7),ADD(divbi&(1,4,14),2),1)
  3300.     GOSUB affchaine_notrans(HEX$(FN repeat(sample%),6),ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),1)
  3301.     GOSUB affchaine_notrans(HEX$(FN replen(sample%),6),ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),1)
  3302.     GOSUB affchaine_notrans(HEX$(FN volume(sample%),3),ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),1)
  3303.     GOSUB affchaine_notrans(STR$(FN freqech(sample%),5),ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),1)
  3304.     GOSUB affchaine_notrans(STR$(SHL(FN resol(sample%),3),2),ADD(divbi&(0,25,14),13),ADD(divbi&(1,25,14),2),1)
  3305.     a%=FN finetune(sample%)
  3306.     IF a%<0
  3307.       a$="-"+HEX$(ABS(a%),1)
  3308.     ELSE
  3309.       a$="+"+HEX$(a%,1)
  3310.     ENDIF
  3311.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,16,14),9),ADD(divbi&(1,16,14),2),1)
  3312.     IF FN autobal(sample%)>&HFFF
  3313.       a$="???"
  3314.     ELSE
  3315.       a$=HEX$(FN autobal(sample%),3)
  3316.     ENDIF
  3317.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),1)
  3318.   ENDIF
  3319. RETURN
  3320. PROCEDURE affiche_icones_samplec
  3321.   LOCAL a$
  3322.   a$=SPACE$(SUB(5,LEN(next_sample$)))+next_sample$
  3323.   GOSUB affchaine_notrans(a$,ADD(divbi&(0,32,14),12),ADD(divbi&(1,32,14),2),1)
  3324.   GOSUB affiche_icone_b(33,14,0,0,signe_sam%=0)
  3325. RETURN
  3326. PROCEDURE gere_icones_sample
  3327.   LOCAL a%,b%,c%,d%,srt%
  3328.   LOCAL a$
  3329.   LOCAL flag_relachement!
  3330.   IF ss_menus%=2
  3331.     GOSUB gere_icones_sample2
  3332.   ELSE
  3333.     flag_relachement!=TRUE
  3334.     a%=V:divbi&(0,0,0)
  3335.     srt%=C:g_teste_icones%(L:a%,W:14,W:xm%,W:ym%)
  3336.     IF srt%>=0
  3337.       SELECT srt%
  3338.         ' Radio-boutons, Flip-flops ou champs de texte
  3339.         ' --------------------------------------------------------------------
  3340.       CASE 0                      ! Sample
  3341.         d%=0
  3342.         GOSUB chg_s_sample
  3343.         ' --------------------------------------------------------------------
  3344.       CASE 1                      ! Sample +
  3345.         d%=1
  3346.         GOSUB chg_s_sample
  3347.         flag_relachement!=FALSE
  3348.         ' --------------------------------------------------------------------
  3349.       CASE 2                      ! Sample -
  3350.         d%=-1
  3351.         GOSUB chg_s_sample
  3352.         flag_relachement!=FALSE
  3353.         ' --------------------------------------------------------------------
  3354.       CASE 3                      ! Samplename
  3355.         GOSUB edite_chaine(FN samplename$(sample%),ADD(divbi&(0,3,14),5),ADD(divbi&(1,3,14),2),28,0)
  3356.         GOSUB chg_samplename(bbbb$,sample%)
  3357.         GOSUB affiche_icones_sampleb
  3358.         ' --------------------------------------------------------------------
  3359.       CASE 4,7,10,13,16,19,22     ! Edition des chiffres
  3360.         d%=0
  3361.         ON DIV(PRED(srt%),3) GOSUB chg_s_length,chg_s_reppos,chg_s_replen,chg_s_volume,chg_s_finetune,chg_s_balance,chg_s_freqech
  3362.         ' --------------------------------------------------------------------
  3363.       CASE 5,8,11,14,17,20,23     ! +
  3364.         d%=1
  3365.         ON DIV(SUB(srt%,2),3) GOSUB chg_s_length,chg_s_reppos,chg_s_replen,chg_s_volume,chg_s_finetune,chg_s_balance,chg_s_freqech
  3366.         flag_relachement!=FALSE
  3367.         ' --------------------------------------------------------------------
  3368.       CASE 6,9,12,15,18,21,24     ! -
  3369.         d%=-1
  3370.         ON DIV(SUB(srt%,3),3) GOSUB chg_s_length,chg_s_reppos,chg_s_replen,chg_s_volume,chg_s_finetune,chg_s_balance,chg_s_freqech
  3371.         flag_relachement!=FALSE
  3372.         ' --------------------------------------------------------------------
  3373.       CASE 29                     ! List
  3374.         GOSUB affiche_icone_b(srt%,14,0,0,-1)
  3375.         GOSUB wait_mouse(TRUE)
  3376.         ss_menus%=2
  3377.         GOSUB affiche_icones_sample
  3378.         ' --------------------------------------------------------------------
  3379.       CASE 32
  3380.         a$="AVRSPLWAVVOC  *  "
  3381.         a%=INSTR(a$,RIGHT$(next_sample$,SUB(LEN(next_sample$),INSTR(next_sample$,"."))))
  3382.         IF a%>0
  3383.           a%=DIV(PRED(a%),3)
  3384.         ELSE
  3385.           a%=-1
  3386.         ENDIF
  3387.         a%=FN popup(1,a%,MOUSEX,MOUSEY)
  3388.         IF a%>=0
  3389.           a%=a% AND &HFFFF
  3390.           next_sample$="*."+TRIM$(MID$(a$,SUCC(MUL(a%,3)),3))
  3391.         ENDIF
  3392.         GOSUB affiche_icones_samplec
  3393.         ' --------------------------------------------------------------------
  3394.       CASE 33                     ! Signed
  3395.         signe_sam%=SUB(128,signe_sam%)
  3396.         GOSUB affiche_icones_samplec
  3397.         ' --------------------------------------------------------------------
  3398.       CASE 35 TO 39
  3399.         ' Rien
  3400.         ' --------------------------------------------------------------------
  3401.       DEFAULT
  3402.         ' Icones normales
  3403.         GOSUB affiche_icone_b(srt%,14,0,0,-1)
  3404.         GOSUB wait_mouse(TRUE)
  3405.         SELECT srt%
  3406.           ' ------------------------------------------------------------------
  3407.         CASE 25,26,27             ! Nbr de bits
  3408.           IF FN resol(sample%)=1      ! 8 -> 16 bits
  3409.             GOSUB dialog("CONVERT TO 16 BITS","DO YOU REALLY WANT|TO CONVERT SAMPLE #"+HEX$(sample%,2)+"|TO 16 BITS ?","YES|NO",xm%,ym%)
  3410.             IF bouton%=0
  3411.               GOSUB stop_voices
  3412.               GOSUB aff_message("Converting...")
  3413.               GOSUB bee(TRUE)
  3414.               a%=FN adresse(sample%)
  3415.               b%=FN length(sample%)
  3416.               IF b%>0
  3417.                 GOSUB chg_taille_sample(sample%,SHL(b%,1))
  3418.                 ~C:g_copy_sample_8_2_16%(L:a%,L:a%,L:b%)
  3419.                 GOSUB chg_sam_length(sample%,SHL(b%,1))
  3420.                 IF ADD(FN repeat(sample%),FN replen(sample%))>2
  3421.                   GOSUB chg_sam_repeat(sample%,SHL(FN repeat(sample%),1))
  3422.                   GOSUB chg_sam_replen(sample%,SHL(FN replen(sample%),1))
  3423.                 ENDIF
  3424.               ENDIF
  3425.               GOSUB chg_sam_nbits(sample%,2)
  3426.               ~C:rr_boucle_sample%(W:sample%)
  3427.               GOSUB aff_message("Sample # "+HEX$(sample%,2)+" converted to 16 bits.")
  3428.             ENDIF
  3429.           ELSE                        ! 16 -> 8 bits
  3430.             GOSUB dialog("CONVERT TO 8 BITS","DO YOU REALLY WANT|TO CONVERT SAMPLE #"+HEX$(sample%,2)+"|TO 8 BITS ?","YES|NO",xm%,ym%)
  3431.             IF bouton%=0
  3432.               GOSUB stop_voices
  3433.               GOSUB aff_message("Converting...")
  3434.               GOSUB bee(TRUE)
  3435.               a%=FN adresse(sample%)
  3436.               IF FN length(sample%)>0
  3437.                 b%=FN length(sample%) AND -4
  3438.                 ~C:g_copy_sample_16_2_8%(L:a%,L:a%,L:b%)
  3439.                 GOSUB chg_taille_sample(sample%,b%)
  3440.                 GOSUB chg_sam_length(sample%,SHR(b%,1) AND -2)
  3441.                 IF ADD(FN repeat(sample%),FN replen(sample%))>2
  3442.                   GOSUB chg_sam_repeat(sample%,SHR(FN repeat(sample%),1) AND -2)
  3443.                   GOSUB chg_sam_replen(sample%,SHR(FN replen(sample%),1) AND -2)
  3444.                 ENDIF
  3445.               ENDIF
  3446.               GOSUB chg_sam_nbits(sample%,1)
  3447.               ~C:rr_boucle_sample%(W:sample%)
  3448.               GOSUB aff_message("Sample # "+HEX$(sample%,2)+" converted to 8 bits.")
  3449.             ENDIF
  3450.           ENDIF
  3451.           GOSUB bee(FALSE)
  3452.           GOSUB affiche_icones_samplec
  3453.           ' ------------------------------------------------------------------
  3454.         CASE 28                   ! Kill sample
  3455.           GOSUB dialog("KILL SAMPLE","DO YOU REALLY WANT|TO KILL SAMPLE #"+HEX$(sample%,2)+" ?","YES|NO",xm%,ym%)
  3456.           IF bouton%=0
  3457.             GOSUB bee(TRUE)
  3458.             GOSUB kill_sample(sample%)
  3459.             GOSUB bee(FALSE)
  3460.             GOSUB affiche_info_sample
  3461.             GOSUB aff_message("SAMPLE #"+HEX$(sample%,2)+" KILLED BY DEATH...")
  3462.             GOSUB affiche_icones_samplec
  3463.           ENDIF
  3464.           ' ------------------------------------------------------------------
  3465.         CASE 30                   ! Load sample
  3466.           GOSUB load_sample(FALSE)
  3467.           ' ------------------------------------------------------------------
  3468.         CASE 31                   ! Save sample
  3469.           GOSUB save_sample(FALSE)
  3470.           ' ------------------------------------------------------------------
  3471.         ENDSELECT
  3472.         GOSUB affiche_icone_b(srt%,14,0,0,0)
  3473.       ENDSELECT
  3474.       GOSUB wait_mouse(flag_relachement!)
  3475.       GOSUB vide_buffer_clavier
  3476.     ENDIF
  3477.   ENDIF
  3478. RETURN
  3479. PROCEDURE affiche_icones_sample2
  3480.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3481.   GOSUB affiche_bloc_icones_b(0,5,15,0,0)
  3482.   GOSUB cadre_ext(divbi&(0,5,15),divbi&(1,5,15),30,59,0,13,12,14)
  3483.   GOSUB affchaine_trans("SAMPLE LIST",106,87,14)
  3484.   GOSUB affiche_icones_sampleb2
  3485. RETURN
  3486. PROCEDURE affiche_icones_sampleb2
  3487.   ' Var. locales de sampleb1
  3488.   sample_list_pos%=MAX(MIN(sample_list_pos%,246),1)
  3489.   b%=sample_list_pos%
  3490.   FOR a%=0 TO 9
  3491.     IF b%=sample%
  3492.       c%=2
  3493.     ELSE
  3494.       c%=1
  3495.     ENDIF
  3496.     IF FN length(b%)>0
  3497.       GOSUB affchaine_notrans(HEX$(b%,2)+CHR$(9)+FN samplename$(b%),divbi&(0,ADD(a%,5),15),divbi&(1,ADD(a%,5),15),c%)
  3498.     ELSE
  3499.       GOSUB affchaine_notrans(HEX$(b%,2)+" "+FN samplename$(b%),divbi&(0,ADD(a%,5),15),divbi&(1,ADD(a%,5),15),c%)
  3500.     ENDIF
  3501.     INC b%
  3502.   NEXT a%
  3503. RETURN
  3504. PROCEDURE gere_icones_sample2
  3505.   ' Les autres var. locales sont dans sample1
  3506.   flag_relachement!=TRUE
  3507.   a%=V:divbi&(0,0,0)
  3508.   srt%=C:g_teste_icones%(L:a%,W:15,W:xm%,W:ym%)
  3509.   IF srt%>=0
  3510.     SELECT srt%
  3511.       ' Radio-boutons, Flip-flops ou champs de texte
  3512.       ' ----------------------------------------------------------------------
  3513.     CASE 0              ! Page 1
  3514.       GOSUB affiche_icone_b(srt%,15,0,0,-1)
  3515.       GOSUB wait_mouse(TRUE)
  3516.       ss_menus%=1
  3517.       GOSUB affiche_icones_sample
  3518.       ' ----------------------------------------------------------------------
  3519.     CASE 1              ! Up
  3520.       sample_list_pos%=MAX(SUB(sample_list_pos%,SUB(km%,MUL(km%=3,7))),1)       ! Pas de -1, -2 et -10
  3521.       GOSUB affiche_icones_sampleb2
  3522.       flag_relachement!=FALSE
  3523.       ' ----------------------------------------------------------------------
  3524.     CASE 2              ! Down
  3525.       sample_list_pos%=MIN(ADD(sample_list_pos%,SUB(km%,MUL(km%=3,7))),246)     ! Pas de 1, 2 et 10
  3526.       GOSUB affiche_icones_sampleb2
  3527.       flag_relachement!=FALSE
  3528.       ' ----------------------------------------------------------------------
  3529.     CASE 5 TO 14        ! Choix d'un sample sur la liste
  3530.       sample%=ADD(sample_list_pos%,SUB(srt%,5))
  3531.       GOSUB affiche_info_sample
  3532.       ' ----------------------------------------------------------------------
  3533.     DEFAULT
  3534.       ' Icones normales
  3535.       GOSUB affiche_icone_b(srt%,15,0,0,-1)
  3536.       GOSUB wait_mouse(TRUE)
  3537.       SELECT srt%
  3538.         ' --------------------------------------------------------------------
  3539.       CASE 3            ! Top
  3540.         sample_list_pos%=1
  3541.         GOSUB affiche_icones_sampleb2
  3542.         ' --------------------------------------------------------------------
  3543.       CASE 4            ! Instrument
  3544.         IF km%=2 AND instr%<255
  3545.           a%=SUCC(instr%)
  3546.           GOSUB aff_message("Waiting : searching sample "+HEX$(sample%,2)+" from instrument "+HEX$(a%,2)+"...")
  3547.         ELSE
  3548.           a%=1
  3549.           GOSUB aff_message("Waiting : searching sample "+HEX$(sample%,2)+" from the first instrument...")
  3550.         ENDIF
  3551.         GOSUB bee(TRUE)
  3552.         b%=FN ins_cherche_sample(sample%,a%)
  3553.         GOSUB bee(FALSE)
  3554.         IF b%>0
  3555.           instr%=b%
  3556.           GOSUB aff_message("Sample "+HEX$(sample%,2)+" found in instrument "+HEX$(instr%,2)+".")
  3557.         ELSE
  3558.           GOSUB aff_message("Sample "+HEX$(sample%,2)+" not found.")
  3559.         ENDIF
  3560.         GOSUB affiche_info_sample
  3561.         ' --------------------------------------------------------------------
  3562.       ENDSELECT
  3563.       GOSUB affiche_icone_b(srt%,15,0,0,0)
  3564.     ENDSELECT
  3565.     GOSUB wait_mouse(flag_relachement!)
  3566.     GOSUB vide_buffer_clavier
  3567.   ENDIF
  3568. RETURN
  3569. ' Envelopes
  3570. PROCEDURE affiche_icones_enveloppe
  3571.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3572.   GOSUB affiche_bloc_icones_b(30,19,17,0,0)
  3573.   GOSUB cadre_ext(divbi&(0,0,17),divbi&(1,0,17),3,59,0,13,12,14)
  3574.   GOSUB cadre_ext(divbi&(0,10,17),divbi&(1,10,17),15,59,0,13,12,14)
  3575.   GOSUB cadre_ext(divbi&(0,20,17),divbi&(1,20,17),10,59,0,13,12,14)
  3576.   GOSUB cadre_ext(ADD(divbi&(0,39,17),9),ADD(divbi&(1,39,17),2),1,5,0,13,12,14)
  3577.   GOSUB cadre_ext(SUCC(divbi&(0,43,17)),ADD(divbi&(1,43,17),2),19,5,0,13,12,14)
  3578.   GOSUB cadre_ext(SUCC(divbi&(0,46,17)),ADD(divbi&(1,46,17),2),1,5,0,13,12,14)
  3579.   GOSUB affiche_icones_enveloppeb
  3580. RETURN
  3581. PROCEDURE affiche_icones_enveloppeb
  3582.   env_num&=MIN(MAX(env_num&,0),63)
  3583.   env_copy&=MIN(MAX(env_copy&,0),63)
  3584.   GOSUB affchaine_notrans(HEX$(env_num&,2),ADD(divbi&(0,39,17),9),ADD(divbi&(1,39,17),2),1)
  3585.   GOSUB affchaine_notrans(FN envelopename$(env_num&,ss_menue%),SUCC(divbi&(0,43,17)),ADD(divbi&(1,43,17),2),1)
  3586.   GOSUB affchaine_notrans(HEX$(env_copy&,2),SUCC(divbi&(0,46,17)),ADD(divbi&(1,46,17),2),1)
  3587.   GOSUB affiche_icone_b(34,17,0,0,ss_menue%=0)
  3588.   GOSUB affiche_icone_b(35,17,0,0,ss_menue%=1)
  3589.   GOSUB affiche_icone_b(36,17,0,0,ss_menue%=2)
  3590.   GOSUB affiche_icone_b(37,17,0,0,env_sect&=0)
  3591.   GOSUB affiche_icone_b(38,17,0,0,env_sect&=1)
  3592.   GOSUB affiche_icones_enveloppec
  3593.   GOSUB affiche_icones_envelopped
  3594. RETURN
  3595. PROCEDURE affiche_icones_enveloppec
  3596.   ' Affichage de la liste des commandes
  3597.   LOCAL i%
  3598.   LOCAL a$
  3599.   env_codpos&=MIN(MAX(env_codpos&,0),PRED(env_codmax&(ss_menue%)))
  3600.   FOR i%=0 TO 9
  3601.     IF ADD(i%,env_codpos&)<env_codmax&(ss_menue%)
  3602.       a$=TRIM$(env_code$(env_conv&(ADD(i%,env_codpos&),ss_menue%)))
  3603.     ELSE
  3604.       a$=""
  3605.     ENDIF
  3606.     GOSUB affchaine_notrans(a$+SPACE$(SUB(11,LEN(a$))),divbi&(0,ADD(20,i%),17),divbi&(1,ADD(20,i%),17),1)
  3607.   NEXT i%
  3608. RETURN
  3609. PROCEDURE affiche_icones_envelopped
  3610.   LOCAL a%,b%,c%,i%,l%,p%
  3611.   LOCAL a$
  3612.   p%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,env_posaff&)
  3613.   IF p%<0
  3614.     env_posaff&=0
  3615.     env_poscurs&=0
  3616.     p%=0
  3617.   ENDIF
  3618.   a%=FN env_sectadr(env_num&,ss_menue%,env_sect&)
  3619.   l%=FN env_sectlen(env_num&,ss_menue%,env_sect&)
  3620.   env_poscurs&=MIN(MAX(env_poscurs&,env_posaff&),ADD(env_posaff&,9))
  3621.   FOR i%=0 TO 9
  3622.     IF ADD(env_posaff&,i%)=env_poscurs&
  3623.       a$=">"+STR$(ADD(env_posaff&,i%),3)
  3624.     ELSE IF p%<=l%
  3625.       a$=STR$(ADD(env_posaff&,i%),4)
  3626.     ELSE
  3627.       a$="    "
  3628.     ENDIF
  3629.     GOSUB affchaine_notrans(a$,divbi&(0,i%,17),divbi&(1,i%,17),1)
  3630.     IF p%<l%
  3631.       b%=BYTE{ADD(a%,p%)}
  3632.       c%=SUCC(ADD(a%,p%))
  3633.       a$=env_code$(b%)
  3634.       SELECT b%
  3635.       CASE &H2
  3636.         a$=a$+STR$(CARD{c%},5)
  3637.         ADD p%,3
  3638.       CASE &H1,&H2,&H4
  3639.         a$=a$+STR$(FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,CARD{c%}),3)
  3640.         ADD p%,3
  3641.       CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  3642.         a$=a$+HEX$(BYTE{c%},2)
  3643.         ADD p%,2
  3644.       CASE &H80,&HA0
  3645.         a$=a$+HEX$(CARD{c%},4)
  3646.         ADD p%,3
  3647.       CASE &HC0
  3648.         a$=a$+HEX$(CARD{c%},3)
  3649.         ADD p%,3
  3650.       CASE &H81,&HA1,&HC1
  3651.         a$=a$+FN hexasigne$(INT{c%},4)
  3652.         ADD p%,3
  3653.       DEFAULT
  3654.         INC p%
  3655.       ENDSELECT
  3656.       a$=a$+SPACE$(SUB(16,LEN(a$)))
  3657.       GOSUB affchaine_notrans(a$,divbi&(0,ADD(i%,10),17),divbi&(1,ADD(i%,10),17),1)
  3658.     ELSE
  3659.       GOSUB affchaine_notrans(SPACE$(16),divbi&(0,ADD(i%,10),17),divbi&(1,ADD(i%,10),17),1)
  3660.       INC p%
  3661.     ENDIF
  3662.   NEXT i%
  3663. RETURN
  3664. PROCEDURE gere_icones_enveloppe
  3665.   LOCAL a%,b%,c%,d%,e%,i%,srt%
  3666.   LOCAL flag_relachement!
  3667.   LOCAL a$
  3668.   flag_relachement!=TRUE
  3669.   a%=V:divbi&(0,0,0)
  3670.   srt%=C:g_teste_icones%(L:a%,W:17,W:xm%,W:ym%)
  3671.   IF srt%>=0
  3672.     SELECT srt%
  3673.       ' Radio-boutons, Flip-flops ou champs de texte
  3674.       ' ----------------------------------------------------------------------
  3675.     CASE 0 TO 9                 ! Numero de pas
  3676.       b%=FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,FN env_sectlen(env_num&,ss_menue%,env_sect&))
  3677.       env_poscurs&=MIN(MAX(ADD(env_posaff&,srt%),0),b%)
  3678.       GOSUB affiche_icones_envelopped
  3679.       ' ----------------------------------------------------------------------
  3680.     CASE 10 TO 19               ! Commande dans l'enveloppe : Edition du parametre
  3681.       a%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,ADD(env_posaff&,SUB(srt%,10)))
  3682.       IF a%>=0
  3683.         a%=ADD(FN env_sectadr(env_num&,ss_menue%,env_sect&),a%)
  3684.         b%=BYTE{a%}
  3685.         c%=ADD(divbi&(0,srt%,17),LEN(env_code$(b%)))
  3686.         d%=divbi&(1,srt%,17)
  3687.         INC a%
  3688.         SELECT b%
  3689.         CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2   ! Octet
  3690.           GOSUB edite_chaine(HEX$(BYTE{a%},2),c%,d%,2,1)
  3691.           BYTE{a%}=VAL("$"+bbbb$)
  3692.         CASE &H2                                                ! Mot decimal
  3693.           GOSUB edite_chaine(STR$(CARD{a%},5),c%,d%,5,2)
  3694.           CARD{a%}=MIN(MAX(VAL(bbbb$),0),32767)
  3695.         CASE &H1,&H4                                            ! Mot decimal (position) 999 maxi
  3696.           GOSUB edite_chaine(STR$(FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,CARD{a%}),3),c%,d%,3,2)
  3697.           CARD{a%}=MIN(MAX(FN pos_enveloppe(env_num&,ss_menue%,env_sect&,VAL(bbbb$)),0),PRED(FN env_sectlen(env_num&,ss_menue%,env_sect&)))
  3698.         CASE &H80,&HA0                                          ! Mot
  3699.           GOSUB edite_chaine(HEX$(CARD{a%},4),c%,d%,4,1)
  3700.           CARD{a%}=VAL("$"+bbbb$)
  3701.         CASE &HC0                                               ! Mot 3 chiffres
  3702.           GOSUB edite_chaine(HEX$(CARD{a%},3),c%,d%,3,1)
  3703.           CARD{a%}=VAL("$"+bbbb$)
  3704.         CASE &H81,&HA1,&HC1                                     ! Mot signe
  3705.           GOSUB edite_chaine(FN hexasigne$(INT{a%},4),c%,d%,5,0)
  3706.           INT{a%}=FN valhexasigne(bbbb$)
  3707.         DEFAULT
  3708.           GOTO gere_icone_env_gotopos
  3709.         ENDSELECT
  3710.       ELSE
  3711.       gere_icone_env_gotopos:
  3712.         b%=FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,FN env_sectlen(env_num&,ss_menue%,env_sect&))
  3713.         env_poscurs&=MIN(MAX(ADD(env_posaff&,SUB(srt%,10)),0),b%)
  3714.       ENDIF
  3715.       GOSUB affiche_icones_envelopped
  3716.       ' ----------------------------------------------------------------------
  3717.     CASE 20 TO 29               ! Commande dans la liste : insertion
  3718.       e%=ADD(env_codpos&,SUB(srt%,20))
  3719.       IF e%<env_codmax&(ss_menue%)
  3720.         GOSUB bee(TRUE)
  3721.         a%=env_conv&(e%,ss_menue%)              ! Numero de la commande a inserer
  3722.         b%=FN env_comlen(a%)                    ! Determination de la taille
  3723.         GOSUB chg_env_rellength(env_num&,ss_menue%,env_sect&,env_poscurs&,b%)
  3724.         d%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,env_poscurs&)
  3725.         c%=ADD(FN env_sectadr(env_num&,ss_menue%,env_sect&),d%)
  3726.         BYTE{c%}=a%
  3727.         IF b%=2
  3728.           BYTE{SUCC(c%)}=env_valdef&(e%,ss_menue%)
  3729.         ELSE IF b%=3
  3730.           CARD{SUCC(c%)}=env_valdef&(e%,ss_menue%)
  3731.         ENDIF
  3732.         GOSUB chg_env_adrjump(env_num&,ss_menue%,env_sect&,d%,b%)
  3733.         INC env_poscurs&
  3734.         env_posaff&=MAX(MIN(env_posaff&,env_poscurs&),SUB(env_poscurs&,9))
  3735.         GOSUB bee(FALSE)
  3736.         GOSUB affiche_icones_envelopped
  3737.       ENDIF
  3738.       ' ----------------------------------------------------------------------
  3739.     CASE 30,31                  ! Fleches de defilement de l'enveloppe
  3740.       a%=MUL(PRED(SHL(SUB(srt%,30),1)),SHL(1,PRED(km%)))
  3741.       b%=FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,FN env_sectlen(env_num&,ss_menue%,env_sect&))
  3742.       env_poscurs&=MIN(MAX(ADD(env_poscurs&,a%),0),b%)
  3743.       env_posaff&=MAX(MIN(env_posaff&,env_poscurs&),SUB(env_poscurs&,9))
  3744.       GOSUB affiche_icones_envelopped
  3745.       flag_relachement!=FALSE
  3746.       ' ----------------------------------------------------------------------
  3747.     CASE 32,33                  ! Fleches de defilement des commandes
  3748.       env_codpos&=MIN(MAX(ADD(env_codpos&,PRED(SHL(SUB(srt%,32),1))),0),PRED(env_codmax&(ss_menue%)))
  3749.       GOSUB affiche_icones_enveloppec
  3750.       flag_relachement!=FALSE
  3751.       ' ----------------------------------------------------------------------
  3752.     CASE 34 TO 36               ! Type d'enveloppe
  3753.       ss_menue%=SUB(srt%,34)
  3754.       env_posaff&=0
  3755.       env_poscurs&=0
  3756.       env_codpos&=0
  3757.       GOSUB affiche_icones_enveloppeb
  3758.       ' ----------------------------------------------------------------------
  3759.     CASE 37,38                  ! Type de section
  3760.       env_sect&=SUB(srt%,37)
  3761.       env_posaff&=0
  3762.       env_poscurs&=0
  3763.       env_codpos&=0
  3764.       GOSUB affiche_icones_enveloppeb
  3765.       ' ----------------------------------------------------------------------
  3766.     CASE 39                     ! Numero de l'enveloppe
  3767.       GOSUB edite_chaine(HEX$(env_num&,2),ADD(divbi&(0,39,17),9),ADD(divbi&(1,39,17),2),2,1)
  3768.       env_num&=MIN(MAX(VAL("$"+bbbb$),1),63)
  3769.       env_poscurs&=0
  3770.       env_posaff&=0
  3771.       GOSUB affiche_icones_enveloppeb
  3772.       ' ----------------------------------------------------------------------
  3773.     CASE 40,41                  ! Enveloppe +/-
  3774.       env_num&=MAX(MIN(ADD(env_num&,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,40),km%))),63),1)
  3775.       env_poscurs&=0
  3776.       env_posaff&=0
  3777.       GOSUB affiche_icones_enveloppeb
  3778.       IF km%=1
  3779.         PAUSE 2
  3780.       ENDIF
  3781.       flag_relachement!=FALSE
  3782.       ' ----------------------------------------------------------------------
  3783.     CASE 43                     ! Nom de l'enveloppe
  3784.       GOSUB edite_chaine(FN envelopename$(env_num&,ss_menue%),SUCC(divbi&(0,43,17)),ADD(divbi&(1,43,17),2),20,0)
  3785.       GOSUB chg_envelopename(bbbb$,env_num&,ss_menue%)
  3786.       GOSUB affiche_icones_enveloppeb
  3787.       ' ----------------------------------------------------------------------
  3788.     CASE 46                     ! Numero de Copy
  3789.       GOSUB edite_chaine(HEX$(env_copy&,2),SUCC(divbi&(0,46,17)),ADD(divbi&(1,46,17),2),2,1)
  3790.       env_copy&=MIN(MAX(VAL("$"+bbbb$),1),63)
  3791.       GOSUB affiche_icones_enveloppeb
  3792.       ' ----------------------------------------------------------------------
  3793.     CASE 47,48                  ! Copy +/-
  3794.       env_copy&=MAX(MIN(ADD(env_copy&,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,47),km%))),63),1)
  3795.       GOSUB affiche_icones_enveloppeb
  3796.       IF km%=1
  3797.         PAUSE 2
  3798.       ENDIF
  3799.       flag_relachement!=FALSE
  3800.       ' ----------------------------------------------------------------------
  3801.     DEFAULT
  3802.       ' Icones normales
  3803.       GOSUB affiche_icone_b(srt%,17,0,0,-1)
  3804.       GOSUB wait_mouse(TRUE)
  3805.       SELECT srt%
  3806.         ' --------------------------------------------------------------------
  3807.       CASE 42                   ! Clear Envelope
  3808.         a$=MID$("volume tone   panning",SUCC(MUL(ss_menue%,7)),7)
  3809.         GOSUB dialog("CLEAR ENVELOPE","Do you want to clear|"+a$+" envelope #"+HEX$(env_num&,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  3810.         IF bouton%=0
  3811.           GOSUB bee(TRUE)
  3812.           GOSUB chg_env_length(env_num&,ss_menue%,0,1)
  3813.           GOSUB chg_env_length(env_num&,ss_menue%,1,1)
  3814.           GOSUB chg_envelopename("",env_num&,ss_menue%)
  3815.           env_poscurs&=0
  3816.           env_posaff&=0
  3817.           GOSUB bee(FALSE)
  3818.           GOSUB affiche_icones_envelopped
  3819.           GOSUB aff_message(a$+" envelope "+HEX$(env_num&,2)+" cleared.")
  3820.         ENDIF
  3821.         ' --------------------------------------------------------------------
  3822.       CASE 44                   ! Delete Command
  3823.         d%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,env_poscurs&)
  3824.         IF d%>=0
  3825.           GOSUB bee(TRUE)
  3826.           IF FN pos_enveloppe(env_num&,ss_menue%,env_sect&,1)>=0
  3827.             b%=ADD(FN env_sectadr(env_num&,ss_menue%,env_sect&),d%)
  3828.             a%=BYTE{b%}
  3829.             b%=FN env_comlen(a%)                ! Determination de la taille
  3830.             GOSUB chg_env_rellength(env_num&,ss_menue%,env_sect&,env_poscurs&,-b%)
  3831.             GOSUB chg_env_adrjump(env_num&,ss_menue%,env_sect&,d%,-b%)
  3832.           ELSE
  3833.             GOSUB chg_env_length(env_num&,ss_menue%,env_sect&,1)        ! End obligatoire si aucune commande
  3834.           ENDIF
  3835.           GOSUB bee(FALSE)
  3836.         ENDIF
  3837.         GOSUB affiche_icones_envelopped
  3838.         ' --------------------------------------------------------------------
  3839.       CASE 45                   ! Copy Envelope
  3840.         IF env_num&<>env_copy&
  3841.           a$=MID$("volume tone   panning",SUCC(MUL(ss_menue%,7)),7)
  3842.           GOSUB dialog("COPY ENVELOPE","Do you want to copy|"+a$+" envelope #"+HEX$(env_copy&,2)+"|to envelope #"+HEX$(env_num&,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  3843.           IF bouton%=0
  3844.             GOSUB bee(TRUE)
  3845.             FOR i%=0 TO 1
  3846.               b%=FN env_sectlen(env_copy&,ss_menue%,i%)
  3847.               GOSUB chg_env_length(env_num&,ss_menue%,i%,b%)
  3848.               a%=FN env_sectadr(env_copy&,ss_menue%,i%)
  3849.               BMOVE a%,FN env_sectadr(env_num&,ss_menue%,i%),b%
  3850.             NEXT i%
  3851.             GOSUB chg_envelopename(FN envelopename$(env_copy&,ss_menue%),env_num&,ss_menue%)
  3852.             env_poscurs&=0
  3853.             env_posaff&=0
  3854.             GOSUB aff_message(a$+" envelope "+HEX$(env_copy&,2)+" copied to envelope "+HEX$(env_num&,2)+".")
  3855.             GOSUB bee(FALSE)
  3856.             GOSUB affiche_icones_envelopped
  3857.           ENDIF
  3858.         ENDIF
  3859.         ' --------------------------------------------------------------------
  3860.       ENDSELECT
  3861.       GOSUB affiche_icone_b(srt%,17,0,0,0)
  3862.     ENDSELECT
  3863.     GOSUB wait_mouse(flag_relachement!)
  3864.     GOSUB vide_buffer_clavier
  3865.   ENDIF
  3866. RETURN
  3867. ' Control
  3868. PROCEDURE affiche_icones_control
  3869.   LOCAL i%
  3870.   IF ss_menuc%=2
  3871.     GOSUB affiche_icones_control2
  3872.   ELSE
  3873.     GOSUB cadre_int(20,35,14,69,13,13,14,12)
  3874.     GOSUB cadre_int(35,35,15,39,13,13,14,12)
  3875.     GOSUB cadre_int(35,75,15,29,13,13,14,12)
  3876.     GOSUB cadre_int(51,35,28,69,13,13,14,12)
  3877.     GOSUB affchaine_trans("PANNING",72,42,14)
  3878.     GOSUB affiche_bloc_icones_b(0,2,25,0,0)
  3879.     GOSUB affiche_bloc_icones_b(8,6,25,0,0)
  3880.     GOSUB cadre_ext(ADD(divbi&(0,8,25),6),ADD(divbi&(1,8,25),2),2,5,0,13,12,14)
  3881.     GOSUB cadre_ext(ADD(divbi&(0,11,25),6),ADD(divbi&(1,11,25),2),2,5,0,13,12,14)
  3882.     FOR i%=18 TO 46 STEP 4
  3883.       GOSUB cadre_ext(divbi&(0,i%,25),divbi&(1,i%,25),divbi&(2,i%,25),divbi&(3,i%,25),0,13,12,14)
  3884.       GOSUB affiche_bloc_icones_b(SUCC(i%),2,25,0,0)
  3885.       GOSUB cadre_ext(divbi&(0,ADD(i%,3),25),divbi&(1,ADD(i%,3),25),divbi&(2,ADD(i%,3),25),divbi&(3,ADD(i%,3),25),0,13,12,14)
  3886.     NEXT i%
  3887.     GOSUB affiche_icones_controlb
  3888.   ENDIF
  3889. RETURN
  3890. PROCEDURE affiche_icones_controlb
  3891.   LOCAL i%,n%,t%
  3892.   IF ss_menuc%=2
  3893.     GOSUB affiche_icones_controlb2
  3894.   ELSE
  3895.     FOR i%=0 TO 3
  3896.       GOSUB affiche_icone_b(ADD(14,i%),25,0,0,i%=ss_menuc_npan%)
  3897.     NEXT i%
  3898.     FOR i%=0 TO 7
  3899.       n%=ADD(MUL(i%,4),21)
  3900.       t%=ADD(SHL(ss_menuc_npan%,3),i%)
  3901.       GOSUB cadre_int(divbi&(0,n%,25),divbi&(1,ADD(18,MUL(i%,4)),25),1,5,13,13,13,13)
  3902.       GOSUB affchaine_trans(STR$(SUCC(t%),2),SHL(divbi&(0,n%,25),1),divbi&(1,ADD(18,MUL(i%,4)),25),14)
  3903.     NEXT i%
  3904.     GOSUB affiche_icones_controlc(TRUE)
  3905.     GOSUB affiche_icones_controld(TRUE)
  3906.   ENDIF
  3907. RETURN
  3908. PROCEDURE affiche_icones_controlc(update!)
  3909.   LOCAL a%
  3910.   a%=FN mod_tempo
  3911.   IF a%<>control_old%(8) OR update!
  3912.     GOSUB affchaine_notrans(STR$(a%,3),ADD(divbi&(0,8,25),6),ADD(divbi&(1,8,25),2),1)
  3913.     control_old%(8)=a%
  3914.   ENDIF
  3915.   a%=CARD{r_mod_speed%}
  3916.   IF a%<>control_old%(9) OR update!
  3917.     GOSUB affchaine_notrans(STR$(a%,3),ADD(divbi&(0,11,25),6),ADD(divbi&(1,11,25),2),1)
  3918.     control_old%(9)=a%
  3919.   ENDIF
  3920. RETURN
  3921. PROCEDURE affiche_icones_controld(update!)
  3922.   '
  3923.   ' Les pannings
  3924.   ' ------------
  3925.   LOCAL i%,n%,p%
  3926.   FOR i%=0 TO 7
  3927.     p%=FN balance(ADD(SHL(ss_menuc_npan%,3),i%))
  3928.     IF p%<>control_old%(i%) OR update!
  3929.       n%=ADD(MUL(i%,4),21)
  3930.       GOSUB affchaine_notrans(HEX$(p%,3),divbi&(0,SUB(n%,3),25),divbi&(1,SUB(n%,3),25),1)
  3931.       GOSUB affiche_slider_h(divbi&(0,n%,25),divbi&(1,n%,25),divbi&(2,n%,25),p%,4095)
  3932.       control_old%(i%)=p%
  3933.     ENDIF
  3934.   NEXT i%
  3935. RETURN
  3936. PROCEDURE gere_icones_control
  3937.   LOCAL a%,b%,c%,srt%
  3938.   LOCAL flag_relachement!
  3939.   LOCAL a$
  3940.   IF ss_menuc%=2
  3941.     GOSUB gere_icones_control2
  3942.   ELSE
  3943.     flag_relachement!=TRUE
  3944.     a%=V:divbi&(0,0,0)
  3945.     srt%=C:g_teste_icones%(L:a%,W:25,W:xm%,W:ym%)
  3946.     IF srt%>=0
  3947.       SELECT srt%
  3948.         ' Radio-boutons, Flip-flops ou champs de texte
  3949.         ' ----------------------------------------------------------------------
  3950.       CASE 8      ! Tempo
  3951.         a%=FN mod_tempo
  3952.         GOSUB edite_chaine(STR$(a%,3),ADD(divbi&(0,srt%,25),6),ADD(divbi&(1,srt%,25),2),3,2)
  3953.         a%=MIN(MAX(VAL(bbbb$),1),999)
  3954.         GOSUB chg_tempo(a%)
  3955.         GOSUB affiche_icones_controlc(TRUE)
  3956.         ' ----------------------------------------------------------------------
  3957.       CASE 9,10   ! Tempo +/-
  3958.         a%=FN mod_tempo
  3959.         a%=MAX(MIN(ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%))),999),1)
  3960.         GOSUB chg_tempo(a%)
  3961.         GOSUB affiche_icones_controlc(TRUE)
  3962.         IF km%=1
  3963.           PAUSE 8
  3964.         ENDIF
  3965.         flag_relachement!=FALSE
  3966.         ' ----------------------------------------------------------------------
  3967.       CASE 11     ! Speed
  3968.         a%=FN mod_speed
  3969.         GOSUB edite_chaine(STR$(a%,3),ADD(divbi&(0,srt%,25),6),ADD(divbi&(1,srt%,25),2),3,2)
  3970.         a%=MIN(MAX(VAL(bbbb$),1),255)
  3971.         GOSUB chg_speed(a%)
  3972.         GOSUB affiche_icones_controlc(TRUE)
  3973.         ' ----------------------------------------------------------------------
  3974.       CASE 12,13  ! Speed +/-
  3975.         a%=FN mod_speed
  3976.         a%=MAX(MIN(ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,12),km%))),255),1)
  3977.         GOSUB chg_speed(a%)
  3978.         GOSUB affiche_icones_controlc(TRUE)
  3979.         IF km%=1
  3980.           PAUSE 8
  3981.         ENDIF
  3982.         flag_relachement!=FALSE
  3983.         ' ----------------------------------------------------------------------
  3984.       CASE 14 TO 17       ! Numero de plage des pannings
  3985.         ss_menuc_npan%=SUB(srt%,14)
  3986.         GOSUB affiche_icones_controlb
  3987.         ' ----------------------------------------------------------------------
  3988.       CASE 18,22,26,30,34,38,42,46                                ! Valeur Panning
  3989.         b%=ADD(SHL(ss_menuc_npan%,3),DIV(SUB(srt%,18),4))
  3990.         a%=FN balance(b%)
  3991.         GOSUB edite_chaine(HEX$(a%,3),divbi&(0,srt%,25),divbi&(1,srt%,25),3,1)
  3992.         a%=MIN(MAX(VAL("$"+bbbb$),0),4095)
  3993.         GOSUB chg_t_balance(b%,a%)
  3994.         GOSUB affiche_icones_controld(TRUE)
  3995.         ' ----------------------------------------------------------------------
  3996.       CASE 19,20,23,24,27,28,31,32,35,36,39,40,43,44,47,48        ! Panning +/-
  3997.         SELECT km%
  3998.         CASE 1
  3999.           c%=1
  4000.         CASE 2
  4001.           c%=&H10
  4002.         CASE 3
  4003.           c%=&H80
  4004.         ENDSELECT
  4005.         b%=ADD(SHL(ss_menuc_npan%,3),DIV(SUB(srt%,19),4))
  4006.         a%=FN balance(b%)
  4007.         a%=MAX(MIN(ADD(a%,SUB(MUL(SUB(srt%,19) MOD 4,SHL(c%,1)),c%)),4095),0)
  4008.         GOSUB chg_t_balance(b%,a%)
  4009.         GOSUB affiche_icones_controlc(TRUE)
  4010.         IF km%=1
  4011.           PAUSE 6
  4012.         ENDIF
  4013.         flag_relachement!=FALSE
  4014.         GOSUB affiche_icones_controld(FALSE)
  4015.         ' ----------------------------------------------------------------------
  4016.       CASE 21,25,29,33,37,41,45,49                                ! Slider Panning
  4017.         a%=MIN(4095,MUL(4095,SUB(xm%,SHL(divbi&(0,srt%,25),3)))/ADD(SHL(divbi&(2,srt%,25),3),6)+0.999)
  4018.         b%=ADD(SHL(ss_menuc_npan%,3),DIV(SUB(srt%,21),4))
  4019.         GOSUB chg_t_balance(b%,a%)
  4020.         GOSUB affiche_icones_controld(FALSE)
  4021.         flag_relachement!=FALSE
  4022.         ' ----------------------------------------------------------------------
  4023.       CASE 2 TO 7       ! Rien de rien...
  4024.         ' ----------------------------------------------------------------------
  4025.       DEFAULT
  4026.         ' Icones normales
  4027.         GOSUB affiche_icone_b(srt%,25,0,0,-1)
  4028.         GOSUB wait_mouse(TRUE)
  4029.         SELECT srt%
  4030.           ' --------------------------------------------------------------------
  4031.         CASE 0    ! Page suivante
  4032.           ss_menuc%=2
  4033.           GOSUB affiche_icones_control
  4034.           ' --------------------------------------------------------------------
  4035.         CASE 1    ! Reset des balances
  4036.           GOSUB dialog("PAN RESET","Which setting do you want?||- Standard : as on a ProTracker|module, L-R-R-L-L-R...|- Mono","Standard|Mono|Cancel",MOUSEX,MOUSEY)
  4037.           IF bouton%=0
  4038.             GOSUB balance_reset
  4039.           ELSE IF bouton%=1
  4040.             a$=STRING$(32,MKI$(&H800))
  4041.             GOSUB set_balance(a$)
  4042.           ENDIF
  4043.           GOSUB affiche_icones_controlb
  4044.           ' --------------------------------------------------------------------
  4045.         ENDSELECT
  4046.         IF ss_menuc%=1
  4047.           GOSUB affiche_icone_b(srt%,25,0,0,0)
  4048.         ENDIF
  4049.       ENDSELECT
  4050.       GOSUB wait_mouse(flag_relachement!)
  4051.       GOSUB vide_buffer_clavier
  4052.     ENDIF
  4053.   ENDIF
  4054. RETURN
  4055. PROCEDURE affiche_icones_control2
  4056.   LOCAL i%
  4057.   GOSUB cadre_int(20,35,9,69,13,13,14,12)
  4058.   GOSUB cadre_int(30,35,4,69,13,13,14,12)
  4059.   GOSUB cadre_int(35,35,19,39,13,13,14,12)
  4060.   GOSUB cadre_int(35,75,19,29,13,13,14,12)
  4061.   GOSUB cadre_int(55,35,24,69,13,13,14,12)
  4062.   GOSUB affchaine_trans("L    R",44,37,14)
  4063.   GOSUB affchaine_trans("M",64,37,14)
  4064.   GOSUB affchaine_trans("VOLUME",72,42,14)
  4065.   FOR i%=2 TO 7
  4066.     GOSUB cadre_ext(divbi&(0,i%,31),divbi&(1,i%,31),divbi&(2,i%,31),divbi&(3,i%,31),0,13,12,14)
  4067.   NEXT i%
  4068.   GOSUB affiche_bloc_icones_b(0,2,31,0,0)
  4069.   FOR i%=12 TO 19
  4070.     GOSUB cadre_ext(divbi&(0,i%,31),divbi&(1,i%,31),divbi&(2,i%,31),divbi&(3,i%,31),0,13,12,14)
  4071.   NEXT i%
  4072.   GOSUB affiche_icones_controlb
  4073. RETURN
  4074. PROCEDURE affiche_icones_controlb2
  4075.   LOCAL i%,n%,t%
  4076.   FOR i%=0 TO 3
  4077.     GOSUB affiche_icone_b(ADD(8,i%),31,0,0,i%=ss_menuc2_nvol%)
  4078.   NEXT i%
  4079.   FOR i%=0 TO 7
  4080.     n%=ADD(i%,12)
  4081.     t%=ADD(SHL(ss_menuc2_nvol%,3),i%)
  4082.     GOSUB cadre_int(divbi&(0,n%,31),SUB(divbi&(1,n%,31),8),1,5,13,13,13,13)
  4083.     GOSUB affchaine_trans(STR$(SUCC(t%),2),SHL(divbi&(0,n%,31),1),SUB(divbi&(1,n%,31),8),14)
  4084.   NEXT i%
  4085.   GOSUB affiche_icones_controlc2(TRUE)
  4086.   GOSUB affiche_icones_controld2(TRUE)
  4087. RETURN
  4088. PROCEDURE affiche_icones_controlc2(update!)
  4089.   '
  4090.   ' Les volumes generaux
  4091.   ' --------------------
  4092.   LOCAL v%
  4093.   ' Left du CoDec
  4094.   v%=SUB(15,PEEK(&HFFFF893A) AND 15)
  4095.   IF v%<>control_old%(10) OR update!
  4096.     GOSUB affchaine_notrans(STR$(v%,3),divbi&(0,3,25),divbi&(1,3,25),1)
  4097.     GOSUB affiche_slider_v(divbi&(0,2,25),divbi&(1,2,25),divbi&(2,2,25),divbi&(3,2,25),v%,15)
  4098.     control_old%(10)=v%
  4099.   ENDIF
  4100.   ' Right du CoDec
  4101.   v%=SUB(15,SHR(PEEK(&HFFFF893B),4))
  4102.   IF v%<>control_old%(11) OR update!
  4103.     GOSUB affchaine_notrans(STR$(v%,3),divbi&(0,5,25),divbi&(1,5,25),1)
  4104.     GOSUB affiche_slider_v(divbi&(0,4,25),divbi&(1,4,25),divbi&(2,4,25),divbi&(3,4,25),v%,15)
  4105.     control_old%(11)=v%
  4106.   ENDIF
  4107.   ' Master du sountracker
  4108.   v%=CARD{r_master_vol%}
  4109.   IF v%<>control_old%(12) OR update!
  4110.     GOSUB affchaine_notrans(HEX$(v%,3),divbi&(0,7,25),divbi&(1,7,25),1)
  4111.     GOSUB affiche_slider_v(divbi&(0,6,25),divbi&(1,6,25),divbi&(2,6,25),divbi&(3,6,25),v%,4095)
  4112.     control_old%(12)=v%
  4113.   ENDIF
  4114. RETURN
  4115. PROCEDURE affiche_icones_controld2(update!)
  4116.   '
  4117.   ' Les volumes exponentiels de chaque voie
  4118.   ' ---------------------------------------
  4119.   ' Affichage entre $800 et $E00
  4120.   LOCAL i%,n%,p%,v%,v2%
  4121.   FOR i%=0 TO 7
  4122.     v%=FN track_volume_exp(ADD(SHL(ss_menuc2_nvol%,3),i%))
  4123.     p%=ADD(i%,12)
  4124.     IF v%<>control_old%(ADD(i%,13)) OR update!
  4125.       v2%=MAX(MIN(SUB(v%,&H800),&H600),0)
  4126.       n%=ADD(MUL(i%,4),21)
  4127.       GOSUB affiche_slider_v(divbi&(0,p%,31),divbi&(1,p%,31),divbi&(2,p%,31),divbi&(3,p%,31),v2%,&H600)
  4128.       control_old%(ADD(i%,13))=v%
  4129.     ENDIF
  4130.   NEXT i%
  4131. RETURN
  4132. PROCEDURE gere_icones_control2
  4133.   LOCAL a%,b%,c%,srt%
  4134.   LOCAL flag_relachement!
  4135.   LOCAL a$
  4136.   flag_relachement!=TRUE
  4137.   a%=V:divbi&(0,0,0)
  4138.   srt%=C:g_teste_icones%(L:a%,W:31,W:xm%,W:ym%)
  4139.   IF srt%>=0
  4140.     SELECT srt%
  4141.       ' Radio-boutons, Flip-flops ou champs de texte
  4142.       ' ----------------------------------------------------------------------
  4143.     CASE 2      ! Slider Left amplification
  4144.       a%=MUL(15,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  4145.       SPOKE &HFFFF893A,SUB(15,a%)
  4146.       GOSUB affiche_icones_controlc2(FALSE)
  4147.       flag_relachement!=FALSE
  4148.       ' ----------------------------------------------------------------------
  4149.     CASE 3      ! Valeur Left amplification
  4150.       a%=SUB(15,PEEK(&HFFFF893A) AND 15)
  4151.       GOSUB edite_chaine(STR$(a%,3),divbi&(0,srt%,31),divbi&(1,srt%,31),3,2)
  4152.       a%=MIN(MAX(VAL(bbbb$),0),15)
  4153.       SPOKE &HFFFF893A,SUB(15,a%)
  4154.       GOSUB affiche_icones_controlc2(TRUE)
  4155.       ' ----------------------------------------------------------------------
  4156.     CASE 4      ! Slider Right amplification
  4157.       a%=MUL(15,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  4158.       SPOKE &HFFFF893B,SHL(SUB(15,a%),4)
  4159.       GOSUB affiche_icones_controlc2(FALSE)
  4160.       flag_relachement!=FALSE
  4161.       ' ----------------------------------------------------------------------
  4162.     CASE 5      ! Valeur Right amplification
  4163.       a%=SUB(15,SHR(PEEK(&HFFFF893B),4))
  4164.       GOSUB edite_chaine(STR$(a%,3),divbi&(0,srt%,31),divbi&(1,srt%,31),3,2)
  4165.       a%=MIN(MAX(VAL(bbbb$),0),15)
  4166.       SPOKE &HFFFF893B,SHL(SUB(15,a%),4)
  4167.       GOSUB affiche_icones_controlc2(TRUE)
  4168.       ' ----------------------------------------------------------------------
  4169.     CASE 6      ! Slider Master volume
  4170.       a%=MUL(4095,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  4171.       CARD{r_master_vol%}=a%
  4172.       GOSUB affiche_icones_controlc2(FALSE)
  4173.       flag_relachement!=FALSE
  4174.       ' ----------------------------------------------------------------------
  4175.     CASE 7      ! Valeur Master volume
  4176.       a%=CARD{r_master_vol%}
  4177.       GOSUB edite_chaine(HEX$(a%,3),divbi&(0,srt%,31),divbi&(1,srt%,31),3,1)
  4178.       a%=MIN(MAX(VAL("$"+bbbb$),0),4095)
  4179.       CARD{r_master_vol%}=a%
  4180.       GOSUB affiche_icones_controlc2(TRUE)
  4181.       ' ----------------------------------------------------------------------
  4182.     CASE 8 TO 11        ! Numero de plage des volumes
  4183.       ss_menuc2_nvol%=SUB(srt%,8)
  4184.       GOSUB affiche_icones_controlb
  4185.       ' ----------------------------------------------------------------------
  4186.     CASE 12 TO 19       ! Slider volume d'une voie ou entree a la main
  4187.       b%=ADD(SHL(ss_menuc2_nvol%,3),SUB(srt%,12))
  4188.       IF km%=2          ! Entree de la valeur
  4189.       ELSE              ! Slider: entre $800 et $E00
  4190.         a%=MUL(&H600,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  4191.         ADD a%,&H800
  4192.         GOSUB chg_t_mix_volume_e(b%,a%)
  4193.         flag_relachement!=FALSE
  4194.       ENDIF
  4195.       GOSUB affiche_icones_controld2(FALSE)
  4196.       ' ----------------------------------------------------------------------
  4197.     DEFAULT
  4198.       ' Icones normales
  4199.       GOSUB affiche_icone_b(srt%,31,0,0,-1)
  4200.       GOSUB wait_mouse(TRUE)
  4201.       SELECT srt%
  4202.         ' --------------------------------------------------------------------
  4203.       CASE 0    ! Page precedente
  4204.         ss_menuc%=1
  4205.         GOSUB affiche_icones_control
  4206.         ' --------------------------------------------------------------------
  4207.       CASE 1    ! Reset des volumes
  4208.         GOSUB dialog("VOLUME RESET","Reset all the|track volumes.","OK|Cancel",MOUSEX,MOUSEY)
  4209.         IF bouton%=0
  4210.           GOSUB track_volume_reset
  4211.         ENDIF
  4212.         GOSUB affiche_icones_controlb
  4213.         ' --------------------------------------------------------------------
  4214.       ENDSELECT
  4215.       IF ss_menuc%=2
  4216.         GOSUB affiche_icone_b(srt%,31,0,0,0)
  4217.       ENDIF
  4218.     ENDSELECT
  4219.     GOSUB wait_mouse(flag_relachement!)
  4220.     GOSUB vide_buffer_clavier
  4221.   ENDIF
  4222. RETURN
  4223. ' Midi
  4224. PROCEDURE affiche_icones_midi
  4225.   IF ss_menum%=2
  4226.     GOSUB affiche_icones_midi2
  4227.   ELSE
  4228.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  4229.     GOSUB cadre_int(20,35,14,29,13,13,14,12)
  4230.     GOSUB cadre_int(35,35,11,39,13,13,14,12)
  4231.     GOSUB cadre_int(47,35,19,39,13,13,14,12)
  4232.     GOSUB cadre_int(20,65,14,39,13,13,14,12)
  4233.     GOSUB affiche_bloc_icones_b(8,7,27,0,0)
  4234.     GOSUB affchaine_trans("MIDI",42,41,14)
  4235.     GOSUB affchaine_trans("SYNC",42,53,14)
  4236.     GOSUB affchaine_trans("OPTIONS",72,40,14)
  4237.     GOSUB affchaine_trans("MONOPHONIC MODE",96,40,14)
  4238.     GOSUB affchaine_trans("REC. MODE",42,70,14)
  4239.     GOSUB cadre_ext(ADD(divbi&(0,8,27),11),ADD(divbi&(1,8,27),2),1,5,0,13,12,14)
  4240.     GOSUB cadre_ext(ADD(divbi&(0,11,27),11),ADD(divbi&(1,11,27),2),1,5,0,13,12,14)
  4241.     GOSUB affiche_icones_midib
  4242.   ENDIF
  4243. RETURN
  4244. PROCEDURE affiche_icones_midib
  4245.   LOCAL a$
  4246.   GOSUB affiche_icone_b(0,27,0,0,midi_flag_data_in!)
  4247.   GOSUB affiche_icone_b(1,27,0,0,midi_flag_data_out!)
  4248.   GOSUB affiche_icone_b(2,27,0,0,midi_flag_synchro%=1)
  4249.   GOSUB affiche_icone_b(3,27,0,0,midi_flag_synchro%=2)
  4250.   GOSUB affiche_icone_b(6,27,0,0,NOT midi_polyphonic_mode!)
  4251.   GOSUB affiche_icone_b(7,27,0,0,midi_polyphonic_mode!)
  4252.   GOSUB affchaine_notrans(STR$(midi_monomode_channel_nbr%,2),ADD(divbi&(0,8,27),11),ADD(divbi&(1,8,27),2),1)
  4253.   IF midi_monomode_instr_nbr%=0
  4254.     a$="C."
  4255.   ELSE
  4256.     a$=HEX$(midi_monomode_instr_nbr%,2)
  4257.   ENDIF
  4258.   GOSUB affchaine_notrans(a$,ADD(divbi&(0,11,27),11),ADD(divbi&(1,11,27),2),1)
  4259.   '
  4260.   GOSUB grise_icone(1,27,0,0)
  4261.   GOSUB grise_icone(3,27,0,0)
  4262.   GOSUB grise_icone(6,27,0,0)
  4263. RETURN
  4264. PROCEDURE gere_icones_midi              !!!
  4265.   LOCAL a%,b%,c%,d%,e%,i%,srt%
  4266.   LOCAL flag_relachement!
  4267.   LOCAL a$
  4268.   IF ss_menum%=2
  4269.     GOSUB gere_icones_midi2
  4270.   ELSE
  4271.     flag_relachement!=TRUE
  4272.     a%=V:divbi&(0,0,0)
  4273.     srt%=C:g_teste_icones%(L:a%,W:27,W:xm%,W:ym%)
  4274.     IF srt%>=0
  4275.       SELECT srt%
  4276.         ' Radio-boutons, Flip-flops ou champs de texte
  4277.         ' ----------------------------------------------------------------------
  4278.       CASE 0            ! In  On/Off
  4279.         GOSUB chg_midi_flag_data_in(NOT midi_flag_data_in!)
  4280.         IF midi_flag_synchro%=1
  4281.           IF midi_flag_data_in!
  4282.             GOSUB chg_tempo2(500)
  4283.           ELSE
  4284.             GOSUB chg_tempo(FN mod_tempo)
  4285.           ENDIF
  4286.         ENDIF
  4287.         GOSUB affiche_icones_midib
  4288.         ' ----------------------------------------------------------------------
  4289.       CASE 1            ! Out On/Off
  4290.         ' GOSUB chg_midi_flag_data_in(NOT midi_flag_data_in!)
  4291.         ' GOSUB affiche_icones_midib
  4292.         '
  4293.         '
  4294.         '
  4295.         '
  4296.         ' ----------------------------------------------------------------------
  4297.       CASE 2            ! Synchro In
  4298.         IF midi_flag_synchro%<>1
  4299.           midi_flag_synchro%=1
  4300.         ELSE
  4301.           midi_flag_synchro%=0
  4302.         ENDIF
  4303.         CARD{r_midi_in_sync_flag%}=SGN(midi_flag_synchro%)
  4304.         IF midi_flag_synchro%=1
  4305.           GOSUB chg_tempo2(500)                 ! 500 BPM pour une synchro midi correcte
  4306.         ELSE
  4307.           GOSUB chg_tempo(FN mod_tempo)         ! Remet l'ancienne valeur quand plus de sync
  4308.         ENDIF
  4309.         GOSUB affiche_icones_midib
  4310.         ' ----------------------------------------------------------------------
  4311.       CASE 3            ! Synchro Out
  4312.         ' IF midi_flag_synchro%<>2
  4313.         '   midi_flag_synchro%=2
  4314.         ' ELSE
  4315.         '   midi_flag_synchro%=0
  4316.         ' ENDIF
  4317.         ' CARD{r_midi_out_sync_flag%}=SGN(midi_flag_synchro%)
  4318.         ' GOSUB chg_tempo(FN mod_tempo)
  4319.         ' GOSUB affiche_icones_midib
  4320.         '
  4321.         '
  4322.         '
  4323.         '
  4324.         ' ----------------------------------------------------------------------
  4325.       CASE 6            ! Monophonic mode
  4326.         '
  4327.         '
  4328.         '
  4329.         '
  4330.         ' ----------------------------------------------------------------------
  4331.       CASE 7            ! Polyphonic mode
  4332.         '
  4333.         '
  4334.         '
  4335.         '
  4336.         ' ----------------------------------------------------------------------
  4337.       CASE 8            ! MIDI Channel (monophonic mode)
  4338.         GOSUB edite_chaine(STR$(midi_monomode_channel_nbr%,2),ADD(divbi&(0,srt%,27),11),ADD(divbi&(1,srt%,27),2),2,2)
  4339.         GOSUB chg_midi_monomode_channel_nbr(MIN(MAX(VAL(bbbb$),1),16))
  4340.         GOSUB affiche_icones_midib
  4341.         ' ----------------------------------------------------------------------
  4342.       CASE 9,10         ! MIDI Channel +/-
  4343.         a%=midi_monomode_channel_nbr%
  4344.         a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%)))
  4345.         GOSUB chg_midi_monomode_channel_nbr(MIN(MAX(a%,1),16))
  4346.         GOSUB affiche_icones_midib
  4347.         IF km%=1
  4348.           PAUSE 8
  4349.         ENDIF
  4350.         flag_relachement!=FALSE
  4351.         ' ----------------------------------------------------------------------
  4352.       CASE 11           ! Instrument (monophonic mode)
  4353.         IF midi_monomode_instr_nbr%=0
  4354.           a$="C."
  4355.         ELSE
  4356.           a$=HEX$(midi_monomode_instr_nbr%,2)
  4357.         ENDIF
  4358.         GOSUB edite_chaine(a$,ADD(divbi&(0,srt%,27),11),ADD(divbi&(1,srt%,27),2),2,1)
  4359.         GOSUB chg_midi_monomode_instr_nbr(MIN(MAX(VAL("$"+bbbb$),0),255))
  4360.         GOSUB affiche_icones_midib
  4361.         ' ----------------------------------------------------------------------
  4362.       CASE 12,13        ! Instrument +/-
  4363.         a%=midi_monomode_instr_nbr%
  4364.         a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,12),km%)))
  4365.         GOSUB chg_midi_monomode_instr_nbr(MIN(MAX(a%,0),255))
  4366.         GOSUB affiche_icones_midib
  4367.         IF km%=1
  4368.           PAUSE 8
  4369.         ENDIF
  4370.         flag_relachement!=FALSE
  4371.         ' ----------------------------------------------------------------------
  4372.       CASE 14           ! Page 2
  4373.         GOSUB affiche_icone_b(srt%,27,0,0,-1)
  4374.         GOSUB wait_mouse(TRUE)
  4375.         ss_menum%=2
  4376.         GOSUB affiche_icones_midi
  4377.         ' ----------------------------------------------------------------------
  4378.       CASE 4,5          ! Rien
  4379.       DEFAULT
  4380.         ' Icones normales
  4381.         GOSUB affiche_icone_b(srt%,27,0,0,TRUE)
  4382.         GOSUB wait_mouse(TRUE)
  4383.         SELECT srt%
  4384.           ' --------------------------------------------------------------------
  4385.         ENDSELECT
  4386.         GOSUB affiche_icone_b(srt%,27,0,0,FALSE)
  4387.       ENDSELECT
  4388.       GOSUB wait_mouse(flag_relachement!)
  4389.       GOSUB vide_buffer_clavier
  4390.     ENDIF
  4391.   ENDIF
  4392. RETURN
  4393. PROCEDURE affiche_icones_midi2
  4394.   LOCAL a%,i%,j%
  4395.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  4396.   GOSUB affiche_bloc_icones_b(32,10,28,0,0)
  4397.   GOSUB cadre_ext(ADD(divbi&(0,32,28),15),ADD(divbi&(1,32,28),2),1,5,0,13,12,14)
  4398.   GOSUB cadre_ext(ADD(divbi&(0,35,28),15),ADD(divbi&(1,35,28),2),1,5,0,13,12,14)
  4399.   FOR i%=0 TO 3
  4400.     GOSUB cadre_ext(SUB(divbi&(0,MUL(i%,8),28),9),SUCC(divbi&(1,MUL(i%,8),28)),32,SUB(divbi&(3,MUL(i%,8),28),2),13,13,12,14)
  4401.     GOSUB cadre_ext(divbi&(0,MUL(i%,8),28),ADD(divbi&(1,MUL(i%,8),28),9),23,5,0,13,12,14)
  4402.     GOSUB affchaine_trans("TRACK",SHL(SUB(divbi&(0,MUL(i%,8),28),8),1),ADD(divbi&(1,MUL(i%,8),28),2),14)
  4403.     GOSUB affchaine_trans("CHANNEL",SHL(SUB(divbi&(0,MUL(i%,8),28),8),1),ADD(divbi&(1,MUL(i%,8),28),9),14)
  4404.     FOR j%=0 TO 7
  4405.       a%=ADD(MUL(i%,8),j%)
  4406.       GOSUB cadre_texte3_b(divbn$(a%,28),divbi&(0,a%,28),ADD(divbi&(1,a%,28),1),divbi&(2,a%,28),7,0)
  4407.     NEXT j%
  4408.   NEXT i%
  4409.   GOSUB affiche_icones_midib2
  4410. RETURN
  4411. PROCEDURE affiche_icones_midib2
  4412.   LOCAL track%,channel%
  4413.   GOSUB affchaine_notrans(STR$(midi_polymode_channel_nbr%,2),ADD(divbi&(0,32,28),15),ADD(divbi&(1,32,28),2),1)
  4414.   GOSUB affchaine_notrans(HEX$(midi_in_instr%(PRED(midi_polymode_channel_nbr%)),2),ADD(divbi&(0,35,28),15),ADD(divbi&(1,35,28),2),1)
  4415.   FOR track%=0 TO 31
  4416.     IF track%<nbr_track%
  4417.       channel%=midi_in_channel%(track%)
  4418.       IF channel%>0
  4419.         GOSUB affchaine_notrans(STR$(channel%,2),divbi&(0,track%,28),ADD(divbi&(1,track%,28),9),1)
  4420.       ELSE
  4421.         GOSUB affchaine_notrans(MKI$(&H2005),divbi&(0,track%,28),ADD(divbi&(1,track%,28),9),1)
  4422.       ENDIF
  4423.     ELSE
  4424.       GOSUB affchaine_notrans(SPACE$(2),divbi&(0,track%,28),ADD(divbi&(1,track%,28),9),1)
  4425.     ENDIF
  4426.   NEXT track%
  4427. RETURN
  4428. PROCEDURE gere_icones_midi2
  4429.   flag_relachement!=TRUE
  4430.   a%=V:divbi&(0,0,0)
  4431.   srt%=C:g_teste_icones%(L:a%,W:28,W:xm%,W:ym%)
  4432.   IF srt%>=0
  4433.     SELECT srt%
  4434.       ' Radio-boutons, Flip-flops ou champs de texte
  4435.       ' ----------------------------------------------------------------------
  4436.     CASE 0 TO 31        ! Piste
  4437.       IF SUB(ym%,divbi&(1,srt%,28))<9           ! Partie haute: le numero de piste
  4438.         IF midi_in_channel%(srt%)<>midi_polymode_channel_nbr%
  4439.           GOSUB chg_midi_polymode_channel(srt%,midi_polymode_channel_nbr%)
  4440.         ELSE
  4441.           GOSUB chg_midi_polymode_channel(srt%,0)
  4442.         ENDIF
  4443.       ELSE                                      ! Partie basse: le numero de canal MIDI
  4444.         IF midi_in_channel%(srt%)<>0
  4445.           a%=midi_in_channel%(srt%)
  4446.           IF km%=1
  4447.             a%=MIN(SUCC(a%),16)
  4448.           ELSE IF km%=2
  4449.             a%=MAX(PRED(a%),1)
  4450.           ENDIF
  4451.           GOSUB chg_midi_polymode_channel(srt%,a%)
  4452.         ELSE
  4453.           GOSUB chg_midi_polymode_channel(srt%,midi_polymode_channel_nbr%)
  4454.         ENDIF
  4455.       ENDIF
  4456.       GOSUB affiche_icones_midib2
  4457.       ' ----------------------------------------------------------------------
  4458.     CASE 32             ! Numero de canal
  4459.       ' IF km%=2
  4460.       popup_code%(1,4)=popup_code%(1,4) AND (NOT &H20000)
  4461.       popup_code%(2,4)=popup_code%(2,4) AND (NOT &H20000)
  4462.       popup_code%(4,4)=popup_code%(4,4) AND (NOT &H20000)
  4463.       popup_code%(5,4)=popup_code%(5,4) AND (NOT &H20000)
  4464.       popup_code%(7,4)=popup_code%(7,4) AND (NOT &H20000)
  4465.       popup_code%(8,4)=popup_code%(8,4) AND (NOT &H20000)
  4466.       IF FN get_midi_flag_velocity(midi_polymode_channel_nbr%)<>0
  4467.         popup_code%(7,4)=popup_code%(7,4) OR &H20000
  4468.       ELSE
  4469.         popup_code%(8,4)=popup_code%(8,4) OR &H20000
  4470.       ENDIF
  4471.       a%=FN get_midi_flag_note_off(midi_polymode_channel_nbr%)
  4472.       IF a%=0
  4473.         popup_code%(2,4)=popup_code%(2,4) OR &H20000
  4474.         popup_code%(5,4)=popup_code%(5,4) OR &H20000
  4475.       ELSE
  4476.         popup_code%(1,4)=popup_code%(1,4) OR &H20000
  4477.         IF a%=-1
  4478.           popup_code%(4,4)=popup_code%(4,4) OR &H20000
  4479.         ELSE
  4480.           popup_code%(5,4)=popup_code%(5,4) OR &H20000
  4481.         ENDIF
  4482.       ENDIF
  4483.       a%=FN popup(4,-1,xm%,ym%)
  4484.       IF a%>=0
  4485.         a%=a% AND &HFFFF
  4486.         SELECT a%
  4487.         CASE 0          ! Melody
  4488.           GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,-1)
  4489.         CASE 1          ! Drums
  4490.           GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,0)
  4491.         CASE 10         ! Note Off transcribed
  4492.           GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,-1)
  4493.         CASE 11         ! Note Off ignored
  4494.           IF FN get_midi_flag_note_off(midi_polymode_channel_nbr%)<>0
  4495.             GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,1)
  4496.           ENDIF
  4497.         CASE 20         ! Velocity transcribed
  4498.           GOSUB chg_midi_flag_velocity(midi_polymode_channel_nbr%,TRUE)
  4499.         CASE 21         ! Velocity ignored
  4500.           GOSUB chg_midi_flag_velocity(midi_polymode_channel_nbr%,FALSE)
  4501.         ENDSELECT
  4502.       ENDIF
  4503.       ' ELSE
  4504.       '   GOSUB edite_chaine(STR$(midi_polymode_channel_nbr%,2),ADD(divbi&(0,srt%,28),15),ADD(divbi&(1,srt%,28),2),2,2)
  4505.       '   midi_polymode_channel_nbr%=MIN(MAX(VAL(bbbb$),1),16)
  4506.       ' ENDIF
  4507.       GOSUB affiche_icones_midib2
  4508.       ' ----------------------------------------------------------------------
  4509.     CASE 33,34          ! Numero de canal +/-
  4510.       a%=midi_polymode_channel_nbr%
  4511.       a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,33),km%)))
  4512.       midi_polymode_channel_nbr%=MIN(MAX(a%,1),16)
  4513.       GOSUB affiche_icones_midib2
  4514.       IF km%=1
  4515.         PAUSE 6
  4516.       ENDIF
  4517.       flag_relachement!=FALSE
  4518.       ' ----------------------------------------------------------------------
  4519.     CASE 35             ! Numero d'instrument
  4520.       GOSUB edite_chaine(HEX$(midi_in_instr%(PRED(midi_polymode_channel_nbr%)),2),ADD(divbi&(0,srt%,28),15),ADD(divbi&(1,srt%,28),2),2,1)
  4521.       GOSUB chg_midi_in_instr(PRED(midi_polymode_channel_nbr%),MIN(MAX(VAL("$"+bbbb$),1),255))
  4522.       GOSUB affiche_icones_midib2
  4523.       ' ----------------------------------------------------------------------
  4524.     CASE 36,37          ! Numero d'instrument +/-
  4525.       a%=midi_in_instr%(PRED(midi_polymode_channel_nbr%))
  4526.       a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,36),km%)))
  4527.       GOSUB chg_midi_in_instr(PRED(midi_polymode_channel_nbr%),MIN(MAX(a%,1),255))
  4528.       GOSUB affiche_icones_midib2
  4529.       IF km%=1
  4530.         PAUSE 6
  4531.       ENDIF
  4532.       flag_relachement!=FALSE
  4533.       ' ----------------------------------------------------------------------
  4534.     CASE 41             ! Page 1
  4535.       GOSUB affiche_icone_b(srt%,28,0,0,-1)
  4536.       GOSUB wait_mouse(TRUE)
  4537.       ss_menum%=1
  4538.       GOSUB affiche_icones_midi
  4539.       ' ----------------------------------------------------------------------
  4540.     DEFAULT
  4541.       ' Icones normales
  4542.       GOSUB affiche_icone_b(srt%,28,0,0,TRUE)
  4543.       GOSUB wait_mouse(TRUE)
  4544.       SELECT srt%
  4545.         ' --------------------------------------------------------------------
  4546.       CASE 38           ! Select current preset
  4547.         FOR i%=0 TO PRED(nbr_colonnes%(n_preset%))
  4548.           ' IF i%<nbr_col%
  4549.           a%=preset&(i%,n_preset%)
  4550.           IF a%<nbr_track%
  4551.             GOSUB chg_midi_polymode_channel(a%,midi_polymode_channel_nbr%)
  4552.           ENDIF
  4553.           ' ENDIF
  4554.         NEXT i%
  4555.         GOSUB affiche_icones_midib2
  4556.         ' --------------------------------------------------------------------
  4557.       CASE 39           ! Remove MIDI channel
  4558.         FOR i%=0 TO PRED(nbr_track%)
  4559.           IF midi_in_channel%(i%)=midi_polymode_channel_nbr%
  4560.             GOSUB chg_midi_polymode_channel(i%,0)
  4561.           ENDIF
  4562.         NEXT i%
  4563.         GOSUB affiche_icones_midib2
  4564.         ' --------------------------------------------------------------------
  4565.       CASE 40           ! Reset
  4566.         IF midi_polyphonic_mode!
  4567.           GOSUB reset_all_midi_track_state
  4568.           GOSUB affiche_icones_midib2
  4569.         ELSE
  4570.           GOSUB dialog("RESET TRACKS","You can't do this because you're|not in polyphonic mode.","Cancel",MOUSEX,MOUSEY)
  4571.         ENDIF
  4572.         ' --------------------------------------------------------------------
  4573.       ENDSELECT
  4574.       GOSUB affiche_icone_b(srt%,28,0,0,FALSE)
  4575.     ENDSELECT
  4576.     GOSUB wait_mouse(flag_relachement!)
  4577.     GOSUB vide_buffer_clavier
  4578.   ENDIF
  4579. RETURN
  4580. '
  4581. ' Affichages divers
  4582. ' -----------------
  4583. PROCEDURE affiche_info_sample
  4584.   LOCAL a%
  4585.   IF NOT se.sample_editor_flag!
  4586.     HIDEM
  4587.     GOSUB affchaine_notrans(" "+HEX$(instr%,2),ADD(divbi&(0,12,16),11),ADD(divbi&(1,12,16),2),1)
  4588.     GOSUB affchaine_notrans(" "+HEX$(sample%,2),ADD(divbi&(0,15,16),11),ADD(divbi&(1,15,16),2),1)
  4589.     GOSUB affchaine_notrans(FN instrname$(instr%),ADD(divbi&(0,22,16),9),ADD(divbi&(1,22,16),2),1)
  4590.   ENDIF
  4591.   IF ss_menu%=3
  4592.     GOSUB affiche_icones_instrb
  4593.   ELSE IF ss_menu%=4
  4594.     GOSUB affiche_icones_sampleb
  4595.   ENDIF
  4596. RETURN
  4597. PROCEDURE affiche_info_song
  4598.   LOCAL a$
  4599.   IF NOT se.sample_editor_flag!
  4600.     HIDEM
  4601.     GOSUB affchaine_notrans(" "+HEX$(songpos%,2),ADD(divbi&(0,0,16),11),ADD(divbi&(1,0,16),2),1)
  4602.     GOSUB affchaine_notrans(" "+HEX$(song&(songpos%),2),ADD(divbi&(0,3,16),11),ADD(divbi&(1,3,16),2),1)
  4603.     IF module&(101)<256
  4604.       GOSUB affchaine_notrans(" "+HEX$(module&(101),2),ADD(divbi&(0,6,16),11),ADD(divbi&(1,6,16),2),1)
  4605.     ELSE
  4606.       GOSUB affchaine_notrans(HEX$(module&(101),3),ADD(divbi&(0,6,16),11),ADD(divbi&(1,6,16),2),1)
  4607.     ENDIF
  4608.     GOSUB affchaine_notrans(" "+HEX$(module&(102),2),ADD(divbi&(0,9,16),11),ADD(divbi&(1,9,16),2),1)
  4609.     GOSUB affchaine_notrans(FN songname$,ADD(divbi&(0,21,16),9),ADD(divbi&(1,21,16),2),1)
  4610.     GOSUB affchaine_notrans(STR$(nbr_track%,2),ADD(divbi&(0,23,16),7),ADD(divbi&(1,23,16),2),1)
  4611.     GOSUB affchaine_notrans(STR$(FN nbr_lines3,3),ADD(divbi&(0,24,16),6),ADD(divbi&(1,24,16),2),1)
  4612.     posligne%=MAX(MIN(posligne%,PRED(FN nbr_lines3)),0)
  4613.     SELECT line_step%
  4614.     CASE -255 TO -1
  4615.       a$="-"+HEX$(ABS(line_step%),1)
  4616.     CASE 0 TO 255
  4617.       a$=HEX$(line_step%,2)
  4618.     CASE 256
  4619.       a$="NL"
  4620.     CASE 257
  4621.       a$="NN"
  4622.     CASE 258
  4623.       a$="NF"
  4624.     CASE 259
  4625.       a$="NV"
  4626.     ENDSELECT
  4627.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,18,16),5),ADD(divbi&(1,18,16),2),1)
  4628.     IF ss_menu%=2 AND ss_menut%=3
  4629.       GOSUB affiche_icones_toolsb3
  4630.     ENDIF
  4631.   ENDIF
  4632. RETURN
  4633. PROCEDURE affiche_info_preset
  4634.   LOCAL iii%,aaa%
  4635.   SELECT type_affpiste%
  4636.   CASE 0
  4637.     aaa%=6
  4638.   CASE 2
  4639.     aaa%=12
  4640.   DEFAULT
  4641.     aaa%=10
  4642.   ENDSELECT
  4643.   HIDEM
  4644.   GOSUB cadre_texte2(STR$(SUCC(n_preset%)),ADD(MUL(n_preset%,2),8),130,1,1)
  4645.   FOR iii%=0 TO PRED(nbr_col%)
  4646.     IF iii%<nbr_colonnes%(n_preset%)
  4647.       GOSUB affchaine_notrans(STR$(SUCC(preset&(iii%,n_preset%)),2),ADD(MUL(iii%,aaa%),6),162,1)
  4648.       IF FN track_onoff(preset&(iii%,n_preset%))<>0
  4649.         GOSUB affchaine_notrans(CHR$(6),ADD(MUL(iii%,aaa%),5),162,1)
  4650.       ELSE
  4651.         GOSUB affchaine_notrans(CHR$(5),ADD(MUL(iii%,aaa%),5),162,1)
  4652.       ENDIF
  4653.     ELSE
  4654.       GOSUB affchaine_notrans("   ",ADD(MUL(iii%,aaa%),5),162,1)
  4655.       GOSUB cadre_ext(ADD(MUL(iii%,aaa%),4),170,SUB(aaa%,2),PRED(MUL(haut_lig%,6)),0,9,8,10)
  4656.     ENDIF
  4657.   NEXT iii%
  4658.   GOSUB affiche_c_pattern
  4659. RETURN
  4660. PROCEDURE affiche_barre_info
  4661.   GOSUB cadre_int(1,140,70,7,9,9,9,9)           ! Efface ce qu'il y avait avant
  4662.   GOSUB affchaine_trans("OCT",2,142,10)
  4663.   GOSUB affchaine_trans(STR$(SUCC(octave%),1),10,142,8)
  4664.   GOSUB affchaine_trans("BLK",20,142,10)
  4665.   GOSUB affchaine_trans("/  :  -",32,142,8)
  4666.   GOSUB affchaine_trans(STR$(SUCC(bl_trk&),2),28,142,8)
  4667.   GOSUB affchaine_trans(HEX$(bl_pat&,2),34,142,8)
  4668.   GOSUB affchaine_trans(HEX$(bl_start&,2),40,142,8)
  4669.   GOSUB affchaine_trans(HEX$(bl_end&,2),46,142,8)
  4670.   GOSUB affchaine_trans("NUMPAD",58,142,10)
  4671.   IF drumpad_flag%=0
  4672.     GOSUB affchaine_trans("INSTRUM",72,142,8)
  4673.   ELSE IF drumpad_flag%=1
  4674.     GOSUB affchaine_trans("SAMPLES",72,142,8)
  4675.   ELSE
  4676.     GOSUB affchaine_trans("DRUMKIT",72,142,8)
  4677.   ENDIF
  4678.   GOSUB affchaine_trans("FREE       Kb",94,142,10)
  4679.   GOSUB affchaine_trans(STR$(SHR(FN zone_free,10),5),104,142,8)
  4680. RETURN
  4681. PROCEDURE aff_message(a$)
  4682.   last_aff_message$=a$
  4683.   GOSUB cadre_int(0,149,PRED(scr_ncol%),8,13,13,12,14)  ! Efface ce qu'il y avait avant
  4684.   GOSUB affchaine_trans(LEFT$(a$,MIN(LEN(a$),scr_ncol%)),2,151,12)
  4685. RETURN
  4686. PROCEDURE affiche_temps
  4687.   LOCAL a%,m$,s$
  4688.   a%=DIV(SUB(TIMER,debut_temps%),200)
  4689.   s$=STR$(a% MOD 60)
  4690.   m$=STR$(DIV(a%,60) MOD 60)
  4691.   GOSUB affchaine_notrans(STRING$(SUB(2,LEN(m$)),"0")+m$+":"+STRING$(SUB(2,LEN(s$)),"0")+s$,ADD(divbi&(0,25,16),1),ADD(divbi&(1,25,16),2),1)
  4692. RETURN
  4693. PROCEDURE affiche_cpu_time_pourcent
  4694.   ' Temps machine
  4695.   GOSUB cadre_int(75,140,3,7,9,9,9,9)
  4696.   IF CARD{r_flag_overload%}<>0
  4697.     GOSUB cadre_int(76,142,2,5,2,2,2,2)
  4698.     CARD{r_flag_overload%}=0
  4699.   ELSE
  4700.     GOSUB affchaine_trans(STR$(CARD{r_cpu_time_pourcent%},3)+"%",150,142,8)
  4701.   ENDIF
  4702. RETURN
  4703. PROCEDURE aff_ps_pp_e
  4704.   HIDEM
  4705.   GOSUB affiche_icone(0,24,0,0,play%=1)
  4706.   GOSUB affiche_icone(5,24,0,0,play%=2)
  4707.   GOSUB affiche_icone(1,24,0,0,edit%)
  4708.   SHOWM
  4709. RETURN
  4710. PROCEDURE affiche_slider_h(xxx%,yyy%,lll%,qqq%,mmm%)
  4711.   LOCAL iii%,ppp%
  4712.   GOSUB cadre_int(xxx%,yyy%,lll%,5,0,0,0,0)
  4713.   ppp%=DIV(MUL(qqq%,ADD(SHL(lll%,3),6)),mmm%)
  4714.   FOR iii%=ppp% TO SUCC(ppp%)
  4715.     GOSUB affchaine_trans(CHR$(ADD(iii% AND 7,16)),SHL(ADD(xxx%,SHR(iii%,3)),1),yyy%,1)
  4716.   NEXT iii%
  4717. RETURN
  4718. PROCEDURE affiche_slider_v(xxx%,yyy%,lll%,hhh%,qqq%,mmm%)
  4719.   LOCAL iii%,ppp%
  4720.   ppp%=DIV(MUL(qqq%,hhh%),mmm%)
  4721.   IF ppp%<hhh%
  4722.     GOSUB cadre_int(xxx%,yyy%,lll%,PRED(SUB(hhh%,ppp%)),0,0,0,0)
  4723.   ENDIF
  4724.   GOSUB cadre_int(xxx%,ADD(yyy%,SUB(hhh%,ppp%)),lll%,ppp%,1,1,1,1)
  4725. RETURN
  4726. PROCEDURE affiche_cadre_voies
  4727.   LOCAL iii%,aaa%
  4728.   GOSUB cadre_ext(1,170,1,PRED(MUL(haut_lig%,6)),0,9,8,10)
  4729.   SELECT type_affpiste%
  4730.   CASE 0
  4731.     aaa%=6
  4732.   CASE 1
  4733.     aaa%=10
  4734.   CASE 2
  4735.     aaa%=12
  4736.   ENDSELECT
  4737.   FOR iii%=0 TO PRED(nbr_col%)
  4738.     GOSUB cadre_ext(ADD(MUL(iii%,aaa%),4),170,SUB(aaa%,2),PRED(MUL(haut_lig%,6)),0,9,8,10)
  4739.     IF type_affpiste%>0
  4740.       GOSUB cadre_int(ADD(MUL(iii%,aaa%),4),160,8,9,9,9,10,8)
  4741.       GOSUB cadre_texte(CHR$(1),ADD(MUL(iii%,aaa%),9),160,1)
  4742.       GOSUB cadre_texte(CHR$(2),ADD(MUL(iii%,aaa%),11),160,1)
  4743.     ELSE
  4744.       GOSUB cadre_int(ADD(MUL(iii%,aaa%),4),160,4,9,9,9,10,8)
  4745.     ENDIF
  4746.     GOSUB cadre_ext(ADD(MUL(iii%,aaa%),5),162,2,5,0,9,8,10)
  4747.   NEXT iii%
  4748. RETURN
  4749. PROCEDURE affiche_panneau_principal
  4750.   LOCAL i%,a$
  4751.   IF NOT se.sample_editor_flag!
  4752.     DEFMOUSE 0
  4753.     HIDEM
  4754.     GOSUB cadre_int(0,0,PRED(scr_ncol%),PRED(scr_haut%),9,9,10,8)
  4755.     ' GOSUB affiche_graoumf_logo
  4756.     GOSUB affiche_bloc_icones(0,28,16,0,0)
  4757.     FOR i%=0 TO 15 STEP 3
  4758.       GOSUB cadre_ext(ADD(divbi&(0,i%,16),11),ADD(divbi&(1,i%,16),2),2,5,0,9,8,10)
  4759.     NEXT i%
  4760.     GOSUB cadre_ext(ADD(divbi&(0,18,16),5),ADD(divbi&(1,18,16),2),1,5,0,9,8,10)
  4761.     GOSUB cadre_ext(ADD(divbi&(0,21,16),9),ADD(divbi&(1,21,16),2),31,5,0,9,8,10)
  4762.     GOSUB cadre_ext(ADD(divbi&(0,22,16),9),ADD(divbi&(1,22,16),2),27,5,0,9,8,10)
  4763.     GOSUB cadre_ext(ADD(divbi&(0,23,16),7),ADD(divbi&(1,23,16),2),1,5,0,9,8,10)
  4764.     GOSUB cadre_ext(ADD(divbi&(0,24,16),6),ADD(divbi&(1,24,16),2),2,5,0,9,8,10)
  4765.     GOSUB cadre_ext(ADD(divbi&(0,25,16),1),ADD(divbi&(1,25,16),2),4,5,0,9,8,10)
  4766.     FOR i%=0 TO 31
  4767.       GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(divbi&(0,26,16),ADD(8,SHL(i%,1))),divbi&(1,26,16),1,ABS(SGN(FN track_onoff(i%))) XOR 1)
  4768.       GOSUB cadre_texte(STR$(SUCC(i%)),ADD(divbi&(0,27,16),ADD(SHL(i%,1),8)),divbi&(1,27,16),1)
  4769.     NEXT i%
  4770.     GOSUB affiche_icones_commande
  4771.     ON ss_menu% GOSUB affiche_icones_disk,affiche_icones_tools,affiche_icones_instr,affiche_icones_sample,affiche_icones_enveloppe,affiche_icones_control,affiche_icones_midi
  4772.     GOSUB affiche_cadre_voies
  4773.     GOSUB affiche_info_song
  4774.     GOSUB affiche_info_sample
  4775.     GOSUB affiche_info_preset
  4776.     GOSUB affiche_barre_info
  4777.     GOSUB affchaine_trans("CPU",144,142,10)
  4778.     IF play%=0
  4779.       debut_temps%=TIMER
  4780.     ENDIF
  4781.     GOSUB affiche_temps
  4782.     GOSUB aff_message(last_aff_message$)
  4783.     SHOWM
  4784.     GOSUB bee(FALSE)
  4785.   ELSE
  4786.     GOSUB affiche_panneau_sample
  4787.     IF NOT se.pas_sous_menu!
  4788.       ON ss_menu% GOSUB affiche_icones_disk,affiche_icones_tools,affiche_icones_instr,affiche_icones_sample,affiche_icones_enveloppe,affiche_icones_control,affiche_icones_midi
  4789.     ENDIF
  4790.   ENDIF
  4791. RETURN
  4792. PROCEDURE affiche_please_register
  4793.   GOSUB dialog("SHAREWARE","This is a demonstration version of|GRAOUMF TRACKER. If you like it or|if you use it frequently, please|register to get the complete version.|See documentation for more details.","Please register soon",MOUSEX,MOUSEY)
  4794. RETURN
  4795. PROCEDURE affiche_graoumf_logo
  4796.   LOCAL high%,nbr_l%,nbr_h%,width%,x_logo%,x_cpt%,x_offset%,y_logo%,y_cpt%,y_offset%
  4797.   IF LEN(graoumf_logo$)>0
  4798.     nbr_l%=DIV(scr_larg%,320)
  4799.     nbr_h%=DIV(scr_haut%,120)
  4800.     width%=DIV(scr_larg%,nbr_l%)
  4801.     high%=DIV(scr_haut%,nbr_h%)
  4802.     x_offset%=SHR(SUB(width%,320),1)
  4803.     y_offset%=SHR(SUB(high%,120),1)
  4804.     FOR y_cpt%=0 TO PRED(nbr_h%)
  4805.       FOR x_cpt%=0 TO PRED(nbr_l%)
  4806.         x_logo%=ADD(MUL(x_cpt%,width%),x_offset%)
  4807.         y_logo%=ADD(MUL(y_cpt%,high%),y_offset%)
  4808.         IF ADD(y_logo%,120)<160 OR y_logo%>=ADD(170,MUL(haut_lig%,6))
  4809.           GOSUB affiche_one_graoumf_logo(x_logo%,y_logo%)
  4810.         ENDIF
  4811.       NEXT x_cpt%
  4812.     NEXT y_cpt%
  4813.   ENDIF
  4814. RETURN
  4815. PROCEDURE affiche_one_graoumf_logo(x_logo%,y_logo%)
  4816.   LOCAL adr_ecran%,adr_logo%,adr_mask%,lig%
  4817.   IF LEN(graoumf_logo$)>0
  4818.     adr_ecran%=XBIOS(2)
  4819.     adr_logo%=V:graoumf_logo$
  4820.     adr_mask%=V:graoumf_logo_mask$
  4821.     FOR lig%=0 TO 119
  4822.       RC_COPY adr_mask%,0,0,320,1 TO adr_ecran%,x_logo%,y_logo%,4
  4823.       RC_COPY adr_logo%,0,0,320,1 TO adr_ecran%,x_logo%,y_logo%,7
  4824.       ADD adr_mask%,160
  4825.       ADD adr_logo%,160
  4826.       INC y_logo%
  4827.     NEXT lig%
  4828.   ENDIF
  4829. RETURN
  4830. PROCEDURE affiche_panneau_progression(mes$,p_len%,x%,y%)
  4831.   ' mes$: Titre de la boite de progression
  4832.   ' p_len%: valeur maximum de la variable de progression
  4833.   ' x%, y%: coordonnees de la boite (car, pix). -1 = milieu de l'ecran
  4834.   LOCAL box_width%,box_height%
  4835.   '
  4836.   box_width%=MAX(ADD(LEN(mes$),2),32)
  4837.   box_height%=30                                ! 4 +6 +4 +6*2 +4
  4838.   IF x%<0
  4839.     x%=SHR(SUB(scr_ncol%,box_width%),1)
  4840.   ENDIF
  4841.   IF y%<0
  4842.     y%=SHR(SUB(scr_haut%,box_height%),1)
  4843.   ENDIF
  4844.   x%=MAX(MIN(x%,SUB(scr_ncol%,box_width%)),0)
  4845.   y%=MAX(MIN(y%,SUB(scr_haut%,box_height%)),0)
  4846.   progression_xpos%=x%
  4847.   progression_ypos%=y%
  4848.   progression_width%=SHL(SUB(box_width%,2),3)
  4849.   progression_len%=p_len%
  4850.   progression_oldval%=-1
  4851.   '
  4852.   GOSUB cadre_o_int(x%,y%,PRED(box_width%),PRED(box_height%),9,9,10,8)
  4853.   GOSUB cadre_ext(SUCC(x%),ADD(y%,14),SUB(box_width%,3),11,9,9,8,10)
  4854.   GOSUB affchaine_trans(mes$,SHL(SUCC(x%),1),ADD(y%,4),8)
  4855.   GOSUB affiche_progression(0)
  4856. RETURN
  4857. PROCEDURE affiche_progression(newval%)
  4858.   ' newval entre 0 et progression_len%
  4859.   '
  4860.   LOCAL i%,oldpos%,newpos%,carxpos%,pixxpos%,pixypos%,pixypos2%
  4861.   '
  4862.   IF progression_oldval%<0
  4863.     oldpos%=-1
  4864.   ELSE
  4865.     oldpos%=progression_oldval%*progression_width%/progression_len%
  4866.   ENDIF
  4867.   newpos%=newval%*progression_width%/progression_len%
  4868.   IF newpos%>oldpos%
  4869.     oldpos%=MAX(SUCC(oldpos%),0)
  4870.     carxpos%=SHL(ADD(SUCC(progression_xpos%),SHR(oldpos%,3)),1)
  4871.     pixxpos%=ADD(oldpos% AND 7,16)
  4872.     pixypos%=ADD(progression_ypos%,14)
  4873.     pixypos2%=ADD(pixypos%,6)
  4874.     FOR i%=oldpos% TO newpos%
  4875.       GOSUB affchaine_trans(CHR$(pixxpos%),carxpos%,pixypos%,8)
  4876.       GOSUB affchaine_trans(CHR$(pixxpos%),carxpos%,pixypos2%,8)
  4877.       INC pixxpos%
  4878.       IF pixxpos%>23
  4879.         SUB pixxpos%,8
  4880.         ADD carxpos%,2
  4881.       ENDIF
  4882.     NEXT i%
  4883.   ENDIF
  4884.   progression_oldval%=MAX(newval%,progression_oldval%)
  4885. RETURN
  4886. '
  4887. ' Chargements/sauvegardes/disk
  4888. ' ----------------------------
  4889. PROCEDURE save_sample(buf!)
  4890.   LOCAL a$
  4891.   IF flag_registered!
  4892.     IF km%=2 AND nfile_sample$<>""
  4893.       a$=npath_sample$+nfile_sample$
  4894.     ELSE
  4895.       CLS
  4896.       GOSUB cadre_texte("SAVE SAMPLE",0,0,PRED(scr_ncol%))
  4897.       GOSUB sjx_system_to_gem
  4898.       FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  4899.       GOSUB sjx_system_to_gtk
  4900.     ENDIF
  4901.     IF a$<>""
  4902.       CLS
  4903.       GOSUB cadre_texte("WAITING : SAVING SAMPLE "+a$+"...",0,0,PRED(scr_ncol%))
  4904.       GOSUB save_sample2(buf!)
  4905.       IF erreur%=0
  4906.         GOSUB separe_nom_chemin(a$)
  4907.         nfile_sample$=nfile_$
  4908.         npath_sample$=npath_$
  4909.       ENDIF
  4910.     ENDIF
  4911.   ELSE
  4912.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  4913.   ENDIF
  4914.   GOSUB affiche_panneau_principal
  4915. RETURN
  4916. PROCEDURE save_sample2(buf!)
  4917.   ' Fournir a$ nom du sample, sample% numero du sample
  4918.   LOCAL a%,b$,i%,j%,k%,lon%,signe%
  4919.   erreur%=0
  4920.   warning%=0
  4921.   GOSUB bee(TRUE)
  4922.   IF NOT buf!
  4923.     lon%=FN length(sample%)
  4924.   ELSE
  4925.     lon%=mark_len%
  4926.   ENDIF
  4927.   IF lon%>0
  4928.     OPEN "o",#0,a$
  4929.     SEEK #0,0
  4930.     IF next_sample$="*.SPL"
  4931.       signe%=128
  4932.     ELSE
  4933.       signe%=signe_sam%
  4934.     ENDIF
  4935.     IF next_sample$="*.AVR"
  4936.       ' Entete du format .AVR
  4937.       GOSUB separe_nom_chemin(a$)       ! Recupere le nom
  4938.       b$=LEFT$(nfile_$,8)
  4939.       IF INSTR(b$,".")>1
  4940.         b$=LEFT$(b$,PRED(INSTR(b$,".")))
  4941.         IF LEN(b$)<8
  4942.           b$=b$+STRING$(SUB(8,LEN(b$)),0)
  4943.         ENDIF
  4944.       ENDIF
  4945.       IF NOT buf!
  4946.         b$="2BIT"+b$+MKI$(0)+MKI$(SHL(FN resol(sample%),3))+MKI$(signe%=0)
  4947.         IF FN repeat(sample%)>0 OR FN replen(sample%)>2
  4948.           b$=b$+MKI$(-1)+MKI$(-1)+MKI$(&HFF00)+MKI$(FN freqech(sample%))+MKL$(DIV(lon%,FN resol(sample%)))+MKL$(DIV(FN repeat(sample%),FN resol(sample%)))+MKL$(DIV(ADD(FN repeat(sample%),FN replen(sample%)),FN resol(sample%)))
  4949.         ELSE
  4950.           b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(FN freqech(sample%))+MKL$(DIV(lon%,FN resol(sample%)))+MKL$(0)+MKL$(0)
  4951.         ENDIF
  4952.       ELSE
  4953.         b$="2BIT"+b$+MKI$(0)+MKI$(SHL(win_bits%,3))+MKI$(signe%=0)
  4954.         b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(freq_buffer%)+MKL$(DIV(lon%,win_bits%))+MKL$(0)+MKL$(0)
  4955.       ENDIF
  4956.       b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  4957.       b$=b$+STRING$(SUB(128,LEN(b$)),0)
  4958.       BPUT #0,V:b$,128
  4959.     ENDIF
  4960.     ' Sauvegarde des donnees du sample
  4961.     b$=STRING$(1024,0)  ! Buffer de signature
  4962.     i%=0
  4963.     IF NOT buf!
  4964.       k%=FN resol(sample%)
  4965.     ELSE
  4966.       k%=win_bits%
  4967.     ENDIF
  4968.     REPEAT
  4969.       j%=MIN(1024,SUB(lon%,i%))
  4970.       IF NOT buf!
  4971.         BMOVE ADD(FN adresse(sample%),i%),V:b$,j%*(-flag_registered2!)    ! *** 2eme protection
  4972.       ELSE
  4973.         BMOVE ADD(ADD(FN adr_buffer,mark_1%),i%),V:b$,j%*(-flag_registered2!)    ! *** 2eme protection
  4974.       ENDIF
  4975.       IF signe%<>0
  4976.         a%=V:b$
  4977.         ~C:g_signe_sample%(L:a%,L:j%,W:k%)
  4978.       ENDIF
  4979.       BPUT #0,V:b$,j%
  4980.       ADD i%,j%
  4981.     UNTIL i%=>lon%
  4982.     CLOSE #0
  4983.   ENDIF
  4984. RETURN
  4985. PROCEDURE load_sample(buf!)
  4986.   LOCAL a$
  4987.   IF km%=2 AND nfile_sample$<>""
  4988.     a$=npath_sample$+nfile_sample$
  4989.   ELSE
  4990.     CLS
  4991.     GOSUB cadre_texte("LOAD SAMPLE",0,0,PRED(scr_ncol%))
  4992.     GOSUB sjx_system_to_gem
  4993.     FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  4994.     GOSUB sjx_system_to_gtk
  4995.   ENDIF
  4996.   IF a$<>""
  4997.     IF FN exist(a$)
  4998.       CLS
  4999.       GOSUB cadre_texte("WAITING : LOADING SAMPLE "+a$+"...",0,0,PRED(scr_ncol%))
  5000.       GOSUB load_sample2(buf!)
  5001.       IF erreur%=0
  5002.         GOSUB separe_nom_chemin(a$)
  5003.         nfile_sample$=nfile_$
  5004.         npath_sample$=npath_$
  5005.       ENDIF
  5006.     ENDIF
  5007.   ENDIF
  5008.   GOSUB bee(FALSE)
  5009.   SELECT erreur%
  5010.   CASE 1
  5011.     GOSUB dialog("FILE","Error:|Not enough memory|to load this sample!","Cancel",MOUSEX,MOUSEY)
  5012.   CASE 2
  5013.     GOSUB dialog("FILE","Error:|Unknown format version.","Cancel",MOUSEX,MOUSEY)
  5014.   ENDSELECT
  5015.   GOSUB affiche_panneau_principal
  5016. RETURN
  5017. PROCEDURE load_sample2(buf!)
  5018.   ' Fournir a$ nom du sample, sample% numero du sample
  5019.   LOCAL adsam%,freq%,lonfic%,lonsam%,res%,signe%
  5020.   LOCAL buffer$
  5021.   ~FRE(0)
  5022.   GOSUB bee(TRUE)
  5023.   IF NOT buf!
  5024.     GOSUB chg_taille_sample(sample%,0)
  5025.   ENDIF
  5026.   erreur%=0
  5027.   warning%=0
  5028.   res%=FN resol(sample%)
  5029.   freq%=FN freqech(sample%)
  5030.   signe%=signe_sam%
  5031.   buffer$=STRING$(128,0)
  5032.   OPEN "i",#0,a$
  5033.   lonfic%=LOF(#0)                               ! Taille du fichier
  5034.   BGET #0,V:buffer$,MIN(LOF(#0),128)
  5035.   ' Compacte ? Si, oui, cherche la vraie longueur
  5036.   IF LEFT$(buffer$,4)="ATM5"
  5037.     lonsam%=LONG{ADD(V:buffer$,4)}
  5038.   ELSE IF LEFT$(buffer$,4)="Ice!"
  5039.     lonsam%=LONG{ADD(V:buffer$,4)}
  5040.   ELSE IF LEFT$(buffer$,4)="ICE!"
  5041.     lonsam%=LONG{ADD(V:buffer$,8)}
  5042.   ELSE IF LEFT$(buffer$,4)="SPv3"
  5043.     lonsam%=LONG{ADD(V:buffer$,12)}
  5044.   ELSE
  5045.     lonsam%=LOF(#0)
  5046.   ENDIF
  5047.   IF (buf! AND lonsam%<mark_len%) OR (NOT buf! AND MAX(lonsam%,lonfic%)<FN zone_free)          ! Assez de memoire pour charger ?
  5048.     IF NOT buf!
  5049.       GOSUB chg_taille_sample(sample%,SUCC(MAX(lonsam%,lonfic%)) AND -2)
  5050.       adsam%=FN adresse(sample%)
  5051.     ELSE
  5052.       adsam%=FN adr_buffer+mark_1%
  5053.     ENDIF
  5054.     SEEK #0,0
  5055.     BGET #0,adsam%,lonfic%
  5056.     ~C:g_atomic_35_unpack%(L:adsam%)
  5057.     ~C:g_packice_21_unpack%(L:adsam%)
  5058.     ~C:g_packice_24_unpack%(L:adsam%)
  5059.     ~C:g_speedpacker_unpack%(L:adsam%)
  5060.     BMOVE adsam%,V:buffer$,MIN(lonsam%,128)
  5061.     IF LONG{adsam%}=&H32424954                  ! '2BIT' : Format AVR
  5062.       GOSUB load_sample_avr(buf!)
  5063.     ELSE IF LONG{adsam%}=&H52494646             ! 'RIFF' : Format WAV
  5064.       GOSUB load_sample_wav(buf!)
  5065.     ELSE IF LEFT$(buffer$,19)="Creative Voice File"     ! Format VOC
  5066.       GOSUB load_sample_voc(buf!)
  5067.     ELSE                                        ! Format inconnu : donnees brutes
  5068.       GOSUB load_sample_raw(buf!)
  5069.     ENDIF
  5070.   ELSE
  5071.     erreur%=1                                   ! Pas assez de memoire pour charger le fichier
  5072.   ENDIF
  5073.   CLOSE #0
  5074.   IF NOT buf!
  5075.     IF erreur%=0
  5076.       ~C:rr_boucle_sample%(W:sample%)
  5077.     ELSE
  5078.       GOSUB kill_sample(sample%)
  5079.     ENDIF
  5080.   ENDIF
  5081.   ~FRE(0)
  5082. RETURN
  5083. PROCEDURE load_sample_raw(buf!)
  5084.   ' Besoin (Load_Sample2): a$, freq%, res%, signe%, adsam% et lonsam%
  5085.   LOCAL len%
  5086.   LOCAL b$
  5087.   len%=lonsam% AND -2
  5088.   GOSUB chg_sam_balance(sample%,&HFFFF)
  5089.   GOSUB chg_sam_volume(sample%,&H100)
  5090.   GOSUB chg_sam_finetune(sample%,0)
  5091.   GOSUB chg_sam_length(sample%,len%)
  5092.   GOSUB chg_sam_repeat(sample%,0)
  5093.   GOSUB chg_sam_replen(sample%,2)
  5094.   IF len%>0
  5095.     IF (NOT buf!)
  5096.       a%=FN adresse(sample%)
  5097.     ELSE
  5098.       a%=FN adr_buffer+mark_1%
  5099.     ENDIF
  5100.     IF signe%<>0 OR next_sample$="*.SPL"
  5101.       ~C:g_signe_sample%(L:a%,L:len%,W:res%)            ! Signature
  5102.     ENDIF
  5103.   ENDIF
  5104.   IF (NOT buf!)
  5105.     GOSUB chg_taille_sample(sample%,len%)
  5106.   ELSE
  5107.     mark_2%=ADD(mark_1%,len%)
  5108.   ENDIF
  5109.   b$=a$
  5110.   WHILE INSTR(b$,"\")>0
  5111.     a%=INSTR(b$,"\")
  5112.     b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5113.   WEND
  5114.   IF NOT buf!
  5115.     GOSUB chg_samplename(b$,sample%)
  5116.   ENDIF
  5117.   ~FRE(0)
  5118. RETURN
  5119. PROCEDURE load_sample_avr(buf!)
  5120.   ' Besoin (Load_Sample2): a$, adsam% et lonsam%
  5121.   ' Change (Load_Sample2): freq%, res%, signe%
  5122.   LOCAL a%,b%,c%,len%,loop%,rep_avr%,rep2_avr%,stereo%
  5123.   LOCAL b$
  5124.   res%=MAX(MIN(SHR(CARD{ADD(adsam%,14)},3),2),1)        ! Nbr d'octets/sample
  5125.   a%=CARD{ADD(adsam%,12)}
  5126.   IF a%=0
  5127.     stereo%=1
  5128.   ELSE
  5129.     stereo%=2
  5130.   ENDIF
  5131.   freq%=MAX(CARD{ADD(adsam%,24)},2000)                  ! Frequence d'echantillonnage du sample
  5132.   signe%=128
  5133.   IF CARD{ADD(adsam%,16)}<>0
  5134.     signe%=0
  5135.   ENDIF
  5136.   len%=MAX(0,MIN(MUL(LONG{ADD(adsam%,&H1A)},MUL(res%,stereo%)),SUB(lonsam%,128)) AND -2)
  5137.   rep_avr%=MUL(LONG{ADD(adsam%,&H1E)},MUL(res%,stereo%)) AND -2
  5138.   rep2_avr%=MUL(LONG{ADD(adsam%,&H22)},MUL(res%,stereo%)) AND -2
  5139.   loop%=CARD{ADD(adsam%,18)}
  5140.   IF stereo%<>1                                 ! Stereo
  5141.     GOSUB dialog("STEREO","Sample stereo.|What must I load ?","Left|Right|Mix|Cancel",MOUSEX,MOUSEY)
  5142.     IF bouton%=3                                ! Cancel
  5143.       IF NOT buf!
  5144.         GOSUB chg_taille_sample(sample%,0)
  5145.       ENDIF
  5146.       GOTO fin_load_sample_avr
  5147.     ENDIF
  5148.     GOSUB bee(TRUE)
  5149.     len%=len% AND -4
  5150.     a%=ADD(adsam%,128)
  5151.     b%=a%
  5152.     IF bouton%=0                                ! 1 seul canal: gauche
  5153.       ~C:g_stereo_2_mono_one%(L:b%,L:a%,L:len%,W:res%)
  5154.     ELSE IF bouton%=1                           ! 1 seul canal: droit
  5155.       ADD b%,res%
  5156.       ~C:g_stereo_2_mono_one%(L:b%,L:a%,L:len%,W:res%)
  5157.     ELSE                                        ! Mixage des deux canaux
  5158.       ~C:g_stereo_2_mono_ave%(L:b%,L:a%,L:len%,W:res%)
  5159.     ENDIF
  5160.     len%=SHR(len%,1)
  5161.   ENDIF
  5162.   IF NOT buf!
  5163.     a%=FN adresse(sample%)
  5164.   ELSE
  5165.     a%=adsam%
  5166.   ENDIF
  5167.   BMOVE ADD(adsam%,128),a%,len%
  5168.   IF NOT buf!
  5169.     GOSUB chg_taille_sample(sample%,len%)
  5170.   ELSE
  5171.     mark_2%=ADD(mark_1%,len%)
  5172.   ENDIF
  5173.   IF signe%<>0
  5174.     ~C:g_signe_sample%(L:a%,L:len%,W:res%)      ! Signature
  5175.   ENDIF
  5176.   rep_avr%=MAX(0,MIN(SUB(len%,2),rep_avr%))
  5177.   IF NOT buf!
  5178.     GOSUB chg_sam_balance(sample%,&HFFFF)
  5179.     GOSUB chg_sam_nbits(sample%,res%)
  5180.     GOSUB chg_sam_freq(sample%,freq%)
  5181.     GOSUB chg_sam_volume(sample%,&H100)
  5182.     GOSUB chg_sam_finetune(sample%,0)
  5183.     GOSUB chg_sam_length(sample%,len%)
  5184.     IF loop%=0                                    ! Non boucle
  5185.       GOSUB chg_sam_repeat(sample%,0)
  5186.       GOSUB chg_sam_replen(sample%,2)
  5187.     ELSE                                          ! Boucle
  5188.       GOSUB chg_sam_repeat(sample%,rep_avr%)
  5189.       GOSUB chg_sam_replen(sample%,MAX(SUB(rep2_avr%,rep_avr%),2))
  5190.     ENDIF
  5191.   ELSE
  5192.     freq_buffer%=freq%
  5193.   ENDIF
  5194.   IF NOT buf!
  5195.     ' Le nom
  5196.     b$=a$
  5197.     WHILE INSTR(b$,"\")>0
  5198.       a%=INSTR(b$,"\")
  5199.       b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5200.     WEND
  5201.     GOSUB chg_samplename(b$,sample%)
  5202.   ENDIF
  5203. fin_load_sample_avr:
  5204.   ~FRE(0)
  5205. RETURN
  5206. PROCEDURE load_sample_wav(buf!)
  5207.   ' Besoin (Load_Sample2): a$, adsam% et lonsam%
  5208.   ' Change (Load_Sample2): freq%, res%
  5209.   ' *** Ne tient pas compte exactement de la structure en chunks
  5210.   LOCAL a%,b%,len%,nchannels%
  5211.   LOCAL b$
  5212.   GOSUB intel_l(ADD(adsam%,24))
  5213.   GOSUB intel_l(ADD(adsam%,40))
  5214.   GOSUB intel_w(ADD(adsam%,22))
  5215.   GOSUB intel_w(ADD(adsam%,34))
  5216.   nchannels%=CARD{ADD(adsam%,34)}
  5217.   res%=SHR(CARD{ADD(adsam%,34)},3)
  5218.   len%=MAX(MIN(LONG{ADD(adsam%,40)},SUB(lonsam%,44)),0) AND -2
  5219.   freq%=LONG{ADD(adsam%,24)}
  5220.   ncanal%=0
  5221.   IF NOT buf!
  5222.     GOSUB chg_sam_balance(sample%,&HFFFF)
  5223.     GOSUB chg_sam_nbits(sample%,res%)
  5224.     GOSUB chg_sam_freq(sample%,freq%)
  5225.     GOSUB chg_sam_volume(sample%,&H100)
  5226.     GOSUB chg_sam_finetune(sample%,0)
  5227.     GOSUB chg_sam_length(sample%,len%)
  5228.     GOSUB chg_sam_repeat(sample%,0)
  5229.     GOSUB chg_sam_replen(sample%,2)
  5230.   ELSE
  5231.     freq_buffer%=freq%
  5232.   ENDIF
  5233.   IF len%>0
  5234.     IF NOT buf!
  5235.       a%=FN adresse(sample%)
  5236.     ELSE
  5237.       a%=adsam%
  5238.     ENDIF
  5239.     BMOVE ADD(adsam%,44),a%,len%
  5240.     IF res%=2                      ! 16 bits
  5241.       ~C:g_intel_16_bits%(L:a%,L:len%)
  5242.     ENDIF
  5243.     IF res%=1
  5244.       ~C:g_signe_sample%(L:a%,L:len%,W:res%)    ! Signature seulement pour le 8 bits
  5245.     ENDIF
  5246.     IF nchannels%=2                             ! Stereo
  5247.       GOSUB dialog("STEREO","Sample stereo.|What must I load ?","Left|Right|Mix|Cancel",MOUSEX,MOUSEY)
  5248.       IF bouton%=3                              ! Cancel
  5249.         IF NOT buf!
  5250.           GOSUB chg_taille_sample(sample%,0)
  5251.         ENDIF
  5252.         GOTO fin_load_sample_wav
  5253.       ENDIF
  5254.       GOSUB bee(TRUE)
  5255.       len%=len% AND -4
  5256.       b%=adsam%
  5257.       IF bouton%=0                              ! 1 seul canal: gauche
  5258.         ~C:g_stereo_2_mono_one%(L:b%,L:adsam%,L:len%,W:res%)
  5259.       ELSE IF bouton%=1                         ! 1 seul canal: droit
  5260.         ADD b%,res%
  5261.         ~C:g_stereo_2_mono_one%(L:b%,L:adsam%,L:len%,W:res%)
  5262.       ELSE                                      ! Mixage des deux canaux
  5263.         ~C:g_stereo_2_mono_ave%(L:b%,L:adsam%,L:len%,W:res%)
  5264.       ENDIF
  5265.       len%=SHR(len%,1)
  5266.     ENDIF
  5267.   ENDIF
  5268.   IF NOT buf!
  5269.     GOSUB chg_taille_sample(sample%,len%)
  5270.   ELSE
  5271.     mark_2%=ADD(mark_1%,len%)
  5272.   ENDIF
  5273.   ' Le nom
  5274.   IF NOT buf!
  5275.     b$=a$
  5276.     WHILE INSTR(b$,"\")>0
  5277.       a%=INSTR(b$,"\")
  5278.       b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5279.     WEND
  5280.     GOSUB chg_samplename(b$,sample%)
  5281.   ENDIF
  5282. fin_load_sample_wav:
  5283.   ~FRE(0)
  5284. RETURN
  5285. PROCEDURE load_sample_voc(buf!)
  5286.   ' Besoin (Load_Sample2): a$, adsam% et lonsam%
  5287.   ' Change (Load_Sample2): signe%, freq%, res%
  5288.   ' *** Attention, gere tres incompletement le type 9 (pas de stereo)
  5289.   LOCAL i%,total_len%,total_len2%,offset%,adr_block%,type%,sect_nbr%
  5290.   LOCAL block_len%,block_adr%,new_block_adr%
  5291.   LOCAL sname$,offset$,size$
  5292.   LOCAL ok!,first!
  5293.   IF BYTE{ADD(adsam%,23)}=1                     ! Pourquoi ???
  5294.     GOSUB intel_w(ADD(adsam%,20))
  5295.     offset%=CARD{ADD(adsam%,20)}
  5296.     '
  5297.     ' Cherche la taille du sample et des differents blocs qui le composent
  5298.     '
  5299.     signe%=0
  5300.     adr_block%=ADD(adsam%,offset%)
  5301.     total_len%=0                                ! La longueur finale du sample
  5302.     sect_nbr%=0
  5303.     sname$=""
  5304.     offset$=""
  5305.     size$=""
  5306.     type$=""
  5307.     ok!=TRUE
  5308.     first!=TRUE
  5309.     REPEAT
  5310.       type%=BYTE{adr_block%}
  5311.       INC adr_block%
  5312.       type$=type$+CHR$(type%)
  5313.       SELECT type%
  5314.       CASE 0
  5315.         ok!=FALSE
  5316.       CASE 1,2                                  ! Bloc de donnees
  5317.         GOSUB intel_3(adr_block%)
  5318.         block_len%=SHR(LONG{adr_block%},8)
  5319.         ADD adr_block%,3
  5320.         IF type%=1
  5321.           IF first!
  5322.             freq%=DIV(1000000,SUB(256,BYTE{adr_block%}))
  5323.             first!=FALSE
  5324.           ENDIF
  5325.           ADD adr_block%,2
  5326.           SUB block_len%,2
  5327.         ENDIF
  5328.         offset$=offset$+MKL$(SUB(adr_block%,adsam%))
  5329.         size$=size$+MKL$(block_len%)
  5330.         INC sect_nbr%
  5331.         ADD total_len%,block_len%
  5332.         ADD adr_block%,block_len%
  5333.       CASE 3                                    ! Blanc
  5334.         block_len%=SHR(LONG{adr_block%},8)
  5335.         ADD adr_block%,6
  5336.         offset$=offset$+MKL$(total_len%)
  5337.         size$=size$+MKL$(block_len%)
  5338.         INC sect_nbr%
  5339.         ADD total_len%,block_len%
  5340.       CASE 5                                    ! Le nom
  5341.         GOSUB intel_3(adr_block%)
  5342.         block_len%=SHR(LONG{adr_block%},8)
  5343.         ADD adr_block%,3
  5344.         sname$=STRING$(block_len%,0)
  5345.         BMOVE adr_block%,V:sname$,block_len%
  5346.         ADD adr_block%,block_len%
  5347.       CASE 9                                    ! *** Flou total...
  5348.         GOSUB intel_3(adr_block%)
  5349.         block_len%=SUB(SHR(LONG{adr_block%},8),12)
  5350.         ADD adr_block%,3
  5351.         GOSUB intel_w(adr_block%)
  5352.         freq%=CARD{adr_block%}
  5353.         res%=SHR(BYTE{ADD(adr_block%,4)},3)
  5354.         ' Nombre de voies en + 05.b ?
  5355.         signe%=BTST(BYTE{ADD(adr_block%,6)},2)
  5356.         ADD adr_block%,12
  5357.         offset$=offset$+MKL$(SUB(adr_block%,adsam%))
  5358.         size$=size$+MKL$(block_len%)
  5359.         INC sect_nbr%
  5360.         ADD total_len%,block_len%
  5361.         ADD adr_block%,block_len%
  5362.       ENDSELECT
  5363.     UNTIL (NOT ok!) OR adr_block%>=ADD(adsam%,lonsam%)
  5364.     total_len%=total_len% AND -2
  5365.     '
  5366.     ' Recompose correctement le sample
  5367.     '
  5368.     IF NOT buf!
  5369.       GOSUB chg_sam_balance(sample%,&HFFFF)
  5370.       GOSUB chg_sam_nbits(sample%,res%)
  5371.       GOSUB chg_sam_freq(sample%,freq%)
  5372.       GOSUB chg_sam_volume(sample%,&H100)
  5373.       GOSUB chg_sam_finetune(sample%,0)
  5374.       GOSUB chg_sam_length(sample%,total_len%)
  5375.       GOSUB chg_sam_repeat(sample%,0)
  5376.       GOSUB chg_sam_replen(sample%,2)
  5377.     ELSE
  5378.       freq_buffer%=freq%
  5379.     ENDIF
  5380.     IF total_len%>0
  5381.       IF total_len%>lonsam%
  5382.         IF NOT buf!
  5383.           GOSUB chg_taille_sample(sample%,total_len%)
  5384.         ENDIF
  5385.       ENDIF
  5386.       ' Passe 1: On ne garde que les donnees brutes
  5387.       new_block_adr%=adsam%
  5388.       FOR i%=0 TO PRED(sect_nbr%)
  5389.         SELECT BYTE{ADD(V:type$,i%)}
  5390.         CASE 1,2,9
  5391.           block_adr%=ADD(adsam%,LONG{ADD(V:offset$,SHL(i%,2))})
  5392.           block_len%=LONG{ADD(V:size$,SHL(i%,2))}
  5393.           block_len%=MIN(block_len%,SUB(ADD(adsam%,total_len%),new_block_adr%)) ! Si on a arrondi total_len%, ne pas depasser!
  5394.           BMOVE block_adr%,new_block_adr%,block_len%
  5395.           ADD new_block_adr%,block_len%
  5396.         ENDSELECT
  5397.       NEXT i%
  5398.       ' Passe 2: On insere les blancs s'il y en a
  5399.       FOR i%=0 TO PRED(sect_nbr%)
  5400.         SELECT BYTE{ADD(V:type$,i%)}
  5401.         CASE 3
  5402.           block_adr%=ADD(adsam%,LONG{ADD(V:offset$,SHL(i%,2))})
  5403.           new_block_adr%=ADD(block_adr%,LONG{ADD(V:size$,SHL(i%,2))})
  5404.           block_len%=SUB(ADD(adsam%,total_len%),new_block_adr%)
  5405.           IF block_len%>0
  5406.             BMOVE block_adr%,new_block_adr%,block_len%
  5407.             GOSUB clear_mem(block_adr%,SUB(new_block_adr%,block_adr%))
  5408.           ENDIF
  5409.         ENDSELECT
  5410.       NEXT i%
  5411.       IF res%=2                    ! 16 bits
  5412.         ~C:g_intel_16_bits%(L:adsam%,L:total_len%)
  5413.       ENDIF
  5414.       IF signe%=0                               ! Signature
  5415.         ~C:g_signe_sample%(L:adsam%,L:total_len%,W:res%)
  5416.       ENDIF
  5417.     ENDIF
  5418.     IF total_len%<lonsam%
  5419.       IF NOT buf!
  5420.         GOSUB chg_taille_sample(sample%,total_len%)
  5421.       ELSE
  5422.         mark_2%=ADD(mark_1%,total_len%)
  5423.       ENDIF
  5424.     ENDIF
  5425.     ' Le nom
  5426.     IF NOT buf!
  5427.       IF LEN(sname$)>0
  5428.         GOSUB chg_samplename(sname$,sample%)
  5429.       ELSE
  5430.         b$=a$
  5431.         WHILE INSTR(b$,"\")>0
  5432.           a%=INSTR(b$,"\")
  5433.           b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5434.         WEND
  5435.         GOSUB chg_samplename(b$,sample%)
  5436.       ENDIF
  5437.     ENDIF
  5438.   ELSE
  5439.     erreur%=2
  5440.   ENDIF
  5441.   ~FRE(0)
  5442. RETURN
  5443. PROCEDURE save_module
  5444.   LOCAL time_taken%,erreur%
  5445.   LOCAL a$
  5446.   erreur%=0
  5447.   IF flag_registered!
  5448.     IF km%=2 AND nfile_module$<>""
  5449.       a$=npath_module$+nfile_module$
  5450.     ELSE
  5451.       CLS
  5452.       IF next_module$="*.MOD"
  5453.         GOSUB cadre_texte("EXPORT MODULE .MOD",0,0,PRED(scr_ncol%))
  5454.         GOSUB sjx_system_to_gem
  5455.         FILESELECT npath_module$+"*.MOD",nfile_module$,a$
  5456.         GOSUB sjx_system_to_gtk
  5457.       ELSE IF next_module$="*.S3M"
  5458.         GOSUB cadre_texte("EXPORT MODULE .S3M",0,0,PRED(scr_ncol%))
  5459.         GOSUB sjx_system_to_gem
  5460.         FILESELECT npath_module$+"*.S3M",nfile_module$,a$
  5461.         GOSUB sjx_system_to_gtk
  5462.       ELSE IF next_module$="*.GTK"
  5463.         GOSUB cadre_texte("SAVE OLD MODULE",0,0,PRED(scr_ncol%))
  5464.         GOSUB sjx_system_to_gem
  5465.         FILESELECT npath_module$+"*.GTK",nfile_module$,a$
  5466.         GOSUB sjx_system_to_gtk
  5467.       ELSE
  5468.         GOSUB cadre_texte("SAVE MODULE",0,0,PRED(scr_ncol%))
  5469.         GOSUB sjx_system_to_gem
  5470.         FILESELECT npath_module$+"*.GT2",nfile_module$,a$
  5471.         GOSUB sjx_system_to_gtk
  5472.       ENDIF
  5473.     ENDIF
  5474.     IF a$<>""
  5475.       CLS
  5476.       GOSUB cadre_texte("WAITING : BACK UP OF THE MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  5477.       IF flag_backup_modules!
  5478.         e%=FN backup_file(a$)
  5479.         IF e%<0
  5480.           GOSUB dialog("ERROR","Error during the backup of the file|"+a$,"Continue",MOUSEX,MOUSEY)
  5481.         ENDIF
  5482.       ENDIF
  5483.       CLS
  5484.       GOSUB cadre_texte("WAITING : SAVING MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  5485.       GOSUB rec_result("Saving module "+a$+"...",TRUE)
  5486.       time_taken%=TIMER
  5487.       GOSUB save_module2
  5488.       time_taken%=SUB(TIMER,time_taken%)
  5489.       GOSUB separe_nom_chemin(a$)
  5490.       nfile_module$=nfile_$
  5491.       npath_module$=npath_$
  5492.     ENDIF
  5493.     SELECT erreur%
  5494.     CASE 0
  5495.       GOSUB rec_result("Complete. Time for saving: "+FN time_hmsd$(time_taken%),TRUE)
  5496.     CASE -1
  5497.       GOSUB rec_result("Error: Disk full"+STR$(erreur%),TRUE)
  5498.       GOSUB dialog("FILE","Error:|Disk full","Cancel",MOUSEX,MOUSEY)
  5499.     DEFAULT
  5500.       GOSUB rec_result("Disk error: "+STR$(erreur%),TRUE)
  5501.       GOSUB dialog("FILE","Error:|"+STR$(erreur%),"Cancel",MOUSEX,MOUSEY)
  5502.     ENDSELECT
  5503.   ELSE
  5504.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  5505.   ENDIF
  5506.   GOSUB affiche_panneau_principal
  5507. RETURN
  5508. PROCEDURE save_module2
  5509.   ' Fournir a$ nom du module
  5510.   LOCAL i%,a%
  5511.   LOCAL handle_fichier%,code_erreur_fichier%
  5512.   LOCAL filename$
  5513.   ~FRE(0)
  5514.   erreur%=0
  5515.   warning%=0
  5516.   GOSUB bee(TRUE)
  5517.   module&(1)=ADD(&H4B00,gtk_file_vnum%)
  5518.   filename$=a$+CHR$(0)
  5519.   handle_fichier%=GEMDOS(60,L:V:filename$,W:0)
  5520.   IF handle_fichier%>=0
  5521.     IF next_module$="*.MOD"
  5522.       GOSUB save_module_mod
  5523.     ELSE IF next_module$="*.S3M"
  5524.       GOSUB save_module_s3m
  5525.     ELSE IF next_module$="*.GTK"
  5526.       GOSUB save_module_gtk
  5527.     ELSE
  5528.       GOSUB save_module_gt2
  5529.     ENDIF
  5530.     code_erreur_fichier%=GEMDOS(62,W:handle%)
  5531.     IF code_erreur_fichier%<0
  5532.       erreur%=code_erreur_fichier%
  5533.     ENDIF
  5534.   ELSE
  5535.     erreur%=handle_fichier%
  5536.   ENDIF
  5537.   GOSUB bee(FALSE)
  5538. RETURN
  5539. PROCEDURE save_module_gt2
  5540.   ' Variables utilisees pour la sauvegarde:
  5541.   ' handle_fichier%, code_erreur_fichier%, erreur%
  5542.   LOCAL a%,i%,j%,nbs%,nbi%,nbe%,total_len%
  5543.   LOCAL loopend1%,loopend2%
  5544.   LOCAL ok!
  5545.   LOCAL a$,chk$,lsam$,lins$,lenv$
  5546.   ~FRE(0)
  5547.   GOSUB rec_result("  Saving in GT2 format (Graoumf Tracker module).",TRUE)
  5548.   '
  5549.   ' Travail preparatoire
  5550.   '
  5551.   ' Recherche les samples et les instruments utilises
  5552.   GOSUB rec_result("  Instruments used... ",FALSE)
  5553.   lsam$=STRING$(256,0)
  5554.   lins$=STRING$(256,0)
  5555.   a%=C:g_find_used_samples_and_instruments%(L:r_adr_sample%,L:V:instrset%(0,0),L:V:lsam$,L:V:lins$)
  5556.   nbi%=a% AND &HFFFF
  5557.   nbs%=SWAP(a%) AND &HFFFF
  5558.   GOSUB rec_result(STR$(nbi%)+".",TRUE)
  5559.   GOSUB rec_result("  Samples used... ",FALSE)
  5560.   GOSUB rec_result(STR$(nbs%)+".",TRUE)
  5561.   ' Recherche des enveloppes utilisees
  5562.   GOSUB rec_result("  Envelopes used:... ",FALSE)
  5563.   lenv$=STRING$(192,0)
  5564.   nbe%=0
  5565.   FOR i%=1 TO 63
  5566.     FOR j%=0 TO 2                       ! Critere : longueur d'une section > 1
  5567.       IF FN env_sectlen(i%,j%,0)>1 OR FN env_sectlen(i%,j%,1)>1
  5568.         BYTE{ADD(V:lenv$,ADD(MUL(i%,3),j%))}=1
  5569.         INC nbe%
  5570.       ENDIF
  5571.     NEXT j%
  5572.   NEXT i%
  5573.   GOSUB rec_result(STR$(nbe%)+".",TRUE)
  5574.   '
  5575.   ' Chunk d'informations generales
  5576.   '
  5577.   GOSUB rec_result("  Saving header chunk... ",FALSE)
  5578.   a$=DATE$
  5579.   a%=FN mod_tempo                       ! Tempo
  5580.   chk$="GT2"+CHR$(gt2_file_vnum%)+MKL$(0)+FN songname$+FN songcomment$
  5581.   chk$=chk$+CHR$(VAL(LEFT$(a$,2)))+CHR$(VAL(MID$(a$,4,2)))+MKI$(VAL(RIGHT$(a$,4)))
  5582.   chk$=chk$+"Graoumf Tracker v"+STR$(gtk_version%/10000)        ! Nom du Tracker
  5583.   chk$=chk$+SPACE$(SUB(228,LEN(chk$)))
  5584.   chk$=chk$+MKI$(CARD{r_mod_speed%})+MKI$(a%)+MKI$(CARD{r_master_vol%})+MKI$(nbr_track%)
  5585.   FOR i%=0 TO PRED(nbr_track%)                                  ! Les balances
  5586.     chk$=chk$+MKI$(CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,i%))})
  5587.   NEXT i%
  5588.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5589.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5590.   IF code_erreur_fichier%<0
  5591.     erreur%=code_erreur_fichier%
  5592.     GOTO sav_module_gt2_erreur
  5593.   ENDIF
  5594.   GOSUB rec_result("done.",TRUE)
  5595.   '
  5596.   ' Chunk des volumes des pistes
  5597.   '
  5598.   GOSUB rec_result("  Saving track volume chunk... ",FALSE)
  5599.   chk$="TVOL"+MKL$(0)+MKI$(nbr_track%)
  5600.   FOR i%=0 TO PRED(nbr_track%)
  5601.     chk$=chk$+MKI$(FN track_volume_lin(i%))
  5602.   NEXT i%
  5603.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5604.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5605.   IF code_erreur_fichier%<0
  5606.     erreur%=code_erreur_fichier%
  5607.     GOTO sav_module_gt2_erreur
  5608.   ENDIF
  5609.   GOSUB rec_result("done.",TRUE)
  5610.   '
  5611.   ' Chunk de configuration du tracker
  5612.   '
  5613.   IF flag_gt2cnf!
  5614.     GOSUB rec_result("  Saving config. chunk... ",FALSE)
  5615.     chk$="TCN1"+MKL$(2660)+MKI$(0)+MKI$(songpos%)+MKI$(posligne%)+MKI$(n_preset%)
  5616.     chk$=chk$+MKI$(type_affpiste%)+MKI$(curs_col%)+MKI$(curs_x%)+MKI$(ADD(play%,SHL(edit%,2)))
  5617.     chk$=chk$+MKI$(octave%)+MKI$(line_step%)+MKI$(instr%)+MKI$(sample%)
  5618.     FOR i%=0 TO 31
  5619.       chk$=chk$+MKI$(nbr_colonnes%(i%))
  5620.     NEXT i%
  5621.     FOR i%=0 TO 31
  5622.       chk$=chk$+SPACE$(16)                      ! *** Faire de vrais noms
  5623.     NEXT i%
  5624.     a$=STRING$(2048,0)
  5625.     BMOVE V:preset&(0,0),V:a$,2048
  5626.     chk$=chk$+a$
  5627.     a%=0
  5628.     FOR i%=0 TO 31
  5629.       IF FN track_onoff(i%)<>0
  5630.         a%=a% OR SHL(1,i%)
  5631.       ENDIF
  5632.     NEXT i%
  5633.     chk$=chk$+MKL$(a%)
  5634.     LONG{ADD(V:chk$,4)}=LEN(chk$)
  5635.     code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5636.     IF code_erreur_fichier%<0
  5637.       erreur%=code_erreur_fichier%
  5638.       GOTO sav_module_gt2_erreur
  5639.     ENDIF
  5640.     GOSUB rec_result("done.",TRUE)
  5641.   ENDIF
  5642.   '
  5643.   ' Chunk de sequence de patterns
  5644.   '
  5645.   GOSUB rec_result("  Saving song chunk... ",FALSE)
  5646.   chk$="SONG"+MKL$(ADD(FN song_length,12))+MKI$(FN song_length)+MKI$(FN song_repeat)
  5647.   FOR i%=0 TO PRED(FN song_length)
  5648.     chk$=chk$+MKI$(song&(i%))
  5649.   NEXT i%
  5650.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5651.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5652.   IF code_erreur_fichier%<0
  5653.     erreur%=code_erreur_fichier%
  5654.     GOTO sav_module_gt2_erreur
  5655.   ENDIF
  5656.   GOSUB rec_result("done.",TRUE)
  5657.   '
  5658.   ' Chunk d'ensemble de patterns
  5659.   '
  5660.   GOSUB rec_result("  Saving pattern chunks... ",FALSE)
  5661.   chk$="PATS"+MKL$(12)+MKI$(nbr_track%)+MKI$(SUCC(FN last_pat_util))
  5662.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5663.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5664.   IF code_erreur_fichier%<0
  5665.     erreur%=code_erreur_fichier%
  5666.     GOTO sav_module_gt2_erreur
  5667.   ENDIF
  5668.   '
  5669.   ' Chunks des patterns
  5670.   '
  5671.   loopend1%=FN last_pat_util
  5672.   i%=0
  5673.   WHILE i%<=loopend1%
  5674.     a%=MAX(FN adr_patchunk(i%)*(-flag_registered2!),&H1498)     ! A cause de la 2eme protection
  5675.     code_erreur_fichier%=FN fwrite(handle_fichier%,FN lon_patchunk(i%),a%)
  5676.     IF code_erreur_fichier%<0
  5677.       erreur%=code_erreur_fichier%
  5678.       GOTO sav_module_gt2_erreur
  5679.     ENDIF
  5680.     INC i%
  5681.   WEND
  5682.   GOSUB rec_result("done.",TRUE)
  5683.   '
  5684.   ' Chunk d'ensemble d'instruments
  5685.   '
  5686.   GOSUB rec_result("  Saving instrument chunks... ",FALSE)
  5687.   chk$="ORCH"+MKL$(10)+MKI$(nbi%)
  5688.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5689.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5690.   IF code_erreur_fichier%<0
  5691.     erreur%=code_erreur_fichier%
  5692.     GOTO sav_module_gt2_erreur
  5693.   ENDIF
  5694.   '
  5695.   ' Chunks des instruments
  5696.   '
  5697.   i%=1
  5698.   WHILE i%<=255
  5699.     IF BYTE{ADD(V:lins$,i%)}<>0
  5700.       a%=MAX(V:instrset%(0,i%)*(-flag_registered2!),&H1264)     ! A cause de la 2eme protection
  5701.       code_erreur_fichier%=FN fwrite(handle_fichier%,instrset%(1,i%),a%)
  5702.       IF code_erreur_fichier%<0
  5703.         erreur%=code_erreur_fichier%
  5704.         GOTO sav_module_gt2_erreur
  5705.       ENDIF
  5706.     ENDIF
  5707.     INC i%
  5708.   WEND
  5709.   GOSUB rec_result("done.",TRUE)
  5710.   '
  5711.   ' Chunks des samples
  5712.   '
  5713.   GOSUB rec_result("  Saving sample chunks... ",FALSE)
  5714.   i%=1
  5715.   WHILE i%<=255
  5716.     IF BYTE{ADD(V:lsam$,i%)}<>0
  5717.       a%=MAX(FN adrsamchk(i%)*(-flag_registered2!),&H1529)      ! A cause de la 2eme protection
  5718.       code_erreur_fichier%=FN fwrite(handle_fichier%,FN lonsamchk(i%),a%)
  5719.       IF code_erreur_fichier%<0
  5720.         erreur%=code_erreur_fichier%
  5721.         GOTO sav_module_gt2_erreur
  5722.       ENDIF
  5723.     ENDIF
  5724.     INC i%
  5725.   WEND
  5726.   GOSUB rec_result("done.",TRUE)
  5727.   '
  5728.   ' Chunks des enveloppes
  5729.   '
  5730.   GOSUB rec_result("  Saving envelope chunks... ",FALSE)
  5731.   i%=1
  5732.   WHILE i%<=63
  5733.     ' 8776 - attempted correction of envelope bug - /sjx.
  5734.     '    j%=2
  5735.     j%=0
  5736.     WHILE j%<=2
  5737.       IF BYTE{ADD(V:lenv$,ADD(MUL(i%,3),j%))}<>0
  5738.         ' /sjx - wtf *was* this boobytrap shit, anyway?
  5739.         a%=FN env_chunkadr(i%,j%)
  5740.         code_erreur_fichier%=FN fwrite(handle_fichier%,FN env_chunklen(i%,j%),a%)
  5741.         IF code_erreur_fichier%<0
  5742.           erreur%=code_erreur_fichier%
  5743.           GOTO sav_module_gt2_erreur
  5744.         ENDIF
  5745.       ENDIF
  5746.       INC j%
  5747.     WEND
  5748.     INC i%
  5749.   WEND
  5750.   GOSUB rec_result("done.",TRUE)
  5751.   '
  5752.   ' Chunk de fin
  5753.   '
  5754.   GOSUB rec_result("  Saving end chunks... ",FALSE)
  5755.   chk$="ENDC"+MKL$(12)+MKL$(0)
  5756.   total_len%=0          ! *********** Trouver la vraie longueur!!!
  5757.   LONG{ADD(V:chk$,8)}=total_len%
  5758.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5759.   IF code_erreur_fichier%<0
  5760.     erreur%=code_erreur_fichier%
  5761.     GOTO sav_module_gt2_erreur
  5762.   ENDIF
  5763.   GOSUB rec_result("done.",TRUE)
  5764.   '
  5765. sav_module_gt2_erreur:
  5766.   ~FRE(0)
  5767. RETURN
  5768. PROCEDURE save_module_gtk
  5769.   LOCAL a%,i%,j%,nblm%
  5770.   LOCAL loopend1%
  5771.   LOCAL a$
  5772.   GOSUB rec_result("  Saving in GTK format (old Graoumf Tracker module).",TRUE)
  5773.   '
  5774.   ' Le header du module
  5775.   '
  5776.   GOSUB rec_result("  Saving module header... ",FALSE)
  5777.   nblm%=FN nbr_lines_maxi
  5778.   a$=STRING$(206,0)
  5779.   BMOVE V:module&(0),V:a$,206
  5780.   CARD{ADD(V:a$,198)}=nblm%
  5781.   code_erreur_fichier%=FN fwrite(handle_fichier%,206,V:a$)
  5782.   IF code_erreur_fichier%<0
  5783.     erreur%=code_erreur_fichier%
  5784.     GOTO sav_module_gtk_erreur
  5785.   ENDIF
  5786.   GOSUB rec_result("done.",TRUE)
  5787.   '
  5788.   ' Les headers des samples
  5789.   '
  5790.   GOSUB rec_result("  Saving sample headers... ",FALSE)
  5791.   j%=1
  5792.   loopend1%=module&(98)
  5793.   WHILE j%<=loopend1%
  5794.     i%=FN isample(j%,48)
  5795.     a$=FN samplename$(i%)+STRING$(14,0)+MKI$(FN autobal(i%))+MKI$(FN resol(i%))+MKI$(FN freqech(i%))+MKL$(FN length(i%))+MKL$(FN repeat(i%))+MKL$(FN replen(i%))+MKI$(FN ivolume(j%))+MKI$(FN finetune(i%))
  5796.     code_erreur_fichier%=FN fwrite(handle_fichier%,64,V:a$)
  5797.     IF code_erreur_fichier%<0
  5798.       erreur%=code_erreur_fichier%
  5799.       GOTO sav_module_gtk_erreur
  5800.     ENDIF
  5801.     INC j%
  5802.   WEND
  5803.   GOSUB rec_result("done.",TRUE)
  5804.   '
  5805.   ' La song
  5806.   '
  5807.   GOSUB rec_result("  Saving song... ",FALSE)
  5808.   code_erreur_fichier%=FN fwrite(handle_fichier%,512,V:song&(0))
  5809.   IF code_erreur_fichier%<0
  5810.     erreur%=code_erreur_fichier%
  5811.     GOTO sav_module_gtk_erreur
  5812.   ENDIF
  5813.   GOSUB rec_result("done.",TRUE)
  5814.   '
  5815.   ' Les patterns
  5816.   '
  5817.   GOSUB rec_result("  Saving patterns... ",FALSE)
  5818.   loopend1%=FN last_pat_util
  5819.   i%=0
  5820.   WHILE i%<=loopend1%
  5821.     nbl%=FN nbr_lines(i%)
  5822.     a$=STRING$(MIN(MUL(MUL(nbr_track%,nblm%),5),32767),0)
  5823.     BMOVE FN adr_pat(i%),V:a$,MUL(MUL(nbr_track%,nbl%),5)
  5824.     IF nbl%<nblm%
  5825.       CARD{ADD(V:a$,SUB(MUL(MUL(nbr_track%,nbl%),5),3))}=&HD00
  5826.     ENDIF
  5827.     IF EXP(flag_registered2!)=1                 ! *** 2eme protection
  5828.       a$=STRING$(LEN(a$),0)
  5829.     ENDIF
  5830.     code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(a$),V:a$)
  5831.     IF code_erreur_fichier%<0
  5832.       erreur%=code_erreur_fichier%
  5833.       GOTO sav_module_gtk_erreur
  5834.     ENDIF
  5835.     INC i%
  5836.   WEND
  5837.   GOSUB rec_result("done.",TRUE)
  5838.   '
  5839.   ' Les samples
  5840.   '
  5841.   GOSUB rec_result("  Saving samples... ",FALSE)
  5842.   j%=1
  5843.   loopend1%=module&(98)
  5844.   WHILE j%<=loopend1%
  5845.     i%=FN isample(j%,48)
  5846.     IF FN length(i%)>0
  5847.       a%=MAX(FN adresse(i%)*(-flag_registered2!),&H1895)        ! *** 2eme protection
  5848.       code_erreur_fichier%=FN fwrite(handle_fichier%,FN length(i%),a%)
  5849.       IF code_erreur_fichier%<0
  5850.         erreur%=code_erreur_fichier%
  5851.         GOTO sav_module_gtk_erreur
  5852.       ENDIF
  5853.     ENDIF
  5854.     INC j%
  5855.   WEND
  5856.   GOSUB rec_result("done.",TRUE)
  5857.   '
  5858. sav_module_gtk_erreur:
  5859.   ~FRE(0)
  5860. RETURN
  5861. PROCEDURE save_module_mod
  5862.   ' Sauve un module au format .MOD
  5863.   LOCAL a%,b%,c%,d%,e%,i%,i2%,j%,k%,n%,nblm%
  5864.   LOCAL ss%,st%
  5865.   LOCAL loopend1%,loopend2%
  5866.   LOCAL a&,b&
  5867.   LOCAL flag_fast!
  5868.   LOCAL a$,lig$,sam$,sam2$
  5869.   LOCAL mod_header$
  5870.   ~FRE(0)
  5871.   GOSUB rec_result("  Saving in MOD format (ProTracker module).",TRUE)
  5872.   nblm%=FN nbr_lines_maxi
  5873.   IF nblm%=64 AND nbr_track%<>4                 ! On doit le sauver au format FastTracker ?
  5874.     flag_fast!=TRUE
  5875.   ELSE
  5876.     flag_fast!=FALSE
  5877.   ENDIF
  5878.   mod_header$=LEFT$(FN songname$,20)
  5879.   mod_header$=mod_header$+SPACE$(SUB(20,LEN(mod_header$)))
  5880.   '
  5881.   ' Rearrange les samples pour qu'ils puissent tous tenir
  5882.   '
  5883.   GOSUB rec_result("  Saving sample headers... ",FALSE)
  5884.   sam$=STRING$(256,0)                           ! Correspondance des samples pour la conversion des patterns
  5885.   sam2$=""
  5886.   FOR i%=1 TO 31
  5887.     sam2$=sam2$+CHR$(i%)
  5888.   NEXT i%
  5889.   BMOVE V:sam2$,SUCC(V:sam$),31
  5890.   i%=32
  5891.   j%=0
  5892.   REPEAT
  5893.     WHILE FN length(FN isample(BYTE{ADD(V:sam2$,j%)},48))<>0 AND j%<31
  5894.       INC j%
  5895.     WEND                                        ! On a trouve un emplacement libre
  5896.     EXIT IF j%>=31                              ! C'etait le dernier ? On sort alors...
  5897.     IF FN length(FN isample(i%,48))>0           ! Si on a un sample >32, on le met la.
  5898.       BYTE{ADD(V:sam$,i%)}=SUCC(j%)
  5899.       BYTE{ADD(V:sam2$,j%)}=i%
  5900.       INC j%
  5901.     ENDIF
  5902.     INC i%
  5903.   UNTIL i%>255
  5904.   ss%=MIN(j%,31)
  5905.   st%=0
  5906.   FOR i%=1 TO 255
  5907.     IF FN length(FN isample(BYTE{ADD(V:sam2$,j%)},48))<>0
  5908.       INC st%
  5909.     ENDIF
  5910.   NEXT i%
  5911.   '
  5912.   ' Sauve les headers de sample
  5913.   '
  5914.   FOR j%=0 TO 30
  5915.     i2%=BYTE{ADD(V:sam2$,j%)}
  5916.     i%=FN isample(i2%,48)
  5917.     a$=LEFT$(FN samplename$(i%),22)             ! Nom du sample
  5918.     a$=a$+SPACE$(SUB(22,LEN(a$)))
  5919.     mod_header$=mod_header$+a$
  5920.     c%=FN resol(i%)
  5921.     a&=MIN(SHR(DIV(FN length(i%),c%),1),&H7FFF) ! Longueur du sample
  5922.     mod_header$=mod_header$+MKI$(a&)
  5923.     b&=ADD(SHL(FN finetune(i%),8) AND &HF00,SHR(FN ivolume(i2%),2) AND &H7F)    ! Finetune + Volume
  5924.     mod_header$=mod_header$+MKI$(b&)
  5925.     b&=MAX(MIN(SHR(DIV(FN repeat(i%),c%),1),PRED(a&)),0)        ! Reppos
  5926.     mod_header$=mod_header$+MKI$(b&)
  5927.     b&=MAX(MIN(SHR(DIV(FN replen(i%),c%),1),SUB(a&,b&)),1)      ! Replen
  5928.     mod_header$=mod_header$+MKI$(b&)
  5929.   NEXT j%
  5930.   IF st%<=ss%
  5931.     GOSUB rec_result("done, "+STR$(j%)+"samples.",TRUE)
  5932.   ELSE
  5933.     GOSUB rec_result("done, for "+STR$(j%)+"samples. "+STR$(SUB(a%,j%))+" samples can't be saved.",TRUE)
  5934.   ENDIF
  5935.   '
  5936.   ' La song
  5937.   '
  5938.   GOSUB rec_result("  Saving song... ",FALSE)
  5939.   a&=ADD(SHL(MIN(module&(101),128),8),MIN(module&(102),127))
  5940.   mod_header$=mod_header$+MKI$(a&)              ! Songlen + Songrepeat
  5941.   a&=SHR(a&,8)
  5942.   b&=0
  5943.   a%=0
  5944.   FOR i%=0 TO 127               ! La song
  5945.     b&=MIN(song&(i%),255)
  5946.     IF i%=>a&
  5947.       b&=0
  5948.     ENDIF
  5949.     a%=MAX(a%,b&)
  5950.     mod_header$=mod_header$+CHR$(b&)
  5951.   NEXT i%
  5952.   IF flag_fast!                 ! Format FastTracker
  5953.     b%=CVL(LEFT$(STR$(nbr_track%)+"CHN",4))
  5954.     mod_header$=mod_header$+MKL$(b%)
  5955.     GOSUB rec_result("done. FastTracker '"+MKL$(b%)+"' format.",TRUE)
  5956.   ELSE IF nblm%<>64             ! Format MOD Digital Tracker (FAxx)
  5957.     b%=CVL("FA"+CHR$(ADD(DIV(nbr_track%,10),48))+CHR$(ADD(nbr_track% MOD 10,48)))
  5958.     mod_header$=mod_header$+MKL$(b%)
  5959.     c%=SHL(nblm%,16)
  5960.     mod_header$=mod_header$+MKL$(c%)
  5961.     GOSUB rec_result("done. Digital Tracker '"+MKL$(b%)+"' format.",TRUE)
  5962.   ELSE                          ! Format ProTracker standard
  5963.     b%=&H4D2E4B2E
  5964.     mod_header$=mod_header$+MKL$(b%)
  5965.     GOSUB rec_result("done. Standard ProTracker 'M.K.' format.",TRUE)
  5966.   ENDIF
  5967.   ' Sauve le tout
  5968.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(mod_header$),V:mod_header$)
  5969.   IF code_erreur_fichier%<0
  5970.     erreur%=code_erreur_fichier%
  5971.     GOTO sav_module_mod_erreur
  5972.   ENDIF
  5973.   '
  5974.   ' Les patterns
  5975.   '
  5976.   GOSUB rec_result("  Saving patterns... ",FALSE)
  5977.   j%=0
  5978.   loopend1%=a%
  5979.   WHILE j%<=loopend1%                   ! Les patterns
  5980.     n%=FN nbr_lines(j%)
  5981.     lig$=STRING$(SHL(nbr_track%,2),0)
  5982.     b%=FN adr_pat(j%)
  5983.     i%=0
  5984.     loopend2%=PRED(n%)
  5985.     WHILE i%<=loopend2%
  5986.       c%=V:lig$
  5987.       d%=V:sam$
  5988.       e%=MAX(nbr_track%*(-flag_registered2!),1) ! *** 2eme protection
  5989.       ~C:g_convert_gtk_2_nt%(L:b%,L:c%,L:d%,W:e%)
  5990.       IF i%=PRED(n%) AND n%<nblm%
  5991.         CARD{ADD(V:lig$,SUB(SHL(nbr_track%,2),2))}=ADD(CARD{ADD(V:lig$,SUB(SHL(nbr_track%,2),2))} AND &HF000,&HD00)
  5992.       ENDIF
  5993.       code_erreur_fichier%=FN fwrite(handle_fichier%,SHL(nbr_track%,2),V:lig$)
  5994.       IF code_erreur_fichier%<0
  5995.         erreur%=code_erreur_fichier%
  5996.         GOTO sav_module_mod_erreur
  5997.       ENDIF
  5998.       ADD b%,MUL(nbr_track%,5)
  5999.       INC i%
  6000.     WEND
  6001.     IF n%<nblm%
  6002.       lig$=STRING$(MUL(SHL(nbr_track%,2),SUB(nblm%,n%)),0)
  6003.       code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(lig$),V:lig$)
  6004.       IF code_erreur_fichier%<0
  6005.         erreur%=code_erreur_fichier%
  6006.         GOTO sav_module_mod_erreur
  6007.       ENDIF
  6008.     ENDIF
  6009.     INC j%
  6010.   WEND
  6011.   GOSUB rec_result("done.",TRUE)
  6012.   '
  6013.   ' Les samples
  6014.   '
  6015.   ' Penser a reechantillonner si besoin est
  6016.   GOSUB rec_result("  Saving samples... ",FALSE)
  6017.   lig$=STRING$(16384,0)
  6018.   j%=0
  6019.   WHILE j%<=30                  ! Les samples
  6020.     i%=FN isample(BYTE{ADD(V:sam2$,j%)},48)
  6021.     a%=MIN(DIV(FN length(i%),FN resol(i%)) AND -2,&HFFFE)
  6022.     IF a%>0
  6023.       IF FN resol(i%)=2         ! Convertit 16 bits en 8 bits
  6024.         k%=0
  6025.         REPEAT
  6026.           b%=ADD(FN adresse(i%),SHL(k%,1))
  6027.           d%=MIN(SHL(SUB(a%,k%) AND -2,1),32768)
  6028.           c%=V:lig$
  6029.           IF COS(flag_registered2!)<1           ! *** 2eme protection
  6030.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  6031.           ENDIF
  6032.           code_erreur_fichier%=FN fwrite(handle_fichier%,SHR(d%,1),V:lig$)
  6033.           IF code_erreur_fichier%<0
  6034.             erreur%=code_erreur_fichier%
  6035.             GOTO sav_module_mod_erreur
  6036.           ENDIF
  6037.           ADD k%,SHR(d%,1)
  6038.         UNTIL k%>=a%
  6039.       ELSE
  6040.         b%=MAX(FN adresse(i%)*(-flag_registered2!),&H1958)      ! *** 2eme protection
  6041.         code_erreur_fichier%=FN fwrite(handle_fichier%,a%,b%)
  6042.         IF code_erreur_fichier%<0
  6043.           erreur%=code_erreur_fichier%
  6044.           GOTO sav_module_mod_erreur
  6045.         ENDIF
  6046.       ENDIF
  6047.     ENDIF
  6048.     INC j%
  6049.   WEND
  6050.   GOSUB rec_result("done.",TRUE)
  6051.   '
  6052. sav_module_mod_erreur:
  6053.   ~FRE(0)
  6054. RETURN
  6055. PROCEDURE save_module_s3m
  6056.   LOCAL a%,b%,c%,d%,e%,f%,i%,j%,nbl%,nblm%,p%,xxx1%,xxx2%,xxx3%
  6057.   LOCAL loopend1%
  6058.   LOCAL a$,b$,mod$,pp$,ps$
  6059.   ~FRE(0)
  6060.   GOSUB rec_result("  Saving in S3M format (ScreamTracker 3 module).",TRUE)
  6061.   vide$=STRING$(16,0)
  6062.   nblm%=FN nbr_lines_maxi
  6063.   xxx1%=ADD(&H60,SUCC(FN song_length) AND -2)
  6064.   xxx2%=ADD(xxx1%,SHL(FN last_spl_util2,1))
  6065.   xxx3%=ADD(xxx2%,SHL(SUCC(FN last_pat_util),1))
  6066.   p%=ADD(ADD(xxx3%,32),15) AND -16      ! Debut des donnees de pat ou spl, alignement car parapointer
  6067.   '
  6068.   ' Le header du module
  6069.   '
  6070.   GOSUB rec_result("  Saving module header... ",FALSE)
  6071.   a%=FN mod_tempo                               ! Tempo
  6072.   mod$=LEFT$(FN songname$,28)+MKI$(&H1A10)+MKI$(0)
  6073.   mod$=mod$+MKI$(SUCC(FN song_length) AND -2)+MKI$(FN last_spl_util2)+MKI$(SUCC(FN last_pat_util))+MKI$(0)
  6074.   mod$=mod$+"GT"+MKI$(2)+"SCRM"
  6075.   mod$=mod$+CHR$(&H40)+CHR$(CARD{r_mod_speed%})+CHR$(a%)+CHR$(&HFF)+CHR$(0)+CHR$(252)+STRING$(10,0)
  6076.   GOSUB intel_w(ADD(V:mod$,&H20))
  6077.   GOSUB intel_w(ADD(V:mod$,&H22))
  6078.   GOSUB intel_w(ADD(V:mod$,&H24))
  6079.   GOSUB intel_w(ADD(V:mod$,&H26))
  6080.   GOSUB intel_w(ADD(V:mod$,&H2A))
  6081.   ' Les channels settings
  6082.   a%=0
  6083.   b%=0
  6084.   FOR i%=0 TO 31
  6085.     IF i%<nbr_track%
  6086.       IF FN balance(i%)<&H800
  6087.         mod$=mod$+CHR$(a%)
  6088.         a%=SUCC(a%) AND 7
  6089.       ELSE
  6090.         mod$=mod$+CHR$(ADD(b%,8))
  6091.         b%=SUCC(b%) AND 7
  6092.       ENDIF
  6093.     ELSE
  6094.       mod$=mod$+CHR$(255)
  6095.     ENDIF
  6096.   NEXT i%
  6097.   ' La song
  6098.   FOR i%=0 TO PRED(FN song_length)
  6099.     mod$=mod$+CHR$(song&(i%))
  6100.   NEXT i%
  6101.   IF (FN song_length AND 1)=1
  6102.     mod$=mod$+CHR$(255)
  6103.   ENDIF
  6104.   mod$=mod$+STRING$(SUB(p%,LEN(mod$)),0)
  6105.   ' Les Pan Pos
  6106.   FOR i%=0 TO PRED(nbr_track%)
  6107.     a%=ADD(FN balance(i%),&H80)                 ! Meilleure estimation possible
  6108.     BYTE{ADD(ADD(V:mod$,xxx3%),i%)}=ADD(MIN(DIV(MUL(a%,15),&H1000),15),32)
  6109.   NEXT i%
  6110.   code_erreur_fichier%=FN fwrite(handle_fichier%,p%,V:mod$)
  6111.   IF code_erreur_fichier%<0
  6112.     erreur%=code_erreur_fichier%
  6113.     GOTO sav_module_s3m_erreur
  6114.   ENDIF
  6115.   GOSUB rec_result("done.",TRUE)
  6116.   '
  6117.   ' Les samples
  6118.   '
  6119.   GOSUB rec_result("  Saving samples... ",FALSE)
  6120.   ps$=""                        ! Liste des parapointers
  6121.   j%=1
  6122.   loopend1%=FN last_spl_util2
  6123.   WHILE j%<=loopend1%
  6124.     i%=FN isample(j%,48)
  6125.     ps$=ps$+MKI$(SHR(p%,4))
  6126.     ' Le header
  6127.     a$=CHR$(1)+"SAMPLE"+HEX$(j%,2)+STRING$(5,0)+MKI$(SHR(ADD(p%,&H50),4))
  6128.     a$=a$+MKL$(FN length(i%))+MKL$(FN repeat(i%))+MKL$(ADD(FN repeat(i%),FN replen(i%)))
  6129.     a$=a$+CHR$(SHR(FN ivolume(j%),2))+CHR$(0)+CHR$(0)
  6130.     IF ADD(FN repeat(i%),FN replen(i%))<=2
  6131.       a%=0
  6132.     ELSE
  6133.       a%=1
  6134.     ENDIF
  6135.     a$=a$+CHR$(ADD(a%,SHL(PRED(FN resol(i%)),2)))
  6136.     a%=FN freqech(i%)*(2^(FN finetune(i%)/96))
  6137.     a$=a$+MKL$(a%)+STRING$(12,0)+FN samplename$(i%)+"SCRS"
  6138.     GOSUB intel_w(ADD(V:a$,&HE))
  6139.     GOSUB intel_l(ADD(V:a$,&H10))
  6140.     GOSUB intel_l(ADD(V:a$,&H14))
  6141.     GOSUB intel_l(ADD(V:a$,&H18))
  6142.     GOSUB intel_l(ADD(V:a$,&H20))
  6143.     code_erreur_fichier%=FN fwrite(handle_fichier%,16,V:vide$)
  6144.     IF code_erreur_fichier%<0
  6145.       erreur%=code_erreur_fichier%
  6146.       GOTO sav_module_s3m_erreur
  6147.     ENDIF
  6148.     code_erreur_fichier%=GEMDOS(66,L:p%,W:handle_fichier%,W:0)  ! Seek
  6149.     IF code_erreur_fichier%<0
  6150.       erreur%=code_erreur_fichier%
  6151.       GOTO sav_module_s3m_erreur
  6152.     ENDIF
  6153.     code_erreur_fichier%=FN fwrite(handle_fichier%,&H50,V:a$)
  6154.     IF code_erreur_fichier%<0
  6155.       erreur%=code_erreur_fichier%
  6156.       GOTO sav_module_s3m_erreur
  6157.     ENDIF
  6158.     ADD p%,&H50
  6159.     ' Donnees
  6160.     a$=STRING$(16384,0)
  6161.     a%=0
  6162.     e%=FN resol(i%)
  6163.     WHILE SUB(FN length(i%),a%)>0
  6164.       b%=ADD(FN adresse(i%),a%)
  6165.       c%=V:a$
  6166.       d%=MIN(16384,SUB(FN length(i%),a%))
  6167.       f%=d%*(-flag_registered2!)                ! *** 2eme protection
  6168.       BMOVE b%,c%,f%
  6169.       ~C:g_signe_sample%(L:c%,L:d%,W:e%)
  6170.       IF e%=2
  6171.         ~C:g_intel_16_bits%(L:c%,L:d%)
  6172.       ENDIF
  6173.       code_erreur_fichier%=FN fwrite(handle_fichier%,d%,V:a$)
  6174.       IF code_erreur_fichier%<0
  6175.         erreur%=code_erreur_fichier%
  6176.         GOTO sav_module_s3m_erreur
  6177.       ENDIF
  6178.       ADD a%,d%
  6179.     WEND
  6180.     p%=ADD(ADD(p%,FN length(i%)),15) AND -16
  6181.     INC j%
  6182.   WEND
  6183.   GOSUB rec_result("done.",TRUE)
  6184.   '
  6185.   ' les patterns
  6186.   '
  6187.   GOSUB rec_result("  Packing and saving patterns... ",FALSE)
  6188.   a$=STRING$(16384,0)           ! Au grand maximum...
  6189.   b$=STRING$(10240,0)
  6190.   pp$=""                        ! Liste des parapointers
  6191.   i%=0
  6192.   loopend1%=FN last_pat_util
  6193.   WHILE i%<=loopend1%
  6194.     nbl%=FN nbr_lines(i%)
  6195.     pp$=pp$+MKI$(SHR(p%,4))
  6196.     GOSUB clear_mem(V:b$,10240)
  6197.     BMOVE FN adr_pat(i%),V:b$,MUL(MUL(nbr_track%,MIN(64,nblm%)),5)
  6198.     IF nbl%<64
  6199.       CARD{ADD(V:b$,SUB(MUL(MUL(nbr_track%,nbl%),5),3))}=&HD00
  6200.     ENDIF
  6201.     a%=V:b$
  6202.     b%=V:a$
  6203.     c%=MAX(nbr_track%*(-flag_registered2!),1)           ! *** 2eme protection
  6204.     d%=MAX(MIN(nblm%,64)*(-flag_registered2!),1)        ! *** 2eme protection
  6205.     ~C:g_convert_gtk_2_s3m%(L:a%,L:b%,W:c%,W:d%)
  6206.     a%=CARD{V:a$}
  6207.     GOSUB intel_w(V:a$)
  6208.     code_erreur_fichier%=FN fwrite(handle_fichier%,16,V:vide$)
  6209.     IF code_erreur_fichier%<0
  6210.       erreur%=code_erreur_fichier%
  6211.       GOTO sav_module_s3m_erreur
  6212.     ENDIF
  6213.     code_erreur_fichier%=GEMDOS(66,L:p%,W:handle_fichier%,W:0)  ! Seek
  6214.     IF code_erreur_fichier%<0
  6215.       erreur%=code_erreur_fichier%
  6216.       GOTO sav_module_s3m_erreur
  6217.     ENDIF
  6218.     code_erreur_fichier%=FN fwrite(handle_fichier%,a%,V:a$)
  6219.     IF code_erreur_fichier%<0
  6220.       erreur%=code_erreur_fichier%
  6221.       GOTO sav_module_s3m_erreur
  6222.     ENDIF
  6223.     p%=ADD(ADD(p%,a%),15) AND -16
  6224.     INC i%
  6225.   WEND
  6226.   GOSUB rec_result("done.",TRUE)
  6227.   '
  6228.   ' Sauvegarde des parapointers
  6229.   '
  6230.   GOSUB rec_result("  Saving pointers... ",FALSE)
  6231.   FOR i%=0 TO SUB(LEN(pp$),2) STEP 2
  6232.     GOSUB intel_w(ADD(V:pp$,i%))
  6233.   NEXT i%
  6234.   FOR i%=0 TO SUB(LEN(ps$),2) STEP 2
  6235.     GOSUB intel_w(ADD(V:ps$,i%))
  6236.   NEXT i%
  6237.   code_erreur_fichier%=GEMDOS(66,L:xxx1%,W:handle_fichier%,W:0) ! Seek
  6238.   IF code_erreur_fichier%<0
  6239.     erreur%=code_erreur_fichier%
  6240.     GOTO sav_module_s3m_erreur
  6241.   ENDIF
  6242.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(ps$),V:ps$)
  6243.   IF code_erreur_fichier%<0
  6244.     erreur%=code_erreur_fichier%
  6245.     GOTO sav_module_s3m_erreur
  6246.   ENDIF
  6247.   code_erreur_fichier%=GEMDOS(66,L:xxx2%,W:handle_fichier%,W:0) ! Seek
  6248.   IF code_erreur_fichier%<0
  6249.     erreur%=code_erreur_fichier%
  6250.     GOTO sav_module_s3m_erreur
  6251.   ENDIF
  6252.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(pp$),V:pp$)
  6253.   IF code_erreur_fichier%<0
  6254.     erreur%=code_erreur_fichier%
  6255.     GOTO sav_module_s3m_erreur
  6256.   ENDIF
  6257.   GOSUB rec_result("done.",TRUE)
  6258.   '
  6259. sav_module_s3m_erreur:
  6260.   ~FRE(0)
  6261. RETURN
  6262. PROCEDURE save_module_xm                !!!
  6263. RETURN
  6264. PROCEDURE load_module
  6265.   LOCAL time_taken%,erreur%
  6266.   LOCAL a$
  6267.   ~FRE(0)
  6268.   erreur%=0
  6269.   IF km%=2 AND nfile_module$<>""
  6270.     a$=npath_module$+nfile_module$
  6271.   ELSE
  6272.     CLS
  6273.     GOSUB cadre_texte("LOAD MODULE",0,0,PRED(scr_ncol%))
  6274.     GOSUB sjx_system_to_gem
  6275.     FILESELECT npath_module$+next_module$,nfile_module$,a$
  6276.     GOSUB sjx_system_to_gtk
  6277.   ENDIF
  6278.   IF a$<>""
  6279.     IF FN exist(a$)
  6280.       CLS
  6281.       GOSUB cadre_texte("WAITING : LOADING MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  6282.       ~FRE(0)
  6283.       GOSUB rec_result("Loading module "+a$+"...",TRUE)
  6284.       time_taken%=TIMER
  6285.       GOSUB load_module2
  6286.       time_taken%=SUB(TIMER,time_taken%)
  6287.       IF erreur%=0
  6288.         GOSUB rec_result("Complete. Time for loading: "+FN time_hmsd$(time_taken%),TRUE)
  6289.         GOSUB separe_nom_chemin(a$)
  6290.         npath_module$=npath_$
  6291.         nfile_module$=nfile_$
  6292.       ENDIF
  6293.     ENDIF
  6294.   ENDIF
  6295.   GOSUB bee(FALSE)
  6296.   SELECT erreur%
  6297.   CASE 0                                        ! Pas d'erreur, tout est OK
  6298.     IF play%=1
  6299.       GOSUB play_song(TRUE)
  6300.     ELSE IF play%=2
  6301.       GOSUB play_pattern(TRUE)
  6302.     ELSE
  6303.       GOSUB stop_voices
  6304.     ENDIF
  6305.   CASE 1
  6306.     GOSUB rec_result("Error: No memory enough.",TRUE)
  6307.     GOSUB dialog("FILE","Error:|No memory enough|to load this module!","Cancel",MOUSEX,MOUSEY)
  6308.   CASE 2
  6309.     GOSUB rec_result("Error: No memory enough.",TRUE)
  6310.     GOSUB dialog("FILE","Error:|No memory enough|to load the pattern section|of this module!","Cancel",MOUSEX,MOUSEY)
  6311.   CASE 3
  6312.     GOSUB rec_result("Error: No memory enough.",TRUE)
  6313.     GOSUB dialog("FILE","Error:|No memory enough|to load the sample section|of this module!","Cancel",MOUSEX,MOUSEY)
  6314.   CASE 4
  6315.     GOSUB rec_result("Error: Unknown format.",TRUE)
  6316.     GOSUB dialog("FILE","Error:|Unknown module format, or|probably an unknown compression|type.","Cancel",MOUSEX,MOUSEY)
  6317.   DEFAULT
  6318.     GOSUB rec_result("Disk error: "+STR$(erreur%),TRUE)
  6319.     GOSUB dialog("FILE","Error:|"+STR$(erreur%),"Cancel",MOUSEX,MOUSEY)
  6320.   ENDSELECT
  6321.   GOSUB affiche_panneau_principal
  6322. RETURN
  6323. PROCEDURE load_module2
  6324.   ' a$ nom du module
  6325.   LOCAL a%,admod%,anc%,b%,c%,i%,j%,ticks%,mastervol%
  6326.   LOCAL lonmod%,place_totale2%,tempo%,translate%
  6327.   LOCAL handle_fichier%,taille_fichier%
  6328.   LOCAL a&
  6329.   LOCAL b$,balance$,chk$,chunk$,chknbv$,header$,track_volume$
  6330.   LOCAL filename$
  6331.   ~FRE(0)
  6332.   GOSUB bee(TRUE)
  6333.   warning%=0
  6334.   place_totale2%=place_totale%
  6335.   translate%=0                          ! Decalage du buffer au cours du chargement du module
  6336.   ticks%=6                              ! Vitesse de base
  6337.   tempo%=125                            ! Tempo BPM de base
  6338.   mastervol%=0                          ! Master
  6339.   FOR i%=0 TO 31                        ! Fixe la balance par defaut
  6340.     balance$=balance$+MKI$(MUL(SHR(SUCC(i%),1) AND 1,&HFFF))
  6341.   NEXT i%
  6342.   track_volume$=STRING$(32,MKI$(&H1000))
  6343.   OPEN "i",#0,a$
  6344.   taille_fichier%=LOF(#0)
  6345.   CLOSE #0
  6346.   filename$=a$+CHR$(0)
  6347.   handle_fichier%=GEMDOS(61,L:V:filename$,W:0)
  6348.   header$=STRING$(4096,0)
  6349.   code_erreur_fichier%=FN fread(handle_fichier%,MIN(LEN(header$),taille_fichier%),V:header$)
  6350.   IF code_erreur_fichier%<0
  6351.     erreur%=code_erreur_fichier%
  6352.     GOTO ld_module2_fin
  6353.   ENDIF
  6354.   ~FRE(0)
  6355.   crunched%=0
  6356.   '
  6357.   ' Module packe ?
  6358.   '
  6359.   IF LEFT$(header$,3)="ATM"                     ! Si c'est un fichier packe (Atomic packer 3.5)
  6360.     lonmod%=LONG{ADD(V:header$,4)}              ! Longueur du module decompacte
  6361.     GOSUB rec_result("File crunched with Atomik Packer 3.5",TRUE)
  6362.     GOTO ld_mod2_comp_suite
  6363.   ELSE IF LEFT$(header$,4)="Ice!"               ! Si c'est un fichier packe (Ice Packer 2.1)
  6364.     lonmod%=LONG{ADD(V:header$,4)}              ! Longueur du module decompacte
  6365.     GOSUB rec_result("File crunched with Ice Packer 2.1",TRUE)
  6366.     GOTO ld_mod2_comp_suite
  6367.   ELSE IF LEFT$(header$,4)="ICE!"               ! Si c'est un fichier packe (Ice Packer 2.4)
  6368.     lonmod%=LONG{ADD(V:header$,8)}              ! Longueur du module decompacte
  6369.     GOSUB rec_result("File crunched with Ice Packer 2.4",TRUE)
  6370.     GOTO ld_mod2_comp_suite
  6371.   ELSE IF LEFT$(header$,4)="SPv3"               ! Si c'est un fichier packe (Speed Packer 3)
  6372.     lonmod%=LONG{ADD(V:header$,12)}             ! Longueur du module decompacte
  6373.     GOSUB rec_result("File crunched with Speed Packer 3",TRUE)
  6374.     GOTO ld_mod2_comp_suite
  6375.   ld_mod2_comp_suite:
  6376.     IF lonmod%<FN zone_free2                    ! Y a la place ?
  6377.       GOSUB rec_result("Clearing memory... ",FALSE)
  6378.       GOSUB stop_voices
  6379.       GOSUB clear_samples
  6380.       GOSUB clear_instr
  6381.       admod%=SUB(FN zone_end,lonmod%)
  6382.       BMOVE ADD(FN adr_buffer,lonmod%),FN adr_buffer,SUB(FN lon_buffer,lonmod%)
  6383.       GOSUB rec_result("done.",TRUE)
  6384.       GOSUB rec_result("Loading module... ",FALSE)
  6385.       code_erreur_fichier%=GEMDOS(66,L:0,W:handle_fichier%,W:0) ! Seek
  6386.       IF code_erreur_fichier%<0
  6387.         erreur%=code_erreur_fichier%
  6388.         GOTO ld_module2_fin
  6389.       ENDIF
  6390.       code_erreur_fichier%=FN fread(handle_fichier%,taille_fichier%,admod%)
  6391.       IF code_erreur_fichier%<0
  6392.         erreur%=code_erreur_fichier%
  6393.         GOTO ld_module2_fin
  6394.       ENDIF
  6395.       GOSUB rec_result("done.",TRUE)
  6396.       IF flag_autoload!
  6397.         GOSUB aff_message("WAITING : DECRUNCHING MODULE")
  6398.       ELSE
  6399.         GOSUB cadre_texte("WAITING : DECRUNCHING MODULE",0,0,PRED(scr_ncol%))
  6400.       ENDIF
  6401.       GOSUB bee(TRUE)
  6402.       GOSUB rec_result("Decrunching module... ",FALSE)
  6403.       ~C:g_atomic_35_unpack%(L:admod%)
  6404.       ~C:g_packice_21_unpack%(L:admod%)
  6405.       ~C:g_packice_24_unpack%(L:admod%)
  6406.       ~C:g_speedpacker_unpack%(L:admod%)
  6407.       GOSUB rec_result("done.",TRUE)
  6408.       BMOVE admod%,V:header$,4096               ! Nouveau header
  6409.       GOTO ld_module2_cv_in_mem
  6410.     ELSE
  6411.       erreur%=1                                 ! Pas assez de memoire
  6412.       GOTO ld_module2_fin
  6413.     ENDIF
  6414.     '
  6415.     ' On peut le charger en memoire puis le convertir apres
  6416.     '
  6417.   ELSE IF taille_fichier%<FN zone_free2
  6418.     GOSUB rec_result("Clearing memory... ",FALSE)
  6419.     GOSUB stop_voices
  6420.     GOSUB clear_samples
  6421.     GOSUB clear_instr
  6422.     GOSUB rec_result("done.",TRUE)
  6423.     GOSUB rec_result("Loading module... ",FALSE)
  6424.     lonmod%=taille_fichier%
  6425.     admod%=SUB(FN zone_end,lonmod%)
  6426.     BMOVE ADD(FN adr_buffer,lonmod%),FN adr_buffer,SUB(FN lon_buffer,lonmod%)
  6427.     code_erreur_fichier%=GEMDOS(66,L:0,W:handle_fichier%,W:0) ! Seek
  6428.     IF code_erreur_fichier%<0
  6429.       erreur%=code_erreur_fichier%
  6430.       GOTO ld_module2_fin
  6431.     ENDIF
  6432.     code_erreur_fichier%=FN fread(handle_fichier%,lonmod%,admod%)
  6433.     IF code_erreur_fichier%<0
  6434.       erreur%=code_erreur_fichier%
  6435.       GOTO ld_module2_fin
  6436.     ENDIF
  6437.     GOSUB rec_result("done.",TRUE)
  6438.     '
  6439.     ' Conversion en memoire
  6440.     '
  6441.   ld_module2_cv_in_mem:
  6442.     IF flag_autoload!
  6443.       GOSUB aff_message("WAITING : CONVERTING MODULE")
  6444.     ELSE
  6445.       GOSUB cadre_texte("WAITING : CONVERTING MODULE",0,0,PRED(scr_ncol%))
  6446.     ENDIF
  6447.     SUB place_totale2%,lonmod%
  6448.     SWAP place_totale%,place_totale2%
  6449.     GOSUB bee(TRUE)
  6450.     SHOWM
  6451.     IF LEFT$(header$,3)="GT2"
  6452.       GOSUB load_module_gt2_mem
  6453.     ELSE IF LEFT$(header$,3)="GTK"
  6454.       GOSUB load_module_gtk_mem
  6455.     ELSE
  6456.       ' Sinon ca doit encore etre un de ces p... de modules Noisetracker !!!
  6457.       chunk$="M.K.M&K&FLT4FLT6FLT8CD81CD82CD83CD41CD42CD43CD61CD62CD63M!K!RASPM~K~"
  6458.       '      chknbv$=MKL$(&H4040406)+MKL$(&H8080404)
  6459.       chk$=MID$(header$,&H439,4)
  6460.       a%=INSTR(chunk$,chk$)
  6461.       IF (a% AND 3)=1 OR (LEFT$(chk$,2)="FA" AND VAL(RIGHT$(chk$,2))>0) OR (RIGHT$(chk$,3)="CHN" AND VAL(LEFT$(chk$,1))>0) OR (RIGHT$(chk$,2)="CH" AND VAL(LEFT$(chk$,2))>0)
  6462.         GOSUB load_module_mod_mem
  6463.       ELSE IF LONG{V:header$}=&H4D4D4431
  6464.         ' Format OCTAmed Amiga
  6465.         GOSUB load_module_octamed_mem
  6466.       ELSE IF CARD{V:header$}=&H6966
  6467.         ' Foramt 669
  6468.         GOSUB load_module_669_mem
  6469.       ELSE IF MID$(header$,1,3)="MTM"
  6470.         ' Format MTM
  6471.         GOSUB load_module_mtm_mem
  6472.       ELSE IF MID$(header$,&H2D,4)="SCRM"
  6473.         ' Format  Scream Tracker 3
  6474.         GOSUB load_module_s3m_mem
  6475.       ELSE IF LEFT$(header$,12)="MAS_UTrack_V"
  6476.         ' Format Ultra Tracker
  6477.         GOSUB load_module_ult_mem
  6478.       ELSE IF LEFT$(header$,4)="D.T."
  6479.         ' Format Digital Tracker
  6480.         GOSUB load_module_dtm_mem
  6481.       ELSE IF LEFT$(header$,17)="Extended Module: "
  6482.         ' Format FastTracker 2
  6483.         GOSUB load_module_xm_mem
  6484.       ELSE
  6485.         ' Autre format ?
  6486.         '        GOTO ld_module2_disk   -- bug /sjx  0.8773 (there wasn't a label for this, caused jmp 0!)
  6487.         erreur%=4                               ! unknown format error /sjx.
  6488.         GOTO ld_module2_fin
  6489.       ENDIF
  6490.     ENDIF
  6491.     SWAP place_totale%,place_totale2%
  6492.     BMOVE FN adr_buffer,ADD(FN adr_buffer,SUB(lonmod%,translate%)),SUB(FN lon_buffer,SUB(lonmod%,translate%))
  6493.   ELSE
  6494.     erreur%=1                                   ! Pas assez de memoire
  6495.     GOTO ld_module2_fin
  6496.   ENDIF
  6497.   '
  6498.   ' Reorganisation
  6499.   '
  6500.   IF erreur%=0
  6501.     GOSUB rec_result("  Tracks: "+STR$(nbr_track%),TRUE)
  6502.     GOSUB rec_result("  Tempo: "+STR$(tempo%)+" BPM",TRUE)
  6503.     GOSUB rec_result("  Ticks per line: "+STR$(ticks%),TRUE)
  6504.     GOSUB rec_result("  Master Volume: "+STR$(mastervol%)+"/4096",TRUE)
  6505.     ' Reorganise un peut tout ca
  6506.     para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  6507.     FOR i%=1 TO 255
  6508.       ~C:rr_boucle_sample%(W:i%)
  6509.     NEXT i%
  6510.     module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  6511.     module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  6512.     ARRAYFILL pattern_bidon%(),0
  6513.     bl_start&=0
  6514.     bl_end&=0
  6515.     bl_trk&=0
  6516.     bl_pat&=0
  6517.     IF mastervol%=0
  6518.       DPOKE r_master_vol%,MIN(DIV(&H3000,ADD(nbr_track%,4)),&H500)
  6519.     ELSE
  6520.       DPOKE r_master_vol%,mastervol%
  6521.     ENDIF
  6522.     GOSUB chg_tempo(tempo%)
  6523.     DPOKE r_mod_speed%,ticks%
  6524.     DPOKE r_mod_nbrtrack%,nbr_track%
  6525.     GOSUB set_balance(balance$)
  6526.     GOSUB set_track_volume(track_volume$)
  6527.   ENDIF
  6528.   '
  6529. ld_module2_fin:
  6530.   code_erreur_fichier%=GEMDOS(62,W:handle%)
  6531.   IF code_erreur_fichier%<0
  6532.     erreur%=code_erreur_fichier%
  6533.   ENDIF
  6534.   GOSUB garbage_collection
  6535.   ~FRE(0)
  6536. RETURN
  6537. PROCEDURE load_module_gtk               !!!
  6538.   ' Modules GTK
  6539.   ' header$ : 4096 octets du debut du module
  6540. ld_module_gtk_fin:
  6541. RETURN
  6542. PROCEDURE load_module_gtk_mem
  6543.   ' Conversion d'un module au format GTK (ancien format interne) deja en memoire
  6544.   ' header$ : 4096 octets du debut du module
  6545.   LOCAL a%,b%,c%,i%,nvf%,pt%,nbs%,nbl%,adi$
  6546.   LOCAL nbp%,nbs2%
  6547.   ~FRE(0)
  6548.   GOSUB rec_result("It is an old Graoumf Tracker module (GTK).",TRUE)
  6549.   nvf%=BYTE{ADD(admod%,3)}              ! Numero de version du format
  6550.   nbl%=CARD{ADD(admod%,198)}            ! Nombre de lignes
  6551.   GOSUB new_pattern_format(CARD{ADD(admod%,200)})
  6552.   BMOVE admod%,V:module&(0),&HCE
  6553.   nbs%=module&(98)
  6554.   module&(98)=255
  6555.   pt%=ADD(admod%,&HCE)                  ! Pointe dans le fichier en memoire
  6556.   '
  6557.   ' Les headers des instruments
  6558.   '
  6559.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  6560.   nbs2%=0
  6561.   FOR i%=1 TO nbs%
  6562.     GOSUB chg_samplename2(pt%,28,i%)
  6563.     GOSUB chg_instrname2(pt%,28,i%)
  6564.     IF nvf%>2
  6565.       GOSUB chg_sam_balance(i%,CARD{ADD(pt%,42)})
  6566.     ELSE
  6567.       SUB pt%,16
  6568.     ENDIF
  6569.     IF nvf%>1
  6570.       GOSUB chg_sam_nbits(i%,CARD{ADD(pt%,44)})
  6571.       GOSUB chg_sam_freq(i%,CARD{ADD(pt%,46)})
  6572.     ENDIF
  6573.     a%=LONG{ADD(pt%,48)}
  6574.     IF a%>0
  6575.       INC nbs2%
  6576.     ENDIF
  6577.     GOSUB chg_sam_length(i%,a%)
  6578.     GOSUB chg_sam_repeat(i%,LONG{ADD(pt%,52)})
  6579.     GOSUB chg_sam_replen(i%,LONG{ADD(pt%,56)})
  6580.     GOSUB chg_ins_volume(i%,CARD{ADD(pt%,60)})
  6581.     GOSUB chg_sam_volume(i%,&H100)
  6582.     GOSUB chg_sam_finetune(i%,INT{ADD(pt%,62)})
  6583.     ADD pt%,64
  6584.   NEXT i%
  6585.   GOSUB rec_result("done.",TRUE)
  6586.   '
  6587.   ' La song
  6588.   '
  6589.   GOSUB rec_result("  Converting song... ",FALSE)
  6590.   BMOVE pt%,V:song&(0),512
  6591.   ADD pt%,512
  6592.   nbp%=0
  6593.   FOR i%=0 TO PRED(module&(101))
  6594.     nbp%=MAX(nbp%,song&(i%))
  6595.   NEXT i%
  6596.   INC nbp%
  6597.   c%=MUL(MUL(nbp%,MUL(nbr_track%,nbl%)),5)
  6598.   ~FRE(0)
  6599.   GOSUB rec_result("done.",TRUE)
  6600.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  6601.   GOSUB rec_result("  "+STR$(nbs2%)+" samples.",TRUE)
  6602.   '
  6603.   ' Les patterns
  6604.   '
  6605.   GOSUB rec_result("  Converting patterns... ",FALSE)
  6606.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbr_track%)+MKI$(nbl%)),nbp%,FALSE)
  6607.   c%=MUL(nbr_track%,nbl%)
  6608.   IF nvf%<4
  6609.     FOR i%=0 TO PRED(nbp%)
  6610.       b%=FN adr_pat(i%)
  6611.       BMOVE pt%,b%,SHL(c%,2)
  6612.       ADD pt%,SHL(c%,2)
  6613.       ~C:g_convert_gtk_2_gtk_vol%(L:b%,L:c%)
  6614.     NEXT i%
  6615.   ELSE
  6616.     FOR i%=0 TO PRED(nbp%)
  6617.       BMOVE pt%,FN adr_pat(i%),MUL(c%,5)
  6618.       ADD pt%,MUL(c%,5)
  6619.     NEXT i%
  6620.   ENDIF
  6621.   GOSUB rec_result("done.",TRUE)
  6622.   '
  6623.   ' Les instruments
  6624.   '
  6625.   GOSUB rec_result("  Converting samples... ",FALSE)
  6626.   adi$=""
  6627.   FOR i%=1 TO nbs%
  6628.     adi$=adi$+MKL$(pt%)
  6629.     ADD pt%,FN length(i%)
  6630.   NEXT i%
  6631.   FOR i%=1 TO nbs%
  6632.     GOSUB decale_sample(i%,nbs%,V:adi$)
  6633.   NEXT i%
  6634.   GOSUB rec_result("done.",TRUE)
  6635. ld_module_gtk_mem_fin:
  6636. RETURN
  6637. PROCEDURE load_module_gt2               !!!
  6638. RETURN
  6639. PROCEDURE load_module_gt2_mem
  6640.   ' Conversion d'un module au format GT2 (nouveau format interne) deja en memoire
  6641.   LOCAL a%,b%,c%,d%,e%,f%,i%,j%,finmod%,flags%,linestoadd%,version%
  6642.   LOCAL xcomchk%,orchchk%,patschk%,songchk%,tcn1chk%,tvolchk%
  6643.   LOCAL nbp%,nbs%,nbi%,nbe%
  6644.   LOCAL txt$,adp$,ads$,adi$,ade$,map$
  6645.   ~FRE(0)
  6646.   GOSUB rec_result("It's a Graoumf Tracker module (GT2).",TRUE)
  6647.   version%=BYTE{ADD(admod%,3)}
  6648.   GOSUB rec_result("  Format version number: "+STR$(version%)+".",TRUE)
  6649.   IF version%>gt2_file_vnum%
  6650.     GOSUB rec_result("  File will be probably not completely converted.",TRUE)
  6651.   ENDIF
  6652.   '
  6653.   ' Recherche des adresses de tous les chunks
  6654.   '
  6655.   finmod%=ADD(admod%,lonmod%)
  6656.   a%=ADD(admod%,LONG{ADD(admod%,4)})    ! Pointe sur le 2eme chunk du module
  6657.   adp$=STRING$(1024,0)                  ! Adresses des chunks des patterns
  6658.   ads$=STRING$(1024,0)                  ! Adresses des chunks des samples
  6659.   adi$=STRING$(1024,0)                  ! Adresses des chunks des instruments
  6660.   ade$=STRING$(768,0)                   ! Adresses des chunks des enveloppes
  6661.   songchk%=0
  6662.   patschk%=0
  6663.   orchchk%=0
  6664.   tcn1chk%=0
  6665.   xcomchk%=0
  6666.   tvolchk%=0
  6667.   nbp%=0
  6668.   nbs%=0
  6669.   nbi%=0
  6670.   nbe%=0
  6671.   ' Chunk detection.
  6672.   ' Note: Workaround 0.8775 put around here.
  6673.   ' I think the corruption (incorrect byteswapping) can only happen
  6674.   ' after a (16-bit?) SAMP chunk. So, SAMP, VENV, TENV, PENV, XCOM,
  6675.   ' and ENDC need to be treated. Should you encounter any more
  6676.   ' "Unknown chunk 'bacd'" messages where abcd is a valid chunk,
  6677.   ' you know what to do.
  6678.   WHILE a%<finmod%
  6679.   redetect_chunk:
  6680.     SELECT LONG{a%}
  6681.     CASE "TVOL"
  6682.       tvolchk%=a%
  6683.     CASE "SONG"
  6684.       songchk%=a%
  6685.     CASE "TCN1"
  6686.       tcn1chk%=a%
  6687.     CASE "PATS"
  6688.       patschk%=a%
  6689.     CASE "PATD"
  6690.       LONG{ADD(V:adp$,SHL(CARD{ADD(a%,8)},2))}=a%
  6691.       INC nbp%
  6692.     CASE "ORCH"
  6693.       orchchk%=a%
  6694.     CASE "INST"
  6695.       LONG{ADD(V:adi$,SHL(CARD{ADD(a%,8)},2))}=a%
  6696.       INC nbi%
  6697.     CASE "ASMP"
  6698.       LONG{a%}=CVL("SAMP")
  6699.       GOTO redetect_chunk
  6700.     CASE "SAMP"
  6701.       LONG{ADD(V:ads$,SHL(CARD{ADD(a%,8)},2))}=a%
  6702.       INC nbs%
  6703.     CASE "EVNV"
  6704.       LONG{a%}=CVL("VENV")
  6705.       GOTO redetect_chunk
  6706.     CASE "VENV"
  6707.       LONG{ADD(V:ade$,MUL(CARD{ADD(a%,8)},12))}=a%
  6708.       INC nbe%
  6709.     CASE "ETNV"
  6710.       LONG{a%}=CVL("TENV")
  6711.       GOTO redetect_chunk
  6712.     CASE "TENV"
  6713.       LONG{ADD(V:ade$,ADD(MUL(CARD{ADD(a%,8)},12),4))}=a%
  6714.       INC nbe%
  6715.     CASE "EPNV"
  6716.       LONG{a%}=CVL("PENV")
  6717.       GOTO redetect_chunk
  6718.     CASE "PENV"
  6719.       LONG{ADD(V:ade$,ADD(MUL(CARD{ADD(a%,8)},12),8))}=a%
  6720.       INC nbe%
  6721.     CASE "CXOM"
  6722.       LONG{a%}=CVL("XCOM")
  6723.       GOTO redetect_chunk
  6724.     CASE "XCOM"
  6725.       xcomchk%=a%
  6726.     CASE "NEDC"
  6727.       LONG{a%}=CVL("ENDC")
  6728.       GOTO redetect_chunk
  6729.     CASE "ENDC"
  6730.     DEFAULT
  6731.       GOSUB rec_result("  Unknown chunk: '"+MKL$(LONG{a%})+"'.",TRUE)
  6732.     ENDSELECT
  6733.     ADD a%,LONG{ADD(a%,4)}              ! Chunk suivant
  6734.   WEND
  6735.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  6736.   GOSUB rec_result("  "+STR$(nbi%)+" instruments,",TRUE)
  6737.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  6738.   GOSUB rec_result("  "+STR$(nbe%)+" envelopes.",TRUE)
  6739.   '
  6740.   ' Chargement des informations generales
  6741.   '
  6742.   GOSUB rec_result("  Converting module header... ",FALSE)
  6743.   GOSUB chg_songname2(ADD(admod%,8),32)
  6744.   GOSUB chg_songcomment2(ADD(admod%,40),160)
  6745.   mastervol%=CARD{ADD(admod%,232)}
  6746.   ticks%=CARD{ADD(admod%,228)}
  6747.   tempo%=CARD{ADD(admod%,230)}          ! Tempo
  6748.   BMOVE ADD(admod%,236),V:balance$,SHL(CARD{ADD(admod%,234)},1)
  6749.   '
  6750.   ' Recherche du nombre de lignes et de pistes
  6751.   '
  6752.   IF patschk%>0
  6753.     map$=""
  6754.     a%=CARD{ADD(patschk%,8)}            ! Nombre de pistes
  6755.     linestoadd%=0                       ! Nombre de lignes a ajouter au total
  6756.     FOR i%=0 TO 255
  6757.       c%=LONG{ADD(V:adp$,SHL(i%,2))}
  6758.       IF c%>0
  6759.         IF CARD{ADD(c%,26)}=0           ! Format de pattern 0 : donnees brutes
  6760.           ADD linestoadd%,SUB(CARD{ADD(c%,28)},1)
  6761.           map$=map$+MKI$(a%)+MKI$(CARD{ADD(c%,28)})
  6762.         ELSE
  6763.           map$=map$+MKI$(a%)+MKI$(1)
  6764.         ENDIF
  6765.       ELSE
  6766.         map$=map$+MKI$(a%)+MKI$(1)
  6767.       ENDIF
  6768.     NEXT i%
  6769.     GOSUB new_pattern_format(a%)
  6770.   ENDIF
  6771.   GOSUB rec_result("done.",TRUE)
  6772.   '
  6773.   ' Extra comment
  6774.   '
  6775.   IF xcomchk%>0
  6776.     GOSUB rec_result("  Comment:",TRUE)
  6777.     a%=LONG{ADD(xcomchk%,8)}
  6778.     txt$=""
  6779.     FOR i%=ADD(xcomchk%,12) TO ADD(ADD(xcomchk%,a%),11)
  6780.       b%=BYTE{i%}
  6781.       IF b%=10                                  ! CR
  6782.         GOSUB rec_result("  "+txt$,TRUE)
  6783.         txt$=""
  6784.       ELSE IF b%>=32                            ! Elimine les car. non ASCII
  6785.         txt$=txt$+CHR$(b%)
  6786.       ENDIF
  6787.     NEXT i%
  6788.     IF LEN(txt$)>0
  6789.       GOSUB rec_result("  "+txt$,TRUE)
  6790.       txt$=""
  6791.     ENDIF
  6792.     GOSUB rec_result("  (End of comment)",TRUE)
  6793.   ENDIF
  6794.   '
  6795.   ' Volumes des pistes
  6796.   '
  6797.   IF tvolchk%>0
  6798.     GOSUB rec_result("  Converting track volume chunk... ",FALSE)
  6799.     a%=CARD{ADD(tvolchk%,8)}
  6800.     BMOVE ADD(tvolchk%,10),V:track_volume$,SHL(a%,1)
  6801.     GOSUB rec_result("done.",TRUE)
  6802.   ENDIF
  6803.   '
  6804.   ' Les configurations
  6805.   '
  6806.   IF tcn1chk%>0 AND flag_gt2cnf!
  6807.     GOSUB rec_result("  Converting config. chunk... ",FALSE)
  6808.     songpos%=CARD{ADD(tcn1chk%,10)}
  6809.     posligne%=CARD{ADD(tcn1chk%,12)}
  6810.     n_preset%=CARD{ADD(tcn1chk%,14)}
  6811.     GOSUB chg_type_affpiste(CARD{ADD(tcn1chk%,16)})
  6812.     curs_col%=CARD{ADD(tcn1chk%,18)}
  6813.     curs_x%=CARD{ADD(tcn1chk%,20)}
  6814.     flags%=CARD{ADD(tcn1chk%,22)}
  6815.     play%=flags% AND 3
  6816.     IF (SHR(flags%,2) AND 1)=1
  6817.       GOSUB edit_mode_on
  6818.     ELSE
  6819.       GOSUB edit_mode_off
  6820.     ENDIF
  6821.     octave%=CARD{ADD(tcn1chk%,24)}
  6822.     line_step%=CARD{ADD(tcn1chk%,26)}
  6823.     instr%=CARD{ADD(tcn1chk%,28)}
  6824.     sample%=CARD{ADD(tcn1chk%,30)}
  6825.     FOR i%=0 TO 31                              ! Les presets
  6826.       nbr_colonnes%(i%)=CARD{ADD(tcn1chk%,ADD(32,SHL(i%,1)))}
  6827.     NEXT i%
  6828.     ' *** Penser aux noms
  6829.     BMOVE ADD(tcn1chk%,608),V:preset&(0,0),2048
  6830.     a%=LONG{ADD(tcn1chk%,2656)}                 ! Les pistes on/off
  6831.     FOR i%=0 TO 31
  6832.       DPOKE ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,i%)),BTST(a%,i%) AND 1
  6833.     NEXT i%
  6834.     GOSUB rec_result("done.",TRUE)
  6835.   ENDIF
  6836.   '
  6837.   ' Chargement de la song
  6838.   '
  6839.   IF songchk%>0
  6840.     GOSUB rec_result("  Converting song chunk... ",FALSE)
  6841.     module&(101)=CARD{ADD(songchk%,8)}
  6842.     module&(102)=CARD{ADD(songchk%,10)}
  6843.     FOR i%=0 TO PRED(FN song_length)
  6844.       song&(i%)=CARD{ADD(ADD(songchk%,12),SHL(i%,1))}
  6845.     NEXT i%
  6846.     GOSUB rec_result("done.",TRUE)
  6847.   ENDIF
  6848.   '
  6849.   ' Chargement des patterns
  6850.   '
  6851.   IF patschk%>0
  6852.     GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  6853.     GOSUB create_space_multipatchunk(map$,256,TRUE)
  6854.     FOR i%=0 TO 255
  6855.       a%=LONG{ADD(V:adp$,SHL(i%,2))}
  6856.       IF a%>0
  6857.         GOSUB chg_patternname2(ADD(a%,10),16,i%)
  6858.         IF CARD{ADD(a%,26)}=0           ! Format de pattern 0 : donnees brutes
  6859.           b%=CARD{ADD(a%,28)}           ! Nombre de lignes de ce pattern
  6860.           ' Ignore le nombre de voies
  6861.           ~C:g_bmove%(L:ADD(a%,32),L:FN adr_pat(i%),L:MUL(MUL(nbr_track%,b%),5))
  6862.         ENDIF
  6863.       ENDIF
  6864.     NEXT i%
  6865.     GOSUB rec_result("done.",TRUE)
  6866.   ENDIF
  6867.   '
  6868.   ' Chargement des instruments
  6869.   '
  6870.   GOSUB rec_result("  Converting instrument chunks... ",FALSE)
  6871.   FOR i%=1 TO 255
  6872.     a%=LONG{ADD(V:adi$,SHL(i%,2))}
  6873.     IF a%>0
  6874.       BMOVE a%,V:instrset%(0,i%),LONG{ADD(a%,4)}
  6875.     ENDIF
  6876.   NEXT i%
  6877.   GOSUB rec_result("done.",TRUE)
  6878.   '
  6879.   ' Chargement des enveloppes
  6880.   '
  6881.   GOSUB rec_result("  Converting envelope chunks... ",FALSE)
  6882.   FOR i%=1 TO 63
  6883.     FOR j%=0 TO 2
  6884.       a%=LONG{ADD(V:ade$,SHL(ADD(MUL(i%,3),j%),2))}
  6885.       IF a%>0
  6886.         b%=LONG{ADD(a%,4)}              ! Taille du chunk
  6887.         c%=CARD{ADD(a%,30)}             ! Taille de la section Attack
  6888.         GOSUB chg_env_length(i%,j%,0,c%)
  6889.         GOSUB chg_env_length(i%,j%,1,SUB(SUB(b%,32),c%))
  6890.         BMOVE a%,FN env_chunkadr(i%,j%),b%
  6891.       ENDIF
  6892.     NEXT j%
  6893.   NEXT i%
  6894.   GOSUB rec_result("done.",TRUE)
  6895.   '
  6896.   ' Chargement des samples
  6897.   '
  6898.   GOSUB rec_result("  Converting sample chunks... ",FALSE)
  6899.   FOR i%=1 TO 255
  6900.     a%=LONG{ADD(V:ads$,SHL(i%,2))}
  6901.     IF a%>0
  6902.       b%=LONG{ADD(a%,4)}                ! Longueur du nouveau chunk
  6903.       c%=FN adrsamchk(i%)               ! Adresse de l'ancien chunk
  6904.       d%=FN lonsamchk(i%)               ! Longueur de l'ancien chunk
  6905.       e%=ADD(c%,b%)
  6906.       j%=SUCC(i%)
  6907.       WHILE j%<256
  6908.         f%=LONG{ADD(V:ads$,SHL(j%,2))}
  6909.         EXIT IF f%<e% AND f%>0
  6910.         INC j%                          ! Cherche si des samples genent
  6911.       WEND
  6912.       IF j%<256 OR flag_keep_buffer!    ! On est oblige de faire une rotation
  6913.         ~C:g_bmove%(L:a%,L:c%,L:d%)     ! Copie ce qui tient
  6914.         GOSUB mem_rotation(ADD(c%,d%),SUB(ADD(a%,b%),ADD(c%,d%)),SUB(b%,d%))    ! et deplace le reste
  6915.         ADD translate%,SUB(b%,d%)
  6916.         IF i%<255
  6917.           FOR j%=SUCC(i%) TO 255        ! Remise a jour des chunks de sample
  6918.             GOSUB chg_sam_chunkadr(j%,ADD(FN adrsamchk(j%),SUB(b%,d%)))
  6919.             e%=LONG{ADD(V:ads$,SHL(j%,2))}
  6920.             IF e%>0 AND e%<a%
  6921.               LONG{ADD(V:ads$,SHL(j%,2))}=ADD(e%,SUB(b%,d%))
  6922.             ENDIF
  6923.           NEXT j%
  6924.         ENDIF
  6925.       ELSE
  6926.         IF i%<255
  6927.           ~C:g_bmove%(L:ADD(c%,d%),L:ADD(c%,b%),L:SUB(FN adr_buffer,ADD(c%,d%)))
  6928.         ENDIF
  6929.         ~C:g_bmove%(L:a%,L:c%,L:b%)
  6930.         IF i%<255
  6931.           FOR j%=SUCC(i%) TO 255        ! Remise a jour des chunks de sample
  6932.             GOSUB chg_sam_chunkadr(j%,ADD(FN adrsamchk(j%),SUB(b%,d%)))
  6933.           NEXT j%
  6934.         ENDIF
  6935.       ENDIF
  6936.     ENDIF
  6937.   NEXT i%
  6938.   GOSUB rec_result("done.",TRUE)
  6939. RETURN
  6940. PROCEDURE load_module_mod               !!!
  6941.   ' Modules classiques type ProTracker Amiga
  6942.   ' header$ : 4096 octets du debut du module
  6943. ld_module_mod_fin:
  6944. RETURN
  6945. PROCEDURE load_module_mod_mem
  6946.   ' Modules classiques type ProTracker Amiga, deja en memoire
  6947.   ' header$ : 4096 octets du debut du module
  6948.   LOCAL pt%,a%,b%,i%,nbl%,nbt%,nbs%,nbp%,bspd%
  6949.   LOCAL a&
  6950.   LOCAL flag_digital!,flag_intel!
  6951.   LOCAL chk$,chknbv$,chunk$,adi$
  6952.   ~FRE(0)
  6953.   '
  6954.   ' Trouve le bon format
  6955.   '
  6956.   flag_digital!=FALSE
  6957.   flag_intel!=FALSE
  6958.   chunk$="M.K.M&K&FLT4FLT6FLT8M!K!RASPM~K~"
  6959.   chknbv$=MKL$(&H4040406)+MKL$(&H8040404)
  6960.   chk$=MID$(header$,&H439,4)
  6961.   a%=INSTR(chunk$,chk$)
  6962.   nbl%=64
  6963.   bspd%=8363
  6964.   IF (a% AND 3)=1               ! Format courant
  6965.     nbt%=ASC(MID$(chknbv$,SUCC(SHR(PRED(a%),2)),1))
  6966.     GOSUB rec_result("It is a standard ProTracker module (MOD).",TRUE)
  6967.   ELSE IF RIGHT$(chk$,3)="CHN"  ! FastTracker
  6968.     nbt%=VAL(LEFT$(chk$,1))
  6969.     GOSUB rec_result("It is a ProTracker module (MOD), FastTracker mutation.",TRUE)
  6970.   ELSE IF RIGHT$(chk$,2)="CH"   ! FastTracker
  6971.     nbt%=VAL(LEFT$(chk$,2))
  6972.     GOSUB rec_result("It is a ProTracker module (MOD), FastTracker mutation.",TRUE)
  6973.   ELSE IF LEFT$(chk$,2)="CD"   ! Octalyser CDxy
  6974.     GOSUB rec_result("It is a ProTracker module (MOD), Octalyser mutation.",TRUE)
  6975.     bspd%=8363                  ! y=basespeed - 1,2,3 -> 16KHz, 20KHz, 25KHz
  6976.     IF RIGHT$(chk$,1)="2"
  6977.       bspd%=10038               ! Note: Neither of these are exact values, but it's...
  6978.     ELSE IF RIGHT$(chk$,1)="3"
  6979.       bspd%=12570               ! ...bloody hard to work them out from Blade's precalcs. /sjx.
  6980.     ENDIF
  6981.     nbt%=VAL(MID$(chk$,3,1))
  6982.   ELSE IF LEFT$(chk$,2)="FA"    ! Format Digital Tracker
  6983.     nbt%=VAL(RIGHT$(chk$,2))
  6984.     GOSUB rec_result("It is a ProTracker module (MOD), Digital Tracker mutation.",TRUE)
  6985.     flag_digital!=TRUE
  6986.     nbl%=CARD{ADD(admod%,&H43C)}
  6987.   ENDIF
  6988.   GOSUB new_pattern_format(nbt%)
  6989.   pt%=admod%
  6990.   GOSUB chg_songname2(pt%,20)                   ! Le nom du module
  6991.   ADD pt%,20
  6992.   '
  6993.   ' Lit les entetes des instruments
  6994.   '
  6995.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  6996.   nbs%=0
  6997.   FOR j%=1 TO 31
  6998.     GOSUB chg_samplename2(pt%,22,j%)
  6999.     GOSUB chg_instrname2(pt%,22,j%)
  7000.     GOSUB chg_sam_freq(j%,bspd%)
  7001.     a&=INT{ADD(pt%,22)}                 ! Longueur
  7002.     IF falg_intel!
  7003.       GOSUB intel_w(V:a&)
  7004.     ENDIF
  7005.     GOSUB chg_sam_length(j%,SHL(a& AND 65535,1))
  7006.     IF a&>0
  7007.       INC nbs%
  7008.     ENDIF
  7009.     a&=BYTE{ADD(pt%,24)}                ! Finetune
  7010.     IF a&<8
  7011.       GOSUB chg_sam_finetune(j%,a&)
  7012.     ELSE
  7013.       GOSUB chg_sam_finetune(j%,SUB(a&,16))
  7014.     ENDIF
  7015.     a&=BYTE{ADD(pt%,25)}                ! Volume
  7016.     GOSUB chg_ins_volume(j%,SHL(a&,2))
  7017.     GOSUB chg_sam_volume(j%,&H100)
  7018.     a&=INT{ADD(pt%,26)}                 ! Repeat
  7019.     IF falg_intel!
  7020.       GOSUB intel_w(V:a&)
  7021.     ENDIF
  7022.     GOSUB chg_sam_repeat(j%,SHL(a& AND 65535,1))
  7023.     a&=INT{ADD(pt%,28)}                 ! Replen
  7024.     IF falg_intel!
  7025.       GOSUB intel_w(V:a&)
  7026.     ENDIF
  7027.     GOSUB chg_sam_replen(j%,SHL(a& AND 65535,1))
  7028.     ADD pt%,30
  7029.   NEXT j%
  7030.   GOSUB rec_result("done.",TRUE)
  7031.   '
  7032.   ' La song
  7033.   '
  7034.   GOSUB rec_result("  Converting song... ",FALSE)
  7035.   module&(101)=BYTE{pt%}        ! Longueur
  7036.   a&=BYTE{SUCC(pt%)}            ! Boucle
  7037.   ADD pt%,2
  7038.   IF a&>PRED(module&(101))
  7039.     a&=0
  7040.   ENDIF
  7041.   module&(102)=a&
  7042.   nbp%=0
  7043.   FOR i%=0 TO 127               ! La song
  7044.     song&(i%)=BYTE{ADD(pt%,i%)}
  7045.     nbp%=MAX(nbp%,song&(i%))
  7046.   NEXT i%
  7047.   INC nbp%
  7048.   GOSUB rec_result("done.",TRUE)
  7049.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7050.   GOSUB rec_result("  "+STR$(nbs%)+" samples at "+STR$(bspd%*2)+"Hz basespeed.",TRUE)
  7051.   '
  7052.   ' Chargement des patterns
  7053.   '
  7054.   GOSUB rec_result("  Converting patterns... ",FALSE)
  7055.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbt%)+MKI$(nbl%)),nbp%,FALSE)
  7056.   IF flag_digital!
  7057.     pt%=ADD(admod%,&H440)       ! Les patterns (pour DT)
  7058.   ELSE
  7059.     pt%=ADD(admod%,&H43C)       ! Les patterns (modules courants)
  7060.   ENDIF
  7061.   b%=MUL(SUCC(a%),SHL(MUL(nbl%,nbr_track%),2))
  7062.   '
  7063.   ' Conversion des patterns
  7064.   '
  7065.   c%=MUL(nbl%,nbr_track%)
  7066.   FOR i%=0 TO PRED(nbp%)
  7067.     a%=FN adr_pat(i%)
  7068.     ~C:g_bmove%(L:pt%,L:a%,L:SHL(c%,2))
  7069.     ADD pt%,SHL(c%,2)
  7070.     ~C:g_convert_nt_2_gtk%(L:a%,L:c%)
  7071.   NEXT i%
  7072.   GOSUB rec_result("done.",TRUE)
  7073.   '
  7074.   ' Les samples
  7075.   '
  7076.   GOSUB rec_result("  Converting samples... ",FALSE)
  7077.   adi$=""
  7078.   FOR i%=1 TO 31
  7079.     adi$=adi$+MKL$(pt%)
  7080.     ADD pt%,FN length(i%)
  7081.   NEXT i%
  7082.   FOR i%=1 TO 31
  7083.     GOSUB decale_sample(i%,31,V:adi$)
  7084.   NEXT i%
  7085.   GOSUB rec_result("done.",TRUE)
  7086. ld_module_mod_mem_fin:
  7087. RETURN
  7088. PROCEDURE load_module_octamed           !!!
  7089.   ' Chargement d'un module au format OctaMED Pro Amiga
  7090.   ' header$ : 4096 octets du debut du module
  7091. RETURN
  7092. PROCEDURE load_module_octamed_mem       !!!
  7093.   ' Chargement d'un module au format OctaMED Pro Amiga deja en memoire
  7094.   LOCAL a%,asc%,b%,c%,d%,e%,flags%,flags2%,i%,instrhdr%,j%,k%,l%
  7095.   LOCAL mmd0song%,mmd0block%,mmd0exp%,nbi%,nbs%,no%,rl%,rs%,sc%,t%,type%,wf%
  7096.   LOCAL numblock%
  7097.   LOCAL a$,adi$,b$,octstart$,samiff$,transpose$,map$
  7098.   ~FRE(0)
  7099.   GOSUB rec_result("It's an OctaMED Pro module (MMD).",TRUE)
  7100.   '
  7101.   ' Recherche des adresses de principaux chunks
  7102.   ' et des principales informations
  7103.   '
  7104.   GOSUB rec_result("  Converting module header... ",FALSE)
  7105.   mmd0song%=ADD(admod%,LONG{ADD(admod%,8)})     ! Pointe sur le header de la song
  7106.   mmd0block%=ADD(admod%,LONG{ADD(admod%,16)})   ! Pointe sur les offsets des patterns
  7107.   instrhdr%=ADD(admod%,LONG{ADD(admod%,24)})
  7108.   mmd0exp%=ADD(admod%,LONG{ADD(admod%,32)})     ! Pointe sur les donnees d'expansion
  7109.   ' Recherche nombre voies/piste
  7110.   numblock%=CARD{ADD(mmd0song%,504)}            ! Nombre de patterns
  7111.   t%=1
  7112.   map$=""
  7113.   FOR i%=0 TO PRED(numblock%)
  7114.     a%=LONG{ADD(mmd0block%,SHL(i%,2))}          ! Offset du header du pattern i
  7115.     IF a%>0
  7116.       t%=MAX(t%,CARD{ADD(admod%,a%)})
  7117.       l%=SUCC(CARD{ADD(ADD(admod%,a%),2)})
  7118.       map$=map$+MKI$(1)+MKI$(l%)
  7119.     ELSE
  7120.       map$=map$+MKI$(1)+MKI$(1)
  7121.     ENDIF
  7122.   NEXT i%
  7123.   FOR i%=0 TO SHL(PRED(numblock%),2) STEP 4
  7124.     CARD{ADD(V:map$,i%)}=t%
  7125.   NEXT i%
  7126.   GOSUB new_pattern_format(t%)
  7127.   GOSUB create_space_multipatchunk(map$,numblock%,TRUE)
  7128.   flags%=BYTE{ADD(mmd0song%,767)}
  7129.   flags2%=BYTE{ADD(mmd0song%,768)}
  7130.   nbi%=BYTE{ADD(mmd0song%,787)}                 ! Nbr d'instruments
  7131.   ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  7132.   ' PRINT AT(1,5);CARD{ADD(mmd0song%,764)},SUCC(flag2% AND 31),BYTE{ADD(mmd0song%,769)}
  7133.   ' IF BTST(flags2%,5)
  7134.   '   PRINT "Ok"
  7135.   ' ENDIF
  7136.   ' ~INP(2)
  7137.   ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  7138.   ' Le Tempo
  7139.   ' IF BTST(flags2%,5)
  7140.   '   tempo%=CARD{ADD(mmd0song%,764)}             ! BPM
  7141.   ' ENDIF
  7142.   ' b%=SUCC(flags2% AND 31)
  7143.   GOSUB rec_result("done.",TRUE)
  7144.   GOSUB rec_result("  "+STR$(numblock%)+" patterns,",TRUE)
  7145.   GOSUB rec_result("  "+STR$(nbi%)+" instruments,",TRUE)
  7146.   '
  7147.   ' La song
  7148.   '
  7149.   GOSUB rec_result("  Converting song chunk... ",FALSE)
  7150.   module&(101)=CARD{ADD(mmd0song%,506)}
  7151.   module&(102)=0
  7152.   FOR i%=0 TO PRED(FN song_length)
  7153.     song&(i%)=BYTE{ADD(ADD(mmd0song%,508),i%)}
  7154.   NEXT i%
  7155.   GOSUB rec_result("done.",TRUE)
  7156.   '
  7157.   ' Les patterns
  7158.   '
  7159.   GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  7160.   transpose$=STRING$(64,35)
  7161.   FOR i%=0 TO PRED(numblock%)
  7162.     a%=LONG{ADD(mmd0block%,SHL(i%,2))}
  7163.     IF a%>0
  7164.       t%=CARD{ADD(admod%,a%)}
  7165.       l%=SUCC(CARD{ADD(admod%,ADD(a%,2))})
  7166.       IF t%>0 AND l%>0
  7167.         e%=ADD(admod%,ADD(a%,8))
  7168.         d%=SUB(nbr_track%,t%)
  7169.         b%=FN adr_pat(i%)
  7170.         c%=V:transpose$
  7171.         ~C:g_convert_mmd1_2_gtk%(L:e%,L:b%,L:c%,W:t%,W:l%,W:d%)
  7172.       ENDIF
  7173.     ENDIF
  7174.   NEXT i%
  7175.   GOSUB rec_result("done.",TRUE)
  7176.   '
  7177.   ' Les headers d'instruments
  7178.   '
  7179.   GOSUB rec_result("  Converting instrument chunks and sample headers... ",FALSE)
  7180.   nbs%=0                                        ! Nombre actuel de samples decodes
  7181.   adi$=""
  7182.   samiff$="000000 432110 221100 110000 332210 543210 654321"
  7183.   octstart$="001224364860 121212122424 001212242436 001212243636 001212242424 121212121212 121212121212"
  7184.   FOR i%=1 TO nbi%
  7185.     a%=LONG{ADD(instrhdr%,SHL(PRED(i%),2))}
  7186.     IF a%>0
  7187.       ADD a%,admod%                             ! Pointe sur le header de l'instrument
  7188.       b%=ADD(mmd0song%,MUL(PRED(i%),8))         ! Pointe sur d'autres infos sur le sample
  7189.       t%=FN sbyte(BYTE{ADD(b%,7)})              ! Transposition generale de l'instrument
  7190.       GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(b%,6)},2))
  7191.       type%=INT{ADD(a%,4)}                      ! Type de l'instrument
  7192.       SELECT type%
  7193.       CASE 0 TO 6
  7194.         ' --- Sample de 1 a 7 octaves ---
  7195.         ' -------------------------------
  7196.       ld_mmd_samples:
  7197.         no%=VAL(MID$("1532467",SUCC(type%),1))  ! Nombre d'octaves dans l'instrument
  7198.         sc%=SUCC(nbs%)                          ! Sample en cours de traitement
  7199.         asc%=ADD(a%,6)                          ! Adr spl "   "    "    "
  7200.         FOR j%=0 TO PRED(no%)
  7201.           GOSUB chg_sam_nbits(sc%,1)
  7202.           GOSUB chg_sam_volume(sc%,&H100)
  7203.           GOSUB chg_sam_freq(sc%,8363)
  7204.           GOSUB chg_sam_finetune(sc%,0)         ! 0 par defaut, mais on voit plus tard si y en a
  7205.           rs%=SHL(CARD{b%},SUCC(j%))            ! Repeat
  7206.           rl%=SHL(CARD{ADD(b%,2)},SUCC(j%))     ! Replen
  7207.           IF type%=0                            ! Un sample/instr : on prend la longueur totale
  7208.             GOSUB chg_sam_length(sc%,LONG{a%} AND -2)
  7209.           ELSE                                  ! Sinon c'est repeat+replen
  7210.             GOSUB chg_sam_length(sc%,ADD(rs%,rl%))
  7211.           ENDIF
  7212.           GOSUB chg_sam_repeat(sc%,rs%)
  7213.           GOSUB chg_sam_replen(sc%,MAX(rl%,2))
  7214.           adi$=adi$+MKL$(asc%)
  7215.           ADD asc%,ADD(rs%,rl%)
  7216.           INC sc%
  7217.         NEXT j%
  7218.         ' Transpositions et affectation des samples aux instruments
  7219.         FOR j%=0 TO 5
  7220.           c%=ADD(VAL(MID$(samiff$,ADD(SUCC(MUL(type%,7)),j%),1)),SUCC(nbs%))
  7221.           d%=ADD(SUB(VAL(MID$(octstart$,ADD(SUCC(MUL(type%,13)),SHL(j%,1)),2)),MUL(j%,12)),t%)
  7222.           FOR k%=ADD(MUL(j%,12),36) TO ADD(MUL(j%,12),47)
  7223.             GOSUB chg_ins_sample(i%,k%,c%)      ! Sample
  7224.             GOSUB chg_ins_transp(i%,k%,d%)      ! Transposition
  7225.           NEXT k%
  7226.         NEXT j%
  7227.         FOR j%=1 TO 35
  7228.           GOSUB chg_ins_sample(i%,j%,FN isample(i%,36))
  7229.           GOSUB chg_ins_transp(i%,j%,FN itransp(i%,36))
  7230.         NEXT j%
  7231.         FOR j%=108 TO 127
  7232.           GOSUB chg_ins_sample(i%,j%,FN isample(i%,107))
  7233.           GOSUB chg_ins_transp(i%,j%,FN itransp(i%,107))
  7234.         NEXT j%
  7235.         GOSUB chg_ins_sample(i%,0,0)
  7236.         GOSUB chg_ins_transp(i%,0,0)
  7237.         ADD nbs%,no%
  7238.       CASE -1
  7239.         ' ---------- Synthetic ----------
  7240.         ' -------------------------------
  7241.         ' Ne prend pour l'instant en compte que la 1ere forme d'onde
  7242.         sc%=SUCC(nbs%)
  7243.         GOSUB chg_sam_nbits(sc%,1)
  7244.         GOSUB chg_sam_volume(sc%,&H100)
  7245.         GOSUB chg_sam_freq(sc%,8363)
  7246.         GOSUB chg_sam_finetune(sc%,0)
  7247.         wf%=ADD(a%,LONG{ADD(a%,278)})
  7248.         GOSUB chg_sam_length(sc%,SHL(CARD{wf%},1))
  7249.         GOSUB chg_sam_repeat(sc%,0)
  7250.         GOSUB chg_sam_replen(sc%,SHL(CARD{wf%},1))
  7251.         adi$=adi$+MKL$(ADD(wf%,2))
  7252.         FOR j%=1 TO 127
  7253.           GOSUB chg_ins_sample(i%,j%,sc%)
  7254.           GOSUB chg_ins_transp(i%,j%,SUB(t%,24))
  7255.         NEXT j%
  7256.         GOSUB chg_ins_sample(i%,0,0)
  7257.         GOSUB chg_ins_transp(i%,0,0)
  7258.         INC nbs%
  7259.         '
  7260.         '
  7261.         '
  7262.         '
  7263.       CASE -2
  7264.         ' ----------- Hybrid ------------
  7265.         ' -------------------------------
  7266.         '
  7267.         '
  7268.         '
  7269.         '
  7270.         b%=ADD(a%,8)                            ! Seulement valable pour Rep/Replen!!!
  7271.         a%=ADD(a%,LONG{ADD(a%,278)})            ! Pointe sur un instrument classique
  7272.         type%=INT{ADD(a%,4)}                    ! Nouveau type de l'instrument
  7273.         GOTO ld_mmd_samples
  7274.       ENDSELECT
  7275.     ENDIF
  7276.   NEXT i%
  7277.   GOSUB rec_result("done.",TRUE)
  7278.   GOSUB rec_result("  "+STR$(nbs%)+" samples.",TRUE)
  7279.   '
  7280.   ' Donnees d'expansion
  7281.   '
  7282.   GOSUB rec_result("  Converting expanded data... ",FALSE)
  7283.   IF mmd0exp%>admod%
  7284.     ' --- Finetunes ---
  7285.     a%=LONG{ADD(mmd0exp%,4)}
  7286.     b%=CARD{ADD(mmd0exp%,8)}
  7287.     c%=CARD{ADD(mmd0exp%,10)}
  7288.     IF a%>0 AND b%>0 AND c%=>4
  7289.       FOR i%=1 TO MIN(nbi%,b%)
  7290.         a$=FN ins_used_samples$(i%)
  7291.         IF LEN(a$)>0
  7292.           d%=FN sbyte(BYTE{ADD(admod%,ADD(a%,3))})
  7293.           FOR j%=0 TO SUB(LEN(a$),2) STEP 2
  7294.             GOSUB chg_sam_finetune(CARD{ADD(V:a$,j%)},d%)
  7295.           NEXT j%
  7296.         ENDIF
  7297.         ADD a%,c%                       ! Structure suivante
  7298.       NEXT i%
  7299.     ENDIF
  7300.     ' --- Noms des instruments ---
  7301.     a%=LONG{ADD(mmd0exp%,20)}           ! a% sur les noms
  7302.     b%=CARD{ADD(mmd0exp%,24)}           ! b% nbr de noms
  7303.     c%=CARD{ADD(mmd0exp%,26)}           ! c% taille d'un nom
  7304.     IF a%>0 AND b%>0 AND c%>0           ! S'il y a bien des noms
  7305.       FOR i%=1 TO MIN(nbi%,b%)
  7306.         GOSUB chg_instrname2(ADD(admod%,a%),c%,i%)
  7307.         a$=FN ins_used_samples$(i%)
  7308.         b$=SPACE$(28)
  7309.         BMOVE ADD(admod%,a%),V:b$,MIN(c%,28)
  7310.         IF LEN(a$)=2                    ! 1 seul sample
  7311.           GOSUB chg_samplename(b$,CARD{V:a$})
  7312.         ELSE IF LEN(a$)>2               ! Pluseurs samples d'octaves differents
  7313.           FOR j%=0 TO SUB(LEN(a$),2) STEP 2
  7314.             b$=LEFT$(b$,25)+"("+STR$(SUCC(SHR(j%,1)))+")"
  7315.             GOSUB chg_samplename(b$,CARD{ADD(V:a$,j%)})
  7316.           NEXT j%
  7317.         ENDIF
  7318.         ADD a%,c%                       ! Structure suivante
  7319.       NEXT i%
  7320.     ENDIF
  7321.     ' --- Nom de la chanson ---
  7322.     a%=LONG{ADD(mmd0exp%,44)}
  7323.     b%=LONG{ADD(mmd0exp%,48)}
  7324.     IF a%>0 AND b%>0
  7325.       GOSUB chg_songname2(ADD(a%,admod%),b%)
  7326.     ELSE
  7327.       GOSUB chg_songname("")
  7328.     ENDIF
  7329.   ENDIF
  7330.   GOSUB rec_result("done.",TRUE)
  7331.   '
  7332.   ' Les donnees des samples
  7333.   '
  7334.   GOSUB rec_result("  Converting sample data... ",FALSE)
  7335.   IF nbs%>0
  7336.     FOR i%=1 TO nbs%
  7337.       GOSUB decale_sample(i%,nbs%,V:adi$)
  7338.     NEXT i%
  7339.   ENDIF
  7340.   GOSUB rec_result("done.",TRUE)
  7341. RETURN
  7342. PROCEDURE load_module_669               !!!
  7343.   ' Chargement d'un module au format 669
  7344.   ' header$ : 4096 octets du debut du module
  7345. RETURN
  7346. PROCEDURE load_module_669_mem
  7347.   ' Chargement d'un module au format 669 deja en memoire
  7348.   ' header$ : 4096 octets du debut du module
  7349.   LOCAL pt%,a%,b%,c%,i%,j%,nbs%,nbp%,res%,sec%,tem%,brk%,os$
  7350.   GOSUB rec_result("It's a 6669 Composer module (669).",TRUE)
  7351.   ~FRE(0)
  7352.   GOSUB rec_result("  Converting module header... ",FALSE)
  7353.   GOSUB new_pattern_format(9)           ! 8 + 1 voies
  7354.   GOSUB chg_songname2(ADD(admod%,2),108)
  7355.   nbs%=BYTE{ADD(admod%,110)}            ! nbs% = nombre de samples
  7356.   nbp%=BYTE{ADD(admod%,111)}            ! nbp% = nombre de patterns
  7357.   res%=BYTE{ADD(admod%,112)}            ! res% = position de rebouclage
  7358.   sec%=ADD(admod%,113)
  7359.   tem%=ADD(admod%,241)
  7360.   brk%=ADD(admod%,369)
  7361.   ticks%=4
  7362.   tempo%=80
  7363.   GOSUB rec_result("done.",TRUE)
  7364.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7365.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  7366.   '
  7367.   ' Les headers des instruments
  7368.   '
  7369.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  7370.   IF nbs%>0
  7371.     pt%=ADD(admod%,497)
  7372.     a%=0
  7373.     b%=ADD(497,ADD(MUL(nbs%,25),MUL(nbp%,&H600)))       ! b% = offset de sample
  7374.     os$=""
  7375.     FOR i%=1 TO nbs%
  7376.       os$=os$+MKL$(ADD(b%,admod%))
  7377.       GOSUB chg_samplename2(pt%,13,i%)
  7378.       GOSUB chg_instrname2(pt%,13,i%)
  7379.       ADD pt%,13
  7380.       a%=LONG{pt%}
  7381.       ADD pt%,4
  7382.       GOSUB intel_l(V:a%)
  7383.       ADD b%,a%
  7384.       a%=a% AND -2
  7385.       GOSUB chg_sam_length(i%,a%)
  7386.       a%=LONG{pt%}
  7387.       ADD pt%,4
  7388.       GOSUB intel_l(V:a%)
  7389.       a%=a% AND -2
  7390.       GOSUB chg_sam_repeat(i%,a%)
  7391.       a%=LONG{pt%}
  7392.       ADD pt%,4
  7393.       GOSUB intel_l(V:a%)
  7394.       IF a%<&HFFFF0
  7395.         a%=SUB(a%,FN replen(i%)) AND -2
  7396.       ELSE
  7397.         GOSUB chg_sam_repeat(i%,0)
  7398.         a%=2
  7399.       ENDIF
  7400.       GOSUB chg_sam_volume(i%,&H100)
  7401.       GOSUB chg_sam_replen(i%,a%)
  7402.       GOSUB chg_sam_freq(i%,&H12224)            ! 8740 Hz
  7403.     NEXT i%
  7404.   ENDIF
  7405.   GOSUB rec_result("done.",TRUE)
  7406.   '
  7407.   ' Les patterns
  7408.   '
  7409.   GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  7410.   IF nbp%>0
  7411.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(9)+MKI$(64)),nbp%,TRUE)
  7412.     pt%=ADD(admod%,ADD(497,MUL(nbs%,25)))
  7413.     FOR i%=0 TO PRED(nbp%)
  7414.       b%=FN adr_pat(i%)
  7415.       ~C:g_convert_669_2_gtk%(L:pt%,L:b%)
  7416.       LONG{b%}=ADD(&HA800,BYTE{ADD(tem%,i%)})           ! Vitesse du pattern
  7417.       LONG{ADD(b%,MUL(BYTE{ADD(brk%,i%)},45))}=&HD00    ! Fin du pattern
  7418.       ADD pt%,&H600
  7419.     NEXT i%
  7420.   ENDIF
  7421.   GOSUB rec_result("done.",TRUE)
  7422.   '
  7423.   ' La song
  7424.   '
  7425.   GOSUB rec_result("  Converting song chunk... ",FALSE)
  7426.   FOR i%=0 TO 127
  7427.     IF BYTE{ADD(sec%,i%)}=255
  7428.       a%=i%
  7429.       i%=127
  7430.     ELSE
  7431.       song&(i%)=BYTE{ADD(sec%,i%)}
  7432.     ENDIF
  7433.   NEXT i%
  7434.   a%=MAX(1,a%)
  7435.   module&(101)=a%
  7436.   module&(102)=MIN(res%,PRED(a%))
  7437.   GOSUB rec_result("done.",TRUE)
  7438.   '
  7439.   ' Les instruments
  7440.   '
  7441.   GOSUB rec_result("  Converting sample chunks... ",FALSE)
  7442.   IF nbs%>0
  7443.     FOR i%=1 TO nbs%
  7444.       b%=FN length(i%)
  7445.       IF b%>0
  7446.         GOSUB decale_sample(i%,nbs%,V:os$)
  7447.         a%=FN adresse(i%)
  7448.         ~C:g_signe_sample%(L:a%,L:b%,W:1)
  7449.       ENDIF
  7450.     NEXT i%
  7451.   ENDIF
  7452.   FOR i%=2 TO 16 STEP 2
  7453.     CARD{ADD(V:balance$,i%)}=MUL(SHR(SUB(i%,2),1) AND 1,&HFFF)
  7454.   NEXT i%
  7455.   GOSUB rec_result("done.",TRUE)
  7456.   '
  7457.   ~FRE(0)
  7458. RETURN
  7459. PROCEDURE load_module_mtm               !!!
  7460.   ' Chargement d'un module au format Multi Tracker
  7461.   ' header$ : 4096 octets du debut du module
  7462. RETURN
  7463. PROCEDURE load_module_mtm_mem
  7464.   ' Chargement d'un module au format Multi Tracker deja en memoire
  7465.   ' header$ : 4096 octets du debut du module
  7466.   LOCAL pt%,a%,b%,c%,d%,i%,j%,k%,lon%,nbp%,nbs%,nbt%,sle%,nbl%,p1%,p2%,p3%,p4%
  7467.   LOCAL os$
  7468.   ~FRE(0)
  7469.   GOSUB rec_result("It's a Multi Tracker module (MTM).",TRUE)
  7470.   GOSUB rec_result("  Converting module header... ",FALSE)
  7471.   GOSUB clear_song(TRUE)
  7472.   GOSUB chg_songname2(ADD(admod%,4),20)
  7473.   GOSUB intel_w(ADD(admod%,24))
  7474.   GOSUB intel_w(ADD(admod%,28))
  7475.   nbt%=CARD{ADD(admod%,24)}             ! Nombre de pistes sauvees
  7476.   nbp%=SUCC(BYTE{ADD(admod%,26)})       ! Nombre de patterns
  7477.   lon%=SUCC(BYTE{ADD(admod%,27)})       ! Nombre de positions
  7478.   sle%=CARD{ADD(admod%,28)}             ! Song Length Extra-comment
  7479.   nbs%=BYTE{ADD(admod%,30)}             ! Nombre de samples
  7480.   nbl%=BYTE{ADD(admod%,32)}             ! Nombre de lignes
  7481.   GOSUB new_pattern_format(BYTE{ADD(admod%,33)})
  7482.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(BYTE{ADD(admod%,33)})+MKI$(nbl%)),nbp%,TRUE)
  7483.   module&(101)=MAX(lon%,1)
  7484.   FOR i%=0 TO PRED(nbr_track%)          ! Regle la balance de chaque piste
  7485.     CARD{ADD(V:balance$,SHL(i%,1))}=VAL("&H"+MID$("000100200300400500600700800924A48B6CC90DB4ED8FFF",SUCC(MUL(BYTE{ADD(admod%,ADD(i%,34))},3)),3))
  7486.   NEXT i%
  7487.   p1%=ADD(66,MUL(nbs%,37))              ! Pointe sur la sequence
  7488.   p2%=ADD(ADD(p1%,128),MUL(nbt%,192))   ! Pointe sur la disposition des pistes
  7489.   p3%=ADD(p2%,MUL(nbp%,64))             ! Pointe sur l'extra-comment
  7490.   p4%=ADD(p3%,sle%)                     ! Pointe sur les samples
  7491.   GOSUB rec_result("done.",TRUE)
  7492.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7493.   GOSUB rec_result("  "+STR$(nbs%)+" samples.",TRUE)
  7494.   '
  7495.   ' Chargement des headers des samples
  7496.   '
  7497.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  7498.   IF nbs%>0
  7499.     pt%=ADD(admod%,66)
  7500.     os$=""
  7501.     a%=p4%                              ! Offset du premier sample
  7502.     FOR i%=1 TO nbs%
  7503.       GOSUB chg_samplename2(pt%,22,i%)
  7504.       GOSUB chg_instrname2(pt%,22,i%)
  7505.       GOSUB intel_l(ADD(pt%,22))
  7506.       GOSUB intel_l(ADD(pt%,26))
  7507.       GOSUB intel_l(ADD(pt%,30))
  7508.       b%=LONG{ADD(pt%,22)}
  7509.       os$=os$+MKL$(ADD(admod%,a%))
  7510.       ADD a%,b%
  7511.       b%=b% AND -2
  7512.       ADD d%,b%
  7513.       c%=MAX(MIN(LONG{ADD(pt%,26)} AND -2,SUB(b%,2)),0)
  7514.       GOSUB chg_sam_nbits(i%,SUCC(BYTE{ADD(pt%,36)} AND 1))
  7515.       GOSUB chg_sam_length(i%,b%)
  7516.       GOSUB chg_sam_repeat(i%,c%)
  7517.       GOSUB chg_sam_replen(i%,MAX(MIN(SUB(LONG{ADD(pt%,30)},c%),SUB(b%,c%)) AND -2,2))
  7518.       GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(pt%,35)},2))
  7519.       GOSUB chg_sam_volume(i%,&H100)
  7520.       b%=BYTE{ADD(pt%,36)}
  7521.       IF b%>7
  7522.         SUB b%,16
  7523.       ENDIF
  7524.       GOSUB chg_sam_finetune(i%,b%)
  7525.       ADD pt%,37
  7526.     NEXT i%
  7527.   ENDIF
  7528.   GOSUB rec_result("done.",TRUE)
  7529.   '
  7530.   ' Chargement de la song
  7531.   '
  7532.   GOSUB rec_result("  Converting song... ",FALSE)
  7533.   pt%=ADD(admod%,p1%)
  7534.   FOR i%=0 TO PRED(lon%)
  7535.     song&(i%)=BYTE{ADD(pt%,i%)}
  7536.   NEXT i%
  7537.   GOSUB rec_result("done.",TRUE)
  7538.   '
  7539.   ' Chargement des patterns
  7540.   '
  7541.   GOSUB rec_result("  Converting patterns... ",FALSE)
  7542.   d%=ADD(admod%,p2%)
  7543.   FOR i%=d% TO ADD(d%,SUB(MUL(nbp%,64),2)) STEP 2
  7544.     GOSUB intel_w(i%)
  7545.   NEXT i%
  7546.   pt%=ADD(admod%,ADD(p1%,128))
  7547.   FOR i%=1 TO nbt%
  7548.     b%=0
  7549.     FOR j%=0 TO MUL(PRED(nbp%),64) STEP 64
  7550.       a%=FN adr_pat(b%)
  7551.       FOR k%=j% TO ADD(j%,SHL(PRED(nbr_track%),1)) STEP 2
  7552.         IF i%=CARD{ADD(d%,k%)}
  7553.           ~C:g_convert_mtmv_2_gtk%(L:pt%,L:a%,W:nbr_track%,W:nbl%)
  7554.         ENDIF
  7555.         ADD a%,5
  7556.       NEXT k%
  7557.       INC b%
  7558.     NEXT j%
  7559.     ADD pt%,192
  7560.   NEXT i%
  7561.   GOSUB rec_result("done.",TRUE)
  7562.   '
  7563.   ' Charge les instruments
  7564.   '
  7565.   GOSUB rec_result("  Converting samples... ",FALSE)
  7566.   IF nbs%>0
  7567.     FOR i%=1 TO nbs%
  7568.       b%=FN length(i%)
  7569.       IF b%>0
  7570.         GOSUB decale_sample(i%,nbs%,V:os$)
  7571.         a%=FN adresse(i%)
  7572.         c%=FN resol(i%)
  7573.         IF c%=2
  7574.           ~C:g_intel_16_bits%(L:a%,L:b%)
  7575.         ENDIF
  7576.         ~C:g_signe_sample%(L:a%,L:b%,W:c%)
  7577.       ENDIF
  7578.     NEXT i%
  7579.   ENDIF
  7580.   GOSUB rec_result("done.",TRUE)
  7581.   ~FRE(0)
  7582. RETURN
  7583. PROCEDURE load_module_s3m               !!!
  7584.   ' Chargement d'un module au format Scream Tracker 3
  7585.   ' header$ : 4096 octets du debut du module
  7586. RETURN
  7587. PROCEDURE load_module_s3m_mem
  7588.   ' Chargement d'un module au format Scream Tracker 3 deja en memoire
  7589.   ' header$ : 4096 octets du debut du module
  7590.   LOCAL pt%,a%,b%,c%,d%,convtrk$,ffv%,flg%,i%,j%,lon%,nbp%,nbs%,xxx1%,xxx2%,xxx3%,os$
  7591.   ~FRE(0)
  7592.   GOSUB rec_result("It's a Scream Tracker 3 module (S3M).",TRUE)
  7593.   GOSUB rec_result("  Converting module header... ",FALSE)
  7594.   GOSUB chg_songname2(admod%,28)
  7595.   GOSUB intel_w(ADD(admod%,&H20))
  7596.   GOSUB intel_w(ADD(admod%,&H22))
  7597.   GOSUB intel_w(ADD(admod%,&H24))
  7598.   GOSUB intel_w(ADD(admod%,&H2A))
  7599.   lon%=CARD{ADD(admod%,&H20)}           ! Longueur de la song (pair)
  7600.   nbs%=CARD{ADD(admod%,&H22)}           ! Nombre de samples
  7601.   nbp%=CARD{ADD(admod%,&H24)}           ! Nombre de patterns sauves
  7602.   ffv%=CARD{ADD(admod%,&H2A)}           ! File Format Version
  7603.   ticks%=BYTE{ADD(admod%,&H31)}         ! Vitesse
  7604.   tempo%=BYTE{ADD(admod%,&H32)}         ! Tempo
  7605.   xxx1%=ADD(&H60,SUCC(lon%) AND -2)     ! Ca doit toujours etre pair mais on ne sait jamais...
  7606.   xxx2%=ADD(xxx1%,SHL(nbs%,1))
  7607.   xxx3%=ADD(xxx2%,SHL(nbp%,1))
  7608.   '
  7609.   ' Recherche du nombre de voies
  7610.   '
  7611.   nbt%=0                                ! Nombre de voies
  7612.   convtrk$=""
  7613.   FOR i%=0 TO 31
  7614.     b%=BYTE{ADD(admod%,ADD(i%,&H40))} AND 127
  7615.     IF b%<16
  7616.       convtrk$=convtrk$+CHR$(nbt%)
  7617.       CARD{ADD(V:balance$,SHL(nbt%,1))}=MUL(SHR(b%,3),&HFFF)
  7618.       INC nbt%
  7619.     ELSE
  7620.       convtrk$=convtrk$+CHR$(255)
  7621.     ENDIF
  7622.   NEXT i%
  7623.   IF nbt%>0
  7624.     GOSUB new_pattern_format(nbt%)
  7625.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbt%)+MKI$(64)),nbp%,TRUE)
  7626.     '
  7627.     ' Les pan positions
  7628.     '
  7629.     IF BYTE{ADD(admod%,&H35)}=252
  7630.       FOR i%=0 TO PRED(nbt%)
  7631.         a%=BYTE{ADD(ADD(admod%,xxx3%),i%)}
  7632.         IF BTST(a%,5)
  7633.           a%=a% AND 15
  7634.           CARD{ADD(V:balance$,SHL(i%,1))}=MIN(DIV(MUL(a%,&H1000),15),&HFFF)
  7635.         ENDIF
  7636.       NEXT i%
  7637.     ENDIF
  7638.     GOSUB rec_result("done.",TRUE)
  7639.     GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7640.     GOSUB rec_result("  "+STR$(nbs%)+" samples",TRUE)
  7641.     '
  7642.     ' Chargement du header des samples
  7643.     '
  7644.     os$=""
  7645.     IF nbs%>0
  7646.       GOSUB rec_result("  Converting sample headers... ",FALSE)
  7647.       FOR i%=1 TO nbs%
  7648.         a%=ADD(admod%,ADD(xxx1%,SHL(PRED(i%),1)))
  7649.         GOSUB intel_w(a%)
  7650.         pt%=ADD(admod%,SHL(CARD{a%},4))
  7651.         a%=0
  7652.         IF BYTE{pt%}=1                    ! Est-ce bien un sample ?
  7653.           IF BYTE{ADD(pt%,&H1E)}=0        ! Sample non compacte
  7654.             GOSUB chg_samplename2(ADD(pt%,&H30),28,i%)
  7655.             GOSUB chg_instrname2(ADD(pt%,&H30),28,i%)
  7656.             GOSUB intel_w(ADD(pt%,&HE))
  7657.             GOSUB intel_l(ADD(pt%,&H10))
  7658.             GOSUB intel_l(ADD(pt%,&H14))
  7659.             GOSUB intel_l(ADD(pt%,&H18))
  7660.             GOSUB intel_l(ADD(pt%,&H20))
  7661.             flg%=BYTE{ADD(pt%,&H1F)}      ! Flags divers
  7662.             a%=MIN(MAX(LONG{ADD(pt%,&H10)},0),&HFFFFFE) AND -2
  7663.             IF BTST(flg%,0)               ! Boucle
  7664.               b%=MIN(MAX(LONG{ADD(pt%,&H14)},0) AND -2,SUB(a%,2))
  7665.               c%=MIN(MAX(SUB(MAX(LONG{ADD(pt%,&H18)},0) AND -2,b%),2),SUB(a%,b%))
  7666.             ELSE                          ! Pas boucle
  7667.               b%=0
  7668.               c%=2
  7669.             ENDIF
  7670.             GOSUB chg_sam_freq(i%,LONG{ADD(pt%,&H20)} AND 65535)
  7671.             GOSUB chg_sam_nbits(i%,SUB(1,BTST(flg%,2)))
  7672.             GOSUB chg_sam_length(i%,a%)
  7673.             GOSUB chg_sam_repeat(i%,b%)
  7674.             GOSUB chg_sam_replen(i%,c%)
  7675.             GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(pt%,&H1C)},2))
  7676.             GOSUB chg_sam_volume(i%,&H100)
  7677.             os$=os$+MKL$(ADD(admod%,SHL(CARD{ADD(pt%,&HE)},4)))
  7678.           ELSE
  7679.             os$=os$+MKL$(0)
  7680.           ENDIF
  7681.         ELSE
  7682.           os$=os$+MKL$(0)
  7683.         ENDIF
  7684.       NEXT i%
  7685.       GOSUB rec_result("done.",TRUE)
  7686.     ENDIF
  7687.     IF lon%>0 AND nbt%>0
  7688.       '
  7689.       ' Chargement de la sequence
  7690.       '
  7691.       GOSUB rec_result("  Converting song... ",FALSE)
  7692.       a%=0
  7693.       b%=0
  7694.       REPEAT
  7695.         song&(a%)=BYTE{ADD(admod%,ADD(b%,&H60))}
  7696.         IF song&(a%)<254
  7697.           INC a%
  7698.         ENDIF
  7699.         INC b%
  7700.       UNTIL b%=lon%                     ! OR BYTE{ADD(admod%,ADD(b%,&H60))}=255
  7701.       song&(a%)=0
  7702.       module&(101)=a%
  7703.       GOSUB rec_result("done.",TRUE)
  7704.       '
  7705.       ' Chargement des patterns
  7706.       '
  7707.       GOSUB rec_result("  Converting patterns... ",FALSE)
  7708.       FOR i%=0 TO PRED(nbp%)
  7709.         a%=ADD(admod%,ADD(xxx2%,SHL(i%,1)))
  7710.         GOSUB intel_w(a%)
  7711.         pt%=ADD(admod%,SHL(CARD{a%},4))
  7712.         a%=CARD{pt%}                    ! Longueur du pattern
  7713.         GOSUB intel_w(ADD(V:a%,2))      ! Mais qu'est-ce que j'en fais ???
  7714.         ADD pt%,2
  7715.         b%=FN adr_pat(i%)
  7716.         c%=V:convtrk$
  7717.         ~C:g_convert_s3m_2_gtk%(L:pt%,L:b%,L:c%,W:nbr_track%)
  7718.       NEXT i%
  7719.       GOSUB rec_result("done.",TRUE)
  7720.     ENDIF
  7721.     '
  7722.     ' Chargement des sample
  7723.     '
  7724.     IF nbs%>0
  7725.       GOSUB rec_result("  Converting samples... ",FALSE)
  7726.       FOR i%=1 TO nbs%
  7727.         a%=FN length(i%)
  7728.         IF a%>0
  7729.           GOSUB decale_sample(i%,nbs%,V:os$)
  7730.           d%=FN adresse(i%)
  7731.           b%=FN resol(i%)
  7732.           IF b%=2               ! 16 bits
  7733.             ~C:g_intel_16_bits%(L:d%,L:a%)
  7734.           ENDIF
  7735.           IF ffv%=2
  7736.             ~C:g_signe_sample%(L:d%,L:a%,W:b%)
  7737.           ENDIF
  7738.         ENDIF
  7739.       NEXT i%
  7740.       GOSUB rec_result("done.",TRUE)
  7741.     ENDIF
  7742.   ENDIF
  7743.   ~FRE(0)
  7744. RETURN
  7745. PROCEDURE load_module_ult               !!!
  7746.   ' Chargement d'un module au format Ultra Tracker
  7747.   ' header$ : 4096 octets du debut du module
  7748. RETURN
  7749. PROCEDURE load_module_ult_mem
  7750.   ' Chargement d'un module au format Ultra Tracker
  7751.   ' header$ : 4096 octets du debut du module
  7752.   LOCAL pt%,a%,b%,bidi%,c%,d%,e%,i%,j%,nbp%,nbs%,ofp%,patt_seq%,res%,shs%,ver%,pat$,os$
  7753.   ~FRE(0)
  7754.   GOSUB rec_result("It's an Ultra Tracker module (ULT).",TRUE)
  7755.   GOSUB rec_result("  Converting module header... ",FALSE)
  7756.   ver%=1                                ! Numero de version du format
  7757.   shs%=64                               ! Taille d'un header de sample
  7758.   SELECT VAL(MID$(header$,13,3))
  7759.   CASE 2
  7760.     ver%=2
  7761.   CASE 3
  7762.     ver%=3
  7763.   CASE 4
  7764.     ver%=4
  7765.     shs%=66
  7766.   ENDSELECT
  7767.   GOSUB chg_songname2(ADD(admod%,15),32)
  7768.   res%=ADD(MUL(BYTE{ADD(admod%,47)},32),49)     ! Offset des descripteurs de samples
  7769.   nbs%=BYTE{ADD(admod%,PRED(res%))}
  7770.   patt_seq%=ADD(res%,MUL(nbs%,shs%))            ! Offset de la song
  7771.   nbp%=SUCC(BYTE{ADD(admod%,ADD(patt_seq%,257))})       ! Nombre de patterns
  7772.   GOSUB new_pattern_format(SUCC(BYTE{ADD(admod%,ADD(patt_seq%,256))}))
  7773.   IF ver%>2
  7774.     FOR i%=0 TO PRED(nbr_track%)
  7775.       CARD{ADD(V:balance$,SHL(i%,1))}=MUL(BYTE{ADD(ADD(admod%,ADD(patt_seq%,258)),i%)},&H111)
  7776.     NEXT i%
  7777.   ENDIF
  7778.   GOSUB rec_result("done.",TRUE)
  7779.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7780.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  7781.   '
  7782.   ' La song
  7783.   '
  7784.   GOSUB rec_result("  Converting song... ",FALSE)
  7785.   i%=0
  7786.   REPEAT
  7787.     a%=BYTE{ADD(admod%,ADD(patt_seq%,i%))}
  7788.     IF a%<nbp%
  7789.       song&(i%)=a%
  7790.       INC i%
  7791.     ENDIF
  7792.   UNTIL a%=>nbp% OR i%=>256
  7793.   module&(101)=i%
  7794.   GOSUB rec_result("done.",TRUE)
  7795.   '
  7796.   ' Chargement des patterns
  7797.   '
  7798.   GOSUB rec_result("  Converting patterns... ",FALSE)
  7799.   IF ver%<3
  7800.     ofp%=ADD(patt_seq%,258)
  7801.   ELSE
  7802.     ofp%=ADD(patt_seq%,ADD(258,nbr_track%))
  7803.   ENDIF
  7804.   IF nbp%>0
  7805.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbr_track%)+MKI$(64)),nbp%,FALSE)
  7806.     FOR j%=0 TO PRED(nbr_track%)
  7807.       FOR i%=0 TO PRED(nbp%)
  7808.         a%=ADD(admod%,ofp%)
  7809.         b%=FN adr_trk(i%,0,j%)
  7810.         a%=C:g_convert_ult_2_gtk%(L:a%,L:b%,W:nbr_track%)       ! Convertit et prend la longueur de cette voie
  7811.         ADD ofp%,a%
  7812.       NEXT i%
  7813.     NEXT j%
  7814.   ENDIF
  7815.   GOSUB rec_result("done.",TRUE)
  7816.   '
  7817.   ' Chargement des samples
  7818.   '
  7819.   IF nbs%>0
  7820.     GOSUB rec_result("  Converting samples... ",FALSE)
  7821.     os$=""
  7822.     FOR i%=1 TO nbs%
  7823.       pt%=ADD(admod%,ADD(res%,MUL(PRED(i%),shs%)))
  7824.       GOSUB chg_samplename2(pt%,28,i%)
  7825.       GOSUB chg_instrname2(pt%,28,i%)
  7826.       GOSUB intel_l(ADD(pt%,44))
  7827.       GOSUB intel_l(ADD(pt%,48))
  7828.       GOSUB intel_l(ADD(pt%,52))
  7829.       GOSUB intel_l(ADD(pt%,56))
  7830.       GOSUB intel_w(ADD(pt%,SUB(shs%,2)))
  7831.       bidi%=BYTE{ADD(pt%,61)}
  7832.       b%=SUB(LONG{ADD(pt%,56)},LONG{ADD(pt%,52)})       ! Longueur
  7833.       c%=LONG{ADD(pt%,44)}                              ! Loop start
  7834.       d%=LONG{ADD(pt%,48)}                              ! Loop end
  7835.       IF BTST(bidi%,2)                                  ! 16 bits ?
  7836.         ADD b%,b%
  7837.         ADD c%,c%
  7838.         ADD d%,d%
  7839.       ENDIF
  7840.       os$=os$+MKL$(ADD(admod%,ofp%))
  7841.       ADD ofp%,b%
  7842.       b%=MIN(MAX(b% AND -2,0),&HFFFFFE)
  7843.       IF BTST(bidi%,3) OR BTST(bidi%,4)                 ! Bouclage
  7844.         c%=MAX(MIN(c% AND -2,SUB(b%,2)),0)
  7845.         d%=MAX(SUB(MIN(d%,b%),c%),2) AND -2
  7846.       ELSE
  7847.         c%=0
  7848.         d%=2
  7849.       ENDIF
  7850.       GOSUB chg_sam_length(i%,b%)
  7851.       GOSUB chg_sam_repeat(i%,c%)
  7852.       GOSUB chg_sam_replen(i%,d%)
  7853.       d%=CARD{ADD(pt%,SUB(shs%,2))} AND 15      ! Finetune
  7854.       IF d%>7
  7855.         SUB d%,16
  7856.       ENDIF
  7857.       GOSUB chg_sam_finetune(i%,d%)
  7858.       GOSUB chg_ins_volume(i%,BYTE{ADD(pt%,60)})
  7859.       GOSUB chg_sam_volume(i%,&H100)
  7860.       GOSUB chg_sam_nbits(i%,SUB(1,BTST(bidi%,2)))
  7861.       IF ver%>3                         ! Frequence d'echantillonnage
  7862.         GOSUB intel_w(ADD(pt%,SUB(shs%,4)))
  7863.         GOSUB chg_sam_freq(i%,CARD{ADD(pt%,SUB(shs%,4))})
  7864.       ENDIF
  7865.     NEXT i%
  7866.     FOR i%=1 TO nbs%
  7867.       a%=FN length(i%)
  7868.       IF a%>0
  7869.         GOSUB decale_sample(i%,nbs%,V:os$)
  7870.         IF FN resol(i%)=2       ! 16 bits
  7871.           d%=FN adresse(i%)
  7872.           ~C:g_intel_16_bits%(L:d%,L:a%)
  7873.         ENDIF
  7874.       ENDIF
  7875.     NEXT i%
  7876.     GOSUB rec_result("done.",TRUE)
  7877.   ENDIF
  7878.   ~FRE(0)
  7879. RETURN
  7880. PROCEDURE load_module_dtm_mem
  7881.   LOCAL a%,b%,c%,adsq%,adpatt%,adinst%,finmod%,i%,j%,k%,l%,nbs%,nbp%,pt%
  7882.   LOCAL adp$,adi$,map$
  7883.   ~FRE(0)
  7884.   GOSUB rec_result("It's a Digital Tracker module (DTM).",TRUE)
  7885.   '
  7886.   ' Identification des chunks
  7887.   '
  7888.   finmod%=ADD(admod%,lonmod%)
  7889.   adp$=STRING$(1024,0)
  7890.   adi$=STRING$(1024,0)
  7891.   map$=STRING$(256,MKI$(1)+MKI$(1))
  7892.   a%=admod%
  7893.   REPEAT
  7894.     SELECT LONG{a%}
  7895.     CASE "S.Q."
  7896.       adsq%=a%
  7897.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7898.     CASE "PATT"
  7899.       adpatt%=a%
  7900.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7901.     CASE "INST"
  7902.       adinst%=a%
  7903.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7904.     CASE "DAPT"
  7905.       LONG{ADD(V:adp$,SHL(CARD{ADD(a%,12)},2))}=a%
  7906.       CARD{ADD(V:map$,ADD(SHL(CARD{ADD(a%,12)},2),2))}=CARD{ADD(a%,14)}
  7907.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7908.     CASE "DAIT"
  7909.       LONG{ADD(V:adi$,SHL(CARD{ADD(a%,8)},2))}=a%
  7910.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7911.     ENDSELECT
  7912.     a%=C:g_dtm_next_chunk%(L:a%,L:finmod%)
  7913.   UNTIL a%>=finmod%
  7914.   '
  7915.   ' Infos generales
  7916.   '
  7917.   GOSUB rec_result("  Converting module header... ",FALSE)
  7918.   GOSUB new_pattern_format(CARD{ADD(adpatt%,8)})
  7919.   GOSUB chg_songname2(ADD(admod%,22),20)
  7920.   IF CARD{ADD(admod%,14)}<>0
  7921.     ticks%=CARD{ADD(admod%,14)}                 ! Vitesse
  7922.   ENDIF
  7923.   IF CARD{ADD(admod%,16)}<>0                    ! Tempo
  7924.     tempo%=CARD{ADD(admod%,16)}
  7925.   ENDIF
  7926.   nbs%=CARD{ADD(adinst%,8)}
  7927.   GOSUB rec_result("done.",TRUE)
  7928.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  7929.   '
  7930.   ' La song
  7931.   '
  7932.   GOSUB rec_result("  Converting song chunk... ",FALSE)
  7933.   module&(101)=CARD{ADD(adsq%,8)}
  7934.   module&(102)=CARD{ADD(adsq%,10)}
  7935.   ARRAYFILL song&(),0
  7936.   FOR i%=0 TO PRED(module&(101))
  7937.     song&(i%)=BYTE{ADD(ADD(adsq%,16),i%)}
  7938.   NEXT i%
  7939.   GOSUB rec_result("done.",TRUE)
  7940.   '
  7941.   ' Les patterns
  7942.   '
  7943.   GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  7944.   nbp%=CARD{ADD(adpatt%,10)}
  7945.   FOR i%=0 TO SHL(PRED(nbp%),2) STEP 4
  7946.     CARD{ADD(V:map$,i%)}=nbr_track%
  7947.   NEXT i%
  7948.   GOSUB create_space_multipatchunk(map$,nbp%,FALSE)
  7949.   FOR i%=0 TO PRED(nbp%)
  7950.     a%=LONG{ADD(V:adp$,SHL(i%,2))}      ! Adresse du pattern
  7951.     IF a%<>0
  7952.       l%=CARD{ADD(a%,14)}
  7953.       IF l%>0
  7954.         ADD a%,16                       ! Adresse des donnees
  7955.         b%=FN adr_pat(i%)
  7956.         c%=MUL(l%,nbr_track%)
  7957.         IF LONG{ADD(adpatt%,12)}=&H322E3034     ! '2.04'
  7958.           ~C:g_convert_dtm_2_gtk%(L:a%,L:b%,L:c%)
  7959.         ELSE                                    ! Ancien format
  7960.           BMOVE a%,b%,SHL(c%,2)
  7961.           ~C:g_convert_nt_2_gtk%(L:b%,L:c%)
  7962.         ENDIF
  7963.       ENDIF
  7964.     ENDIF
  7965.   NEXT i%
  7966.   GOSUB rec_result("done.",TRUE)
  7967.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7968.   '
  7969.   ' Les instruments
  7970.   '
  7971.   GOSUB rec_result("  Converting sample chunks... ",FALSE)
  7972.   IF nbs%>0
  7973.     FOR i%=1 TO nbs%
  7974.       IF LONG{ADD(V:adi$,SHL(PRED(i%),2))}>admod%
  7975.         a%=ADD(ADD(adinst%,10),MUL(PRED(i%),50))
  7976.         GOSUB chg_samplename2(ADD(a%,18),22,i%)
  7977.         GOSUB chg_instrname2(ADD(a%,18),22,i%)
  7978.         c%=LONG{ADD(a%,4)} AND -2
  7979.         GOSUB chg_sam_length(i%,c%)
  7980.         IF c%>0
  7981.           GOSUB chg_sam_freq(i%,LONG{ADD(a%,46)})
  7982.           GOSUB chg_sam_nbits(i%,SHR(BYTE{ADD(a%,41)},3))
  7983.           b%=LONG{ADD(a%,14)} AND -2
  7984.           IF b%>2
  7985.             GOSUB chg_sam_repeat(i%,MIN(SUB(c%,2),MAX(0,LONG{ADD(a%,10)} AND -2)))
  7986.             GOSUB chg_sam_replen(i%,MIN(SUB(c%,FN repeat(i%)),MAX(2,b%)))
  7987.           ELSE
  7988.             GOSUB chg_sam_repeat(i%,0)
  7989.             GOSUB chg_sam_replen(i%,2)
  7990.           ENDIF
  7991.           c%=BYTE{ADD(a%,8)}
  7992.           IF c%>7
  7993.             SUB c%,16
  7994.           ENDIF
  7995.           GOSUB chg_sam_finetune(i%,c%)
  7996.           GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(a%,9)},2))
  7997.           GOSUB chg_sam_volume(i%,&H100)
  7998.         ENDIF
  7999.       ENDIF
  8000.     NEXT i%
  8001.   ENDIF
  8002.   ~FRE(0)
  8003.   IF nbs%>0
  8004.     FOR i%=0 TO PRED(nbs%)
  8005.       IF FN length(SUCC(i%))>0
  8006.         LONG{ADD(V:adi$,SHL(i%,2))}=ADD(LONG{ADD(V:adi$,SHL(i%,2))},10)
  8007.       ELSE
  8008.         LONG{ADD(V:adi$,SHL(i%,2))}=0
  8009.       ENDIF
  8010.     NEXT i%
  8011.     FOR i%=1 TO nbs%
  8012.       GOSUB decale_sample(i%,nbs%,V:adi$)
  8013.     NEXT i%
  8014.   ENDIF
  8015.   GOSUB rec_result("done.",TRUE)
  8016. RETURN
  8017. PROCEDURE load_module_xm_mem            !!!
  8018.   LOCAL a%,b%,c%,d%,i%,j%,l%,hs%,nbi%,nbl%,nbp%,nbt%,pt%,sl%,snum%,sr%,tem%
  8019.   LOCAL transp$,adi$,map$
  8020.   ~FRE(0)
  8021.   GOSUB rec_result("It's a FastTracker 2 module (XM).",TRUE)
  8022.   '
  8023.   ' Header du module
  8024.   '
  8025.   GOSUB rec_result("  Converting module header... ",FALSE)
  8026.   GOSUB chg_songname2(ADD(admod%,17),20)
  8027.   GOSUB intel_l(ADD(admod%,60))
  8028.   GOSUB intel_w(ADD(admod%,64))
  8029.   GOSUB intel_w(ADD(admod%,66))
  8030.   GOSUB intel_w(ADD(admod%,68))
  8031.   GOSUB intel_w(ADD(admod%,70))
  8032.   GOSUB intel_w(ADD(admod%,72))
  8033.   GOSUB intel_w(ADD(admod%,76))
  8034.   GOSUB intel_w(ADD(admod%,78))
  8035.   pt%=ADD(ADD(60,admod%),LONG{ADD(admod%,60)})  ! Pointe sur le 1er pattern
  8036.   sl%=CARD{ADD(admod%,64)}              ! Song length
  8037.   sr%=CARD{ADD(admod%,66)}              ! Song repeat
  8038.   nbt%=CARD{ADD(admod%,68)}             ! Nombre de tracks
  8039.   nbp%=CARD{ADD(admod%,70)}             ! Nombre de patterns
  8040.   nbi%=CARD{ADD(admod%,72)}             ! Nombre d'instruments
  8041.   ticks%=CARD{ADD(admod%,76)}           ! Vitesse
  8042.   tempo%=CARD{ADD(admod%,78)}           ! Tempo
  8043.   '
  8044.   ' Recherche du nombre de lignes
  8045.   ' DesINTELisation des mots dans les headers des patterns
  8046.   '
  8047.   map$=""
  8048.   nbl%=1
  8049.   a%=pt%
  8050.   FOR i%=1 TO nbp%
  8051.     GOSUB intel_l(a%)
  8052.     GOSUB intel_w(ADD(a%,5))
  8053.     GOSUB intel_w(ADD(a%,7))
  8054.     nbl%=CARD{ADD(a%,5)}
  8055.     map$=map$+MKI$(nbt%)+MKI$(nbl%)
  8056.     ADD a%,ADD(LONG{a%},CARD{ADD(a%,7)})
  8057.   NEXT i%
  8058.   GOSUB new_pattern_format(nbt%)
  8059.   GOSUB rec_result("done.",TRUE)
  8060.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  8061.   GOSUB rec_result("  "+STR$(nbi%)+" instruments,",TRUE)
  8062.   '
  8063.   ' La song
  8064.   '
  8065.   GOSUB rec_result("  Converting song... ",FALSE)
  8066.   module&(101)=sl%
  8067.   module&(102)=sr%
  8068.   FOR i%=0 TO PRED(FN song_length)
  8069.     song&(i%)=BYTE{ADD(ADD(admod%,80),i%)}
  8070.   NEXT i%
  8071.   GOSUB rec_result("done.",TRUE)
  8072.   '
  8073.   ' Les patterns
  8074.   '
  8075.   GOSUB rec_result("  Converting patterns... ",FALSE)
  8076.   GOSUB create_space_multipatchunk(map$,nbp%,FALSE)
  8077.   FOR i%=0 TO PRED(nbp%)
  8078.     IF BYTE{ADD(pt%,4)}=0               ! Packing type 0
  8079.       l%=CARD{ADD(pt%,5)}
  8080.       a%=ADD(pt%,9)
  8081.       b%=FN adr_pat(i%)
  8082.       ~C:g_convert_ft2_2_gtk%(L:a%,L:b%,W:nbr_track%,W:l%)
  8083.       pt%=ADD(a%,CARD{ADD(pt%,7)})
  8084.     ENDIF
  8085.   NEXT i%
  8086.   GOSUB rec_result("done.",TRUE)
  8087.   '
  8088.   ' Les instruments et headers des samples
  8089.   '
  8090.   GOSUB rec_result("  Converting instruments and sample headers... ",FALSE)
  8091.   snum%=1                               ! Sample courant
  8092.   adi$=""
  8093.   FOR i%=1 TO nbi%
  8094.     GOSUB intel_l(pt%)
  8095.     GOSUB intel_w(ADD(pt%,27))
  8096.     hs%=LONG{pt%}                       ! Taille du header d'instr
  8097.     c%=CARD{ADD(pt%,27)}                ! Nombre de samples dans l'instr
  8098.     GOSUB chg_instrname2(ADD(pt%,4),22,i%)
  8099.     IF c%=0
  8100.       ADD pt%,hs%                       ! Si pas de sample, instr suivant
  8101.     ELSE
  8102.       GOSUB chg_ins_volume(i%,256)
  8103.       FOR j%=1 TO 95                    ! Affectation des samples pour chaque note
  8104.         GOSUB chg_ins_sample(i%,j%,ADD(BYTE{ADD(pt%,ADD(33,j%))},snum%))
  8105.       NEXT j%
  8106.       FOR j%=96 TO 127
  8107.         GOSUB chg_ins_sample(i%,j%,FN isample(i%,95))
  8108.       NEXT j%
  8109.       GOSUB chg_ins_sample(i%,0,0)
  8110.       transp$=STRING$(256,0)            ! Table des transposition pour chaque sample
  8111.       GOSUB intel_l(ADD(pt%,29))
  8112.       a%=LONG{ADD(pt%,29)}              ! Taille des Sample Headers
  8113.       ADD pt%,hs%                       ! Pointe sur le premier header de sample
  8114.       ' Scanne chaque header de sample
  8115.       b%=0                              ! Taille totale des sample data de l'instrument
  8116.       FOR j%=1 TO c%                    ! DesINTELise tous les headers
  8117.         GOSUB intel_l(pt%)
  8118.         GOSUB intel_l(ADD(pt%,4))
  8119.         GOSUB intel_l(ADD(pt%,8))
  8120.         BYTE{ADD(V:transp$,snum%)}=BYTE{ADD(pt%,16)}    ! Memorise la transposition
  8121.         adi$=adi$+MKL$(b%)
  8122.         d%=LONG{pt%}
  8123.         ADD b%,d%
  8124.         d%=d% AND -2
  8125.         GOSUB chg_sam_length(snum%,d%)
  8126.         IF BTST(BYTE{ADD(pt%,14)},0) OR BTST(BYTE{ADD(pt%,14)},1)
  8127.           GOSUB chg_sam_repeat(snum%,LONG{ADD(pt%,4)} AND -2)
  8128.           GOSUB chg_sam_replen(snum%,MIN(MAX(LONG{ADD(pt%,8)},2),SUB(FN length(snum%),FN repeat(snum%))) AND -2)
  8129.         ELSE
  8130.           GOSUB chg_sam_repeat(snum%,0)
  8131.           GOSUB chg_sam_replen(snum%,2)
  8132.         ENDIF
  8133.         GOSUB chg_sam_volume(snum%,SHL(BYTE{ADD(pt%,12)},2))
  8134.         GOSUB chg_sam_freq(snum%,8363)
  8135.         GOSUB chg_sam_finetune(snum%,DIV(FN sbyte(BYTE{ADD(pt%,13)}),16))
  8136.         GOSUB chg_sam_nbits(snum%,SUB(1,BTST(BYTE{ADD(pt%,14)},4)))
  8137.         GOSUB chg_sam_balance(snum%,SHL(BYTE{ADD(pt%,15)},4))
  8138.         GOSUB chg_samplename2(ADD(pt%,18),22,snum%)
  8139.         ADD pt%,a%
  8140.         INC snum%                       ! *** Attention faut pas depasser 255!!!!!
  8141.       NEXT j%
  8142.       FOR j%=1 TO c%                    ! Les adresses des samples dans le XM
  8143.         LONG{ADD(V:adi$,SHL(SUB(PRED(snum%),j%),2))}=ADD(LONG{ADD(V:adi$,SHL(SUB(PRED(snum%),j%),2))},pt%)
  8144.       NEXT j%
  8145.       ADD pt%,b%                        ! Saute les donnees de sample
  8146.       FOR j%=1 TO 95                    ! Affecte les transpositions a chaque note suivant les samples
  8147.         GOSUB chg_ins_transp(i%,j%,BYTE{ADD(V:transp$,FN isample(i%,j%))})
  8148.       NEXT j%
  8149.       FOR j%=96 TO 127
  8150.         GOSUB chg_ins_transp(i%,j%,FN itransp(i%,95))
  8151.       NEXT j%
  8152.       GOSUB chg_ins_transp(i%,0,0)
  8153.     ENDIF
  8154.   NEXT i%
  8155.   GOSUB rec_result("done.",TRUE)
  8156.   GOSUB rec_result("  "+STR$(snum%)+" samples,",TRUE)
  8157.   '
  8158.   ' Deplacement des samples et conversion en absolu
  8159.   '
  8160.   IF snum%>1
  8161.     GOSUB rec_result("  Converting sample data... ",FALSE)
  8162.     FOR i%=1 TO PRED(snum%)
  8163.       GOSUB decale_sample(i%,PRED(snum%),V:adi$)
  8164.       a%=FN adresse(i%)
  8165.       b%=FN length(i%)
  8166.       c%=FN resol(i%)
  8167.       IF c%=2                           ! 16 bits
  8168.         ~C:g_intel_16_bits%(L:a%,L:b%)
  8169.       ENDIF
  8170.       ~C:g_delta_2_absolu%(L:a%,L:b%,W:c%)
  8171.     NEXT i%
  8172.     GOSUB rec_result("done.",TRUE)
  8173.   ENDIF
  8174. RETURN
  8175. PROCEDURE load_module_mgt_mem           !!!
  8176.   LOCAL nbt%,nbp%,nbs%
  8177.   LOCAL version%,nb_musics%,nb_orders%,nb_tracks%,attributes%
  8178.   LOCAL pt_musics%,pt_sequence%,pt_sample_infos%,pt_patterns%,pt_track_ptr%,pt_sample_data%
  8179.   ~FRE(0)
  8180.   GOSUB rec_result("It's a MegaTracker module (MGT).",TRUE)
  8181.   '
  8182.   ' Header du fichier
  8183.   '
  8184.   version%=BYTE{ADD(admod%,4)}
  8185.   nbt%=CARD{ADD(admod%,8)}
  8186.   nb_musics%=CARD{ADD(admod%,10)}
  8187.   nb_orders%=CARD{ADD(admod%,12)}
  8188.   nbp%=CARD{ADD(admod%,14)}
  8189.   nb_tracks%=CARD{ADD(admod%,16)}
  8190.   nbs%=CARD{ADD(admod%,18)}
  8191.   attributes%=CARD{ADD(admod%,20)}
  8192.   pt_musics%=ADD(admod%,LONG{ADD(admod%,26)})
  8193.   pt_sample_infos%=ADD(admod%,LONG{ADD(admod%,34)})
  8194.   pt_patterns%=ADD(admod%,LONG{ADD(admod%,38)})
  8195.   pt_track_ptr%=ADD(admod%,LONG{ADD(admod%,42)})
  8196.   pt_sample_data%=ADD(admod%,LONG{ADD(admod%,46)})
  8197.   GOSUB rec_result("  Format version: "+STR$(SHR(version%,4))+"."+STR$(version% AND 15)+".",TRUE)
  8198.   GOSUB rec_result("  "+STR$(nbp%)+" patterns.",TRUE)
  8199.   GOSUB rec_result("  "+STR$(nbs%)+" samples.",TRUE)
  8200.   '
  8201.   IF ADD(LONG{ADD(admod%,50)},LONG{ADD(admod%,54)})>FN zone_free2
  8202.     erreur%=1
  8203.   ELSE
  8204.     '
  8205.     ' Musique
  8206.     '
  8207.     GOSUB chg_songname2(ADD(pt_music%,0),32)
  8208.     pt_sequence%=ADD(admod%,LONG{ADD(pt_music%,32)})
  8209.     module&(101)=CARD{ADD(pt_music%,36)}
  8210.     module&(102)=CARD{ADD(pt_music%,38)}
  8211.     tempo%=CARD{ADD(pt_music%,40)}
  8212.     FOR i%=0 TO PRED(module&(101))
  8213.       song&(i%)=CARD{ADD(pt_sequence%,SHL(i%,1))}
  8214.     NEXT i%
  8215.   ENDIF
  8216. RETURN
  8217. PROCEDURE save_instrument
  8218.   LOCAL a$
  8219.   IF flag_registered!
  8220.     IF km%=2 AND nfile_instrument$<>""
  8221.       a$=npath_div$+nfile_instrument$
  8222.     ELSE
  8223.       CLS
  8224.       GOSUB cadre_texte("SAVE INSTRUMENT",0,0,PRED(scr_ncol%))
  8225.       GOSUB sjx_system_to_gem
  8226.       FILESELECT npath_div$+"*.INS",nfile_instrument$,a$
  8227.       GOSUB sjx_system_to_gtk
  8228.     ENDIF
  8229.     IF a$<>""
  8230.       CLS
  8231.       GOSUB cadre_texte("WAITING : SAVING INSTRUMENT "+a$+"...",0,0,PRED(scr_ncol%))
  8232.       GOSUB save_instrument2
  8233.       GOSUB separe_nom_chemin(a$)
  8234.       nfile_instrument$=nfile_$
  8235.       npath_div$=npath_$
  8236.     ENDIF
  8237.   ELSE
  8238.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  8239.   ENDIF
  8240.   GOSUB affiche_panneau_principal
  8241. RETURN
  8242. PROCEDURE save_instrument2
  8243.   ' Fournir a$ nom du module, instr% numero de l'instrument
  8244.   LOCAL a%,i%
  8245.   LOCAL b$
  8246.   erreur%=0
  8247.   warning%=0
  8248.   OPEN "o",#0,a$
  8249.   SEEK #0,0
  8250.   '
  8251.   ' Travail preparatoire
  8252.   '
  8253.   ' Cherche les samples utilises par cet instrument
  8254.   lsam$=STRING$(256,0)
  8255.   FOR i%=0 TO 127
  8256.     a%=FN isample(instr%,i%)
  8257.     IF a%<>0
  8258.       BYTE{ADD(V:lsam$,a%)}=1
  8259.     ENDIF
  8260.   NEXT i%
  8261.   '
  8262.   ' Chunk de l'instrument
  8263.   '
  8264.   BPUT #0,V:instrset%(0,instr%),instrset%(1,instr%)
  8265.   '
  8266.   ' Chunks des samples
  8267.   '
  8268.   FOR i%=1 TO 255
  8269.     IF BYTE{ADD(V:lsam$,i%)}<>0
  8270.       a%=MAX(FN adrsamchk(i%)*(-flag_registered2!),&H1563)      ! *** 2eme protection
  8271.       BPUT #0,a%,FN lonsamchk(i%)
  8272.     ENDIF
  8273.   NEXT i%
  8274.   CLOSE #0
  8275. RETURN
  8276. PROCEDURE load_instrument
  8277.   LOCAL a$
  8278.   IF km%=2 AND nfile_instrument$<>""
  8279.     a$=npath_div$+nfile_instrument$
  8280.   ELSE
  8281.     CLS
  8282.     GOSUB cadre_texte("LOAD SAMPLE",0,0,PRED(scr_ncol%))
  8283.     GOSUB sjx_system_to_gem
  8284.     FILESELECT npath_div$+"*.INS",nfile_instrument$,a$
  8285.     GOSUB sjx_system_to_gtk
  8286.   ENDIF
  8287.   IF FN exist(a$)
  8288.     CLS
  8289.     GOSUB cadre_texte("WAITING : LOADING INSTRUMENT "+a$+"...",0,0,PRED(scr_ncol%))
  8290.     GOSUB load_instrument2
  8291.     IF erreur%=0
  8292.       GOSUB separe_nom_chemin(a$)
  8293.       nfile_instrument$=nfile_$
  8294.       npath_div$=npath_$
  8295.     ENDIF
  8296.   ENDIF
  8297.   GOSUB affiche_panneau_principal
  8298.   IF erreur%=1
  8299.     GOSUB aff_message("NOT AN INSTRUMENT.")
  8300.   ELSE IF erreur%=2
  8301.     GOSUB aff_message("NOT ENOUGH MEMORY TO LOAD THIS INSTRUMENT !")
  8302.   ELSE IF erreur%=3
  8303.     GOSUB aff_message("TOO MANY SAMPLES IN THIS INSTRUMENT")
  8304.   ENDIF
  8305. RETURN
  8306. PROCEDURE load_instrument2
  8307.   ' Nom fourni dans a$
  8308.   LOCAL a%,b%,c%,i%,j%,lchk%,nbs%,posact%,totlon%
  8309.   LOCAL chk$,sam$
  8310.   ~FRE(0)
  8311.   erreur%=0
  8312.   warning%=0
  8313.   OPEN "i",#0,a$
  8314.   totlon%=LOF(#0)
  8315.   posact%=0
  8316.   '
  8317.   ' Chargement du chunk de l'instrument
  8318.   '
  8319.   chk$=STRING$(8,0)
  8320.   SEEK #0,posact%
  8321.   BGET #0,V:chk$,8
  8322.   ADD posact%,8
  8323.   IF LEFT$(chk$,4)="INST"                       ! Verifie que c'est bien un instrument
  8324.     lchk%=LONG{ADD(V:chk$,4)}
  8325.     chk$=chk$+STRING$(SUB(lchk%,8),0)
  8326.     BGET #0,ADD(V:chk$,8),SUB(lchk%,8)
  8327.     ADD posact%,SUB(lchk%,8)
  8328.     ' Table de conversion de numero d'instrument
  8329.     sam$=STRING$(256,0)
  8330.     nbs%=0                                      ! Nombre de samples
  8331.     a%=0
  8332.     FOR i%=1 TO 127
  8333.       b%=BYTE{ADD(ADD(V:chk$,60),SHL(i%,1))}
  8334.       IF BYTE{ADD(V:sam$,b%)}=0 AND b%>0
  8335.         INC nbs%
  8336.         REPEAT
  8337.           INC a%
  8338.           EXIT IF a%>255
  8339.         UNTIL FN length(a%)=0                   ! Cherche un sample libre : longueur nulle
  8340.         IF a%<=255
  8341.           BYTE{ADD(V:sam$,b%)}=a%
  8342.         ELSE
  8343.           erreur%=3                             ! Plus de sample libre : erreur
  8344.           i%=999
  8345.         ENDIF
  8346.       ENDIF
  8347.     NEXT i%
  8348.     IF erreur%<>0
  8349.       GOTO ld_instr2_fin
  8350.     ENDIF
  8351.     CARD{ADD(V:chk$,8)}=instr%
  8352.     CARD{ADD(V:chk$,60)}=0
  8353.     FOR i%=1 TO 127                             ! Nouveaux numeros de sample
  8354.       BYTE{ADD(ADD(V:chk$,60),SHL(i%,1))}=BYTE{ADD(V:sam$,BYTE{ADD(ADD(V:chk$,60),(SHL(i%,1)))})}
  8355.     NEXT i%
  8356.     BMOVE V:chk$,V:instrset%(0,instr%),316
  8357.     '
  8358.     ' Chargement des samples
  8359.     '
  8360.     IF nbs%>0
  8361.       a%=0                                      ! Nombre de samples charges
  8362.       WHILE posact%<totlon% AND a%<nbs%
  8363.         chk$=STRING$(64,0)
  8364.         SEEK #0,posact%
  8365.         BGET #0,V:chk$,64
  8366.         ADD posact%,64
  8367.         lchk%=LONG{ADD(V:chk$,4)}               ! Longueur totale du chunk du sample
  8368.         c%=LONG{ADD(V:chk$,46)}                 ! Longueur en octets
  8369.         d%=CARD{ADD(V:chk$,8)}                  ! Ancien numero du sample
  8370.         b%=BYTE{ADD(V:sam$,d%)}                 ! Nouveau numero du sample
  8371.         IF b%<>0                                ! S'il etait bien declare dans le chunk de l'instrument
  8372.           CARD{ADD(V:chk$,8)}=b%
  8373.           GOSUB chg_taille_sample(b%,c%)        ! Change d'abord la taille
  8374.           BMOVE V:chk$,FN adrsamchk(b%),64      ! Transfert ensuite le chunk
  8375.           BGET #0,FN adresse(b%),c%             ! Puis transfert les donnees (taille indiquee dans Length)
  8376.           ADD posact%,SUB(lchk%,64)             ! Pointe sur le chunk suivant
  8377.           BYTE{ADD(V:sam$,d%)}=0                ! Indique que le sample est deja charge
  8378.           INC a%
  8379.         ELSE                                    ! Sample qui etait en trop
  8380.           ADD posact%,SUB(lchk%,64)
  8381.         ENDIF
  8382.       WEND
  8383.     ENDIF
  8384.     IF a%<nbs%
  8385.       warning%=1                                ! Tous les samples n'ont pas ete trouves
  8386.     ENDIF
  8387.     FOR i%=1 TO 255
  8388.       ~C:rr_boucle_sample%(W:i%)
  8389.     NEXT i%
  8390.   ELSE
  8391.     erreur%=1
  8392.   ENDIF
  8393. ld_instr2_fin:
  8394.   CLOSE #0
  8395. RETURN
  8396. PROCEDURE load_prefs
  8397.   LOCAL a$
  8398.   IF km%=2 AND nfile_sample$<>""
  8399.     a$=npath_prefs$+nfile_prefs$
  8400.   ELSE
  8401.     CLS
  8402.     GOSUB cadre_texte("LOAD PREFERENCES",0,0,PRED(scr_ncol%))
  8403.     GOSUB sjx_system_to_gem
  8404.     FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  8405.     GOSUB sjx_system_to_gtk
  8406.   ENDIF
  8407.   IF a$<>""
  8408.     IF FN exist(a$)
  8409.       CLS
  8410.       GOSUB cadre_texte("WAITING : LOADING PREFERENCES "+a$+"...",0,0,PRED(scr_ncol%))
  8411.       GOSUB load_prefs2(a$,FALSE)
  8412.     ENDIF
  8413.   ENDIF
  8414.   GOSUB bee(FALSE)
  8415.   GOSUB affiche_panneau_principal
  8416. RETURN
  8417. PROCEDURE load_prefs2(fic$,first_time!) !!!
  8418.   LOCAL a%,b%,i%
  8419.   LOCAL a$,lig$,p$,p1$,p2$,dejafait_touche$
  8420.   LOCAL error!
  8421.   dejafait_touche$=STRING$(255,0)
  8422.   OPEN "i",#0,fic$
  8423.   WHILE NOT EOF(#0)
  8424.     LINE INPUT #0,lig$
  8425.     IF LEN(lig$)>2
  8426.       ' Transforme les caracteres non ASCII en espaces
  8427.       FOR i%=0 TO PRED(LEN(lig$))
  8428.         IF BYTE{ADD(V:lig$,i%)}<32
  8429.           BYTE{ADD(V:lig$,i%)}=32
  8430.         ENDIF
  8431.       NEXT i%
  8432.       lig$=TRIM$(lig$)
  8433.       a%=INSTR(lig$,"=")
  8434.       IF a%>1
  8435.         p$=UPPER$(TRIM$(LEFT$(lig$,PRED(a%))))  ! p$ contient le nom de la variable
  8436.         p1$=RIGHT$(lig$,SUB(LEN(lig$),a%))      ! p1$ contient le reste brut de la ligne
  8437.         b%=INSTR(p1$,";")
  8438.         IF b%>0
  8439.           p2$=UPPER$(TRIM$(LEFT$(p1$,PRED(b%))))        ! p2$ contient le 2eme terme sans commentaire
  8440.         ELSE
  8441.           p2$=UPPER$(TRIM$(p1$))
  8442.         ENDIF
  8443.         '
  8444.         ' Main pannel
  8445.         ' -----------
  8446.         '
  8447.         ' Touches
  8448.         '
  8449.         IF p$="KEYBOARD_TYPE"
  8450.           IF p2$="QWERTY"
  8451.             keyboard_type%=1
  8452.           ELSE
  8453.             keyboard_type%=0
  8454.           ENDIF
  8455.         ELSE IF p$="KEYBOARD_BUFFER"
  8456.           IF p2$="ON"
  8457.             flag_keyboard_buffer!=TRUE
  8458.           ELSE
  8459.             flag_keyboard_buffer!=FALSE
  8460.           ENDIF
  8461.         ELSE IF LEFT$(p$,6)="KEYDEF"
  8462.           p$=TRIM$(RIGHT$(p$,SUB(LEN(p$),6)))
  8463.           GOSUB load_prefs_analyse_touche(p$,p2$)
  8464.           '
  8465.           ' Disk
  8466.           '
  8467.         ELSE IF p$="PROGRAM_PATH"
  8468.           npath_prog$=p2$
  8469.         ELSE IF p$="MODULE_PATH"
  8470.           npath_module$=p2$
  8471.         ELSE IF p$="SAMPLE_PATH"
  8472.           npath_sample$=p2$
  8473.         ELSE IF p$="AUTOLOAD_PATH"
  8474.           npath_autoload$=p2$
  8475.         ELSE IF p$="PREF_PATH"
  8476.           npath_prefs$=p2$
  8477.         ELSE IF p$="MISC_PATH"
  8478.           npath_div$=p2$
  8479.         ELSE IF p$="MODULE_EXTENSION"
  8480.           next_module$=p2$
  8481.         ELSE IF p$="SAMPLE_EXTENSION"
  8482.           next_sample$=p2$
  8483.         ELSE IF p$="MODULE_FILE"
  8484.           IF p2$<>"/"
  8485.             nfile_module$=p2$
  8486.           ELSE
  8487.             nfile_module$=""
  8488.           ENDIF
  8489.         ELSE IF p$="SAMPLE_FILE"
  8490.           IF p2$<>"/"
  8491.             nfile_sample$=p2$
  8492.           ELSE
  8493.             nfile_sample$=""
  8494.           ENDIF
  8495.         ELSE IF p$="AUTOLOAD_FILE"
  8496.           IF p2$<>"/"
  8497.             nfile_autoload$=p2$
  8498.           ELSE
  8499.             nfile_autoload$=""
  8500.           ENDIF
  8501.         ELSE IF p$="PREF_FILE"
  8502.           IF p2$<>"/"
  8503.             nfile_prefs$=p2$
  8504.           ELSE
  8505.             nfile_prefs$=""
  8506.           ENDIF
  8507.         ELSE IF p$="SAVE_CONFIG_GT2"
  8508.           IF p2$="TRUE"
  8509.             flag_gt2cnf!=TRUE
  8510.           ELSE
  8511.             flag_gt2cnf!=FALSE
  8512.           ENDIF
  8513.         ELSE IF p$="MODULE_BACKUP"
  8514.           IF p2$="TRUE"
  8515.             flag_backup_modules!=TRUE
  8516.           ELSE
  8517.             flag_backup_modules!=FALSE
  8518.           ENDIF
  8519.           '
  8520.           ' Divers
  8521.           '
  8522.         ELSE IF p$="SYSTEM_MEMORY"
  8523.           system_memory%=MAX(VAL(p2$),16384)
  8524.         ELSE IF p$="COLOR_PAL"
  8525.           error!=FALSE
  8526.           a$=""
  8527.           FOR i%=0 TO 15
  8528.             IF LEN(p2$)<3
  8529.               error!=TRUE
  8530.             ELSE
  8531.               a$=a$+LEFT$(p2$,3)
  8532.               p2$=TRIM$(RIGHT$(p2$,SUB(LEN(p2$),3)))
  8533.             ENDIF
  8534.           NEXT i%
  8535.           IF NOT error!
  8536.             color_pal$=a$
  8537.           ENDIF
  8538.         ELSE IF p$="GRMODE_OVERSCAN"
  8539.           IF p2$="YES"
  8540.             grmode_overscan%=1
  8541.           ELSE IF p2$="NO"
  8542.             grmode_overscan%=0
  8543.           ELSE
  8544.             grmode_overscan%=-1
  8545.           ENDIF
  8546.         ELSE IF p$="GRMODE_80COL"
  8547.           IF p2$="YES"
  8548.             grmode_80colonnes%=1
  8549.           ELSE IF p2$="NO"
  8550.             grmode_80colonnes%=0
  8551.           ELSE
  8552.             grmode_80colonnes%=-1
  8553.           ENDIF
  8554.         ELSE IF p$="GRMODE_400LINES"
  8555.           IF p2$="YES"
  8556.             grmode_entrelace%=1
  8557.           ELSE IF p2$="NO"
  8558.             grmode_entrelace%=0
  8559.           ELSE
  8560.             grmode_entrelace%=-1
  8561.           ENDIF
  8562.         ELSE IF p$="GRMODE_PRESERVE"
  8563.           IF p2$="YES"
  8564.             grmode_preserve%=1
  8565.           ELSE IF p2$="NO"
  8566.             grmode_preserve%=0
  8567.           ENDIF
  8568.         ELSE IF p$="GRMODE_SKIPXBRA"
  8569.           IF p2$="YES"
  8570.             grmode_skipxbra%=1
  8571.           ELSE
  8572.             grmode_skipxbra%=0
  8573.           ENDIF
  8574.         ELSE IF p$="GTLOGO_COLOR"
  8575.           graoumf_logo_color%=VAL(p2$)
  8576.         ELSE IF p$="PATTERN_LINE_MAX"
  8577.           haut_lig%=MIN(MAX(VAL(p2$) OR 1,1),99999)
  8578.           IF NOT first_time!
  8579.             haut_lig%=MIN(DIV(SUB(scr_haut%,180),6) OR 1,haut_lig%)
  8580.           ENDIF
  8581.         ELSE IF p$="INSTRUMENT"
  8582.           instr%=MIN(MAX(VAL(p2$),1),255)
  8583.         ELSE IF p$="SAMPLE"
  8584.           sample%=MIN(MAX(VAL(p2$),1),255)
  8585.         ELSE IF p$="LINE_STEP"
  8586.           IF p2$="NEXT LINE TAKEN"
  8587.             line_step%=256
  8588.           ELSE IF p2$="NEXT NOTE"
  8589.             line_step%=257
  8590.           ELSE IF p2$="NEXT FX"
  8591.             line_step%=258
  8592.           ELSE IF p2$="NEXT VOLUME"
  8593.             line_step%=259
  8594.           ELSE
  8595.             line_step%=MIN(MAX(VAL(p2$),-64),64)
  8596.           ENDIF
  8597.         ELSE IF p$="NUMBER_OF_TRACKS"
  8598.           IF first_time!
  8599.             nbr_track%=MIN(MAX(VAL(p2$),1),32)
  8600.           ENDIF
  8601.         ELSE IF p$="NUMBER_OF_LINES"
  8602.           IF first_time!
  8603.             nbr_lines%=MIN(MAX(VAL(p2$),1),256)
  8604.             default_pattern_high%=nbr_lines%
  8605.           ENDIF
  8606.         ELSE IF p$="PRESET"
  8607.           n_preset%=MIN(MAX(PRED(VAL(p2$)),0),31)
  8608.         ELSE IF p$="OCTAVE"
  8609.           octave%=MIN(MAX(PRED(VAL(p2$)),0),6)
  8610.         ELSE IF p$="MENU"
  8611.           IF p2$="DISK"
  8612.             ss_menu%=1
  8613.           ELSE IF p2$="TOOLS"
  8614.             ss_menu%=2
  8615.           ELSE IF p2$="INSTRUMENTS"
  8616.             ss_menu%=3
  8617.           ELSE IF p2$="SAMPLES"
  8618.             ss_menu%=4
  8619.           ELSE IF p2$="ENVELOPES"
  8620.             ss_menu%=5
  8621.           ELSE IF p2$="CONTROL"
  8622.             ss_menu%=6
  8623.           ELSE
  8624.             ss_menu%=MIN(MAX(VAL(p2$),1),5)
  8625.           ENDIF
  8626.         ELSE IF p$="NUMPAD"
  8627.           IF p2$="DRUMKIT"
  8628.             drumpad_flag%=1
  8629.           ELSE
  8630.             drumpad_flag%=0
  8631.           ENDIF
  8632.         ELSE IF p$="PATTERN_DISPLAY"
  8633.           type_affpiste%=MIN(MAX(VAL(p2$),0),2)
  8634.         ELSE IF p$="BLOCK_REPLACE"
  8635.           IF p2$="TRUE"
  8636.             replace_block%=1
  8637.           ELSE
  8638.             replace_block%=0
  8639.           ENDIF
  8640.           '
  8641.           ' Tools
  8642.           '
  8643.         ELSE IF p$="BLOCK_TYPE"
  8644.           IF p2$="PATTERN"
  8645.             trackpat%=1
  8646.           ELSE IF p2$="PRESET"
  8647.             trackpat%=2
  8648.           ELSE
  8649.             trackpat%=0
  8650.           ENDIF
  8651.         ELSE IF p$="BLOCK_SONG"
  8652.           IF p2$="TRUE"
  8653.             bl_flagsong!=TRUE
  8654.           ELSE
  8655.             bl_flagsong!=FALSE
  8656.           ENDIF
  8657.         ELSE IF p$="BLOCK_MASK"
  8658.           IF p2$="TRUE"
  8659.             maskblock%=1
  8660.           ELSE
  8661.             maskblock%=0
  8662.           ENDIF
  8663.         ELSE IF p$="BLOCK_MASK1"
  8664.           '
  8665.           '
  8666.           '
  8667.         ELSE IF p$="BLOCK_MASK2"
  8668.           '
  8669.           '
  8670.           '
  8671.         ELSE IF p$="TOOLS_ECHO_STEP"
  8672.           bl_echo_lines%=MIN(MAX(VAL(p2$),1),64)
  8673.         ELSE IF p$="TOOLS_ECHO_FDBKVAL"
  8674.           bl_echo_feedback%=MIN(MAX(VAL(p2$),0),100)
  8675.         ELSE IF p$="TOOLS_ECHO_FADESTEP"
  8676.           bl_echo_fadestep%=MIN(MAX(VAL(p2$),0),256)
  8677.         ELSE IF p$="TOOLS_ECHO_CONT"
  8678.           IF p2$="TRUE"
  8679.             bl_echo_cont!=TRUE
  8680.           ELSE
  8681.             bl_echo_cont!=FALSE
  8682.           ENDIF
  8683.         ELSE IF p$="TOOLS_ECHO_FEEDBACK"
  8684.           IF p2$="TRUE"
  8685.             bl_echo_fdbk!=TRUE
  8686.           ELSE
  8687.             bl_echo_fdbk!=FALSE
  8688.           ENDIF
  8689.         ELSE IF p$="NOTE_EXTENSION"
  8690.           '
  8691.           '
  8692.           '
  8693.           '
  8694.           ' Envelopes
  8695.           '
  8696.         ELSE IF p$="ENVELOPE"
  8697.           env_num&=MIN(MAX(VAL(p2$),1),64)
  8698.         ELSE IF p$="ENV_SECTION"
  8699.           IF p2$="KEYOFF"
  8700.             env_sect&=1
  8701.           ELSE
  8702.             env_sect&=0
  8703.           ENDIF
  8704.         ELSE IF p$="ENVELOPE_TYPE"
  8705.           IF p2$="TONE"
  8706.             ss_menue%=1
  8707.           ELSE IF p2$="PANNING"
  8708.             ss_menue%=2
  8709.           ELSE
  8710.             ss_menue%=0
  8711.           ENDIF
  8712.         ELSE IF p$="ENVELOPE_COPY"
  8713.           env_copy&=MIN(MAX(VAL(p2$),1),64)
  8714.           '
  8715.           '
  8716.           '
  8717.           '
  8718.           '
  8719.           ' Sample Editor
  8720.           ' -------------
  8721.         ELSE IF p$="SE_REVBUFFER"       ! sjx 08877 sampleeditor fast patch
  8722.           IF p2$="TRUE"
  8723.             se_revbuffer!=TRUE
  8724.           ELSE
  8725.             se_revbuffer!=FALSE
  8726.           ENDIF
  8727.         ELSE IF p$="KEEP_BUFFER"
  8728.           IF first_time!
  8729.             IF p2$="TRUE"
  8730.               flag_keep_buffer!=TRUE
  8731.             ELSE
  8732.               flag_keep_buffer!=FALSE
  8733.             ENDIF
  8734.           ENDIF
  8735.           '
  8736.           ' Mix
  8737.           '
  8738.         ELSE IF p$="MIX_MASTER_VOLUME"
  8739.           se.mix_master_volume%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8740.           '
  8741.           ' Record
  8742.           '
  8743.         ELSE IF p$="REC_INPUT_DEVICE"
  8744.           se.rec_input_device%=0
  8745.         ELSE IF p$="REC_CHANNEL"
  8746.           IF INSTR(p2$,"R")>0
  8747.             se.rec_canal%=2
  8748.             IF INSTR(p2$,"L")>0
  8749.               se.rec_canal%=3
  8750.             ENDIF
  8751.           ELSE
  8752.             se.rec_canal%=1
  8753.           ENDIF
  8754.         ELSE IF p$="REC_ADC_FREQUENCY"
  8755.           IF p2$="32780"
  8756.             se.rec_adc_freq%=2
  8757.           ELSE IF p2$="24585"
  8758.             se.rec_adc_freq%=3
  8759.           ELSE IF p2$="19668"
  8760.             se.rec_adc_freq%=4
  8761.           ELSE IF p2$="16390"
  8762.             se.rec_adc_freq%=5
  8763.           ELSE IF p2$="12292"
  8764.             se.rec_adc_freq%=7
  8765.           ELSE IF p2$="9834"
  8766.             se.rec_adc_freq%=9
  8767.           ELSE IF p2$="8195"
  8768.             se.rec_adc_freq%=11
  8769.           ELSE
  8770.           ENDIF
  8771.         ELSE IF p$="REC_EXT_FREQUENCY"
  8772.           se.rec_ext_freq%=MIN(MAX(VAL(p2$),2000),65000)
  8773.         ELSE IF p$="REC_TRIGGER"
  8774.           IF p2$="TRUE"
  8775.             se.rec_flag_trigger!=TRUE
  8776.           ELSE
  8777.             se.rec_flag_trigger!=FALSE
  8778.           ENDIF
  8779.         ELSE IF p$="REC_TRIGGER_LEVEL"
  8780.           se.rec_trigger%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8781.           '
  8782.           ' Frequency
  8783.           '
  8784.         ELSE IF p$="FREQ_NEW_SAMPLE_FREQ"
  8785.           se.freq_nfe%=MIN(MAX(VAL(p2$),2000),65000)
  8786.         ELSE IF p$="FREQ_OLD_NOTE_FREQ"+STR$(se.freq_ofn%)
  8787.           se.freq_ofn%=MIN(MAX(VAL(p2$),20),32500)
  8788.         ELSE IF p$="FREQ_NEW_NOTE_FREQ"+STR$(se.freq_nfn%)
  8789.           se.freq_nfn%=MIN(MAX(VAL(p2$),20),32500)
  8790.         ELSE IF p$="FREQ_INTERPOLATION"""
  8791.           IF p2$="LINEAR"
  8792.             se.freq_iptype%=1
  8793.           ELSE IF p2$="3RD DEGREE"
  8794.             se.freq_iptype%=2
  8795.           ELSE
  8796.             se.freq_iptype%=0
  8797.           ENDIF
  8798.         ELSE IF p$="FREQ_FFT_DISPLAY"
  8799.           IF p2$="LOGARITHMIC"
  8800.             se.freq_fftdisp%=1
  8801.           ELSE
  8802.             se.freq_fftdisp%=0
  8803.           ENDIF
  8804.         ELSE IF p$="FREQ_FFT_WINDOW"
  8805.           IF p2$="BLACKMAN"
  8806.             se.freq_fftwin%=1
  8807.           ELSE
  8808.             se.freq_fftwin%=0
  8809.           ENDIF
  8810.         ELSE IF p$="FREQ_FFT_NOTE_DISPLAY"
  8811.           IF p2$="FALSE"
  8812.             se.freq_fftnoteon!=FALSE
  8813.           ELSE
  8814.             se.freq_fftnoteon!=TRUE
  8815.           ENDIF
  8816.         ELSE IF p$="FREQ_FFT_NUM_OF_POINTS"
  8817.           se.freq_fft_pnbr%=MIN(MAX(VAL(p2$),1),1024)
  8818.           '
  8819.           ' Flanger
  8820.           '
  8821.         ELSE IF p$="FLANGER_DRY_LEVEL"
  8822.           se.flanger_dry%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8823.         ELSE IF p$="FLANGER_WET_LEVEL"
  8824.           se.flanger_wet%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8825.         ELSE IF p$="FLANGER_LEFT_SOURCE"
  8826.           se.flanger_lsource%=MIN(MAX(VAL(p2$),0),255)
  8827.         ELSE IF p$="FLANGER_RIGHT_SOURCE"
  8828.           se.flanger_rsource%=MIN(MAX(VAL(p2$),0),255)
  8829.         ELSE IF p$="FLANGER_DELAY"
  8830.           se.flanger_time%=MIN(MAX(VAL(p2$)*1000,0),10000)
  8831.         ELSE IF p$="FLANGER_FREQ"
  8832.           se.flanger_freq%=MIN(MAX(VAL(p2$)*1000,0),50000)
  8833.         ELSE IF p$="FLANGER_DEPTH"
  8834.           se.flanger_depth%=MIN(MAX(VAL(p2$)*1000,0),6350)
  8835.         ELSE IF p$="FLANGER_FDBK_L_L"
  8836.           se.flanger_fdbkll%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8837.         ELSE IF p$="FLANGER_FDBK_L_R"
  8838.           se.flanger_fdbklr%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8839.         ELSE IF p$="FLANGER_FDBK_R_R"
  8840.           se.flanger_fdbkrr%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8841.         ELSE IF p$="FLANGER_FDBK_R_L"
  8842.           se.flanger_fdbkrl%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8843.         ELSE IF p$="FLANGER_INIT_PHASE"
  8844.           se.flanger_phase%=DIV(VAL(p2$)*4096,360) AND 4095
  8845.         ELSE IF p$="FLANGER_WAVE_TYPE"
  8846.           IF p2$="SQUARE"
  8847.             se.flanger_wave%=1
  8848.           ELSE IF p2$="TRIANGLE"
  8849.             se.flanger_wave%=2
  8850.           ELSE IF p2$="RAMPDOWN"
  8851.             se.flanger_wave%=3
  8852.           ELSE IF p2$="RAMPUP"
  8853.             se.flanger_wave%=4
  8854.           ELSE
  8855.             se.flanger_wave%=0
  8856.           ENDIF
  8857.         ELSE IF p$="FLANGER_STEREO"
  8858.           IF p2$="TRUE"
  8859.             se.flanger_stereo!=TRUE
  8860.           ELSE
  8861.             se.flanger_stereo!=FALSE
  8862.           ENDIF
  8863.           '
  8864.           ' Delay
  8865.           '
  8866.         ELSE IF p$="DELAY_FLAGS"
  8867.           se.delay_flags%=VAL(p2$) AND &H1F
  8868.         ELSE IF p$="DELAY_FEEDBACK"
  8869.           se.delay_feedback%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8870.         ELSE IF p$="DELAY_FEEDTIME"
  8871.           se.delay_timefeed%=MIN(MAX(VAL(p2$),0),99999)
  8872.         ELSE IF p$="DELAY_DRYLEVEL"
  8873.           se.delay_dry%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8874.         ELSE IF p$="DELAY_WETLEVEL"
  8875.           se.delay_wet%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8876.         ELSE IF p$="DELAY_MUTE_IN"
  8877.           se.delay_mutein%=MIN(MAX(VAL(p2$),0),99999)
  8878.         ELSE IF p$="DELAY_SOURCE"
  8879.           se.delay_source%=MIN(MAX(VAL(p2$),0),255)
  8880.           '
  8881.           ' Reverberation
  8882.           '
  8883.         ELSE IF p$="REVERB_SOURCE"
  8884.           se.rev_source%=MIN(MAX(VAL(p2$),0),255)
  8885.         ELSE IF p$="REVERB_DRYLEVEL"
  8886.           se.rev_drylevel%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8887.         ELSE IF p$="REVERB_REVERBLEVEL"
  8888.           se.rev_revlevel%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8889.         ELSE IF p$="REVERB_EARLYREFLEVEL"
  8890.           se.rev_ereflevel%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8891.         ELSE IF p$="REVERB_NBRTAPS"
  8892.           se.rev_nbrtaps%=MIN(MAX(VAL(p2$),1),8)
  8893.         ELSE IF p$="REVERB_NBRCOMB"
  8894.           se.rev_nbrcomb%=MIN(MAX(VAL(p2$),1),16)
  8895.         ELSE IF p$="REVERB_COMBGAIN"
  8896.           se.rev_combgain%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8897.         ELSE IF p$="REVERB_APRLEVEL"
  8898.           se.rev_aprg%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8899.         ELSE IF p$="REVERB_APRDELAY"
  8900.           se.rev_aprdelay%=MIN(MAX(VAL(p2$),0),99999)
  8901.           '
  8902.           ' Song To Disk
  8903.           '
  8904.         ELSE IF p$="SONG2DISK_STARTPOS"
  8905.           se.s2d_posstart%=MAX(VAL(p2$),0)
  8906.         ELSE IF p$="SONG2DISK_STARTLINE"
  8907.           se.s2d_linestart%=MAX(VAL(p2$),0)
  8908.         ELSE IF p$="SONG2DISK_ENDPOS"
  8909.           se.s2d_posend%=MAX(VAL(p2$),0)
  8910.         ELSE IF p$="SONG2DISK_ENDLINE"
  8911.           se.s2d_lineend%=MAX(VAL(p2$),0)
  8912.         ELSE IF p$="SONG2DISK_OUTPUT"
  8913.           IF p2$="DISK"
  8914.             se.s2d_out%=2
  8915.           ELSE
  8916.             se.s2d_out%=1
  8917.           ENDIF
  8918.         ELSE IF p$="SONG2DISK_STEREO"
  8919.           IF p2$="STEREO"
  8920.             se.s2d_stereo%=2
  8921.           ELSE
  8922.             se.s2d_stereo%=1
  8923.           ENDIF
  8924.         ELSE IF p$="SONG2DISK_BITS"
  8925.           IF p2$="16"
  8926.             se.s2d_bits%=2
  8927.           ELSE
  8928.             se.s2d_bits%=1
  8929.           ENDIF
  8930.         ELSE IF p$="SONG2DISK_SPEED"
  8931.           se.s2d_lineend%=MIN(MAX(PRED(VAL(p2$)),0),7)
  8932.         ELSE IF p$="SONG2DISK_MAXLENGTH"
  8933.           se.s2d_maxsize%=MIN(MAX(VAL(p2$),1),4.1943E+06)
  8934.         ELSE IF p$="SONG2DISK_2NDTIME"
  8935.           IF p2$="TRUE"
  8936.             se.s2d_2ndtime!=TRUE
  8937.           ELSE
  8938.             se.s2d_2ndtime!=FALSE
  8939.           ENDIF
  8940.           '
  8941.           ' Compression
  8942.           '
  8943.         ELSE IF p$="COMP_SOURCE"
  8944.           se.comp_source%=MIN(MAX(VAL(p2$),0),255)
  8945.         ELSE IF p$="COMP_LEVEL"
  8946.           se.comp_level%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8947.         ELSE IF p$="COMP_SPEED"
  8948.           se.delay_timefeed%=MIN(MAX(VAL(p2$)*1000,0),99999)
  8949.           '
  8950.           ' Other stuff /sjx.
  8951.           '
  8952.         ELSE IF p$="USER_ID"
  8953.           user%=VAL(p2$)
  8954.           '
  8955.           ' (end)
  8956.           '
  8957.         ENDIF
  8958.       ENDIF
  8959.     ENDIF
  8960.   WEND
  8961.   CLOSE #0
  8962. RETURN
  8963. PROCEDURE load_prefs_analyse_touche(f$,t$)
  8964.   LOCAL a%,am%,ae%,bm%,be%,numero_fonction%,param%
  8965.   LOCAL parametre!,groupement!,trouve!
  8966.   LOCAL a$,code$,code1$,code2$
  8967.   '
  8968.   ' Un peu de menage
  8969.   '
  8970.   WHILE INSTR(f$,"  ")>0                        ! Vide les doubles-espaces
  8971.     a%=INSTR(f$,"  ")
  8972.     f$=LEFT$(f$,a%)+RIGHT$(f$,PRED(SUB(LEN(f$),a%)))
  8973.   WEND
  8974.   '
  8975.   WHILE INSTR(t$,"+")>0                         ! Vide les "+"
  8976.     a%=INSTR(t$,"+")
  8977.     t$=LEFT$(t$,PRED(a%))+RIGHT$(t$,SUB(LEN(t$),a%))
  8978.   WEND
  8979.   WHILE INSTR(t$,"  ")>0                        ! Vide les doubles-espaces
  8980.     a%=INSTR(t$,"  ")
  8981.     LET t$=LEFT$(t$,a%)+RIGHT$(t$,PRED(SUB(LEN(t$),a%)))
  8982.   WEND
  8983.   '
  8984.   ' Affectations
  8985.   '
  8986.   RESTORE keycode_names
  8987.   numero_fonction%=0
  8988.   trouve!=FALSE
  8989.   READ code$
  8990.   WHILE code$<>"***" AND NOT trouve!
  8991.     code1$=code$
  8992.     IF LEFT$(code$,1)="*"                       ! Un parametre ?
  8993.       code$=RIGHT$(code$,PRED(LEN(code$)))
  8994.       parametre!=TRUE
  8995.     ELSE
  8996.       parametre!=FALSE
  8997.     ENDIF
  8998.     IF LEFT$(code$,1)="^"                       ! Un groupement ?
  8999.       code$=RIGHT$(code$,PRED(LEN(code$)))
  9000.       groupement!=TRUE
  9001.     ELSE
  9002.       groupement!=FALSE
  9003.     ENDIF
  9004.     IF LEFT$(f$,LEN(code$))=code$               ! C'est le bon code
  9005.       IF parametre!
  9006.         f$=RIGHT$(f$,SUB(LEN(f$),LEN(code$)))   ! Recupere le parametre
  9007.         WHILE INSTR(f$," ")>0                   ! Enleve les espaces sinon c'est galere
  9008.           a%=INSTR(f$," ")
  9009.           f$=LEFT$(f$,PRED(a%))+RIGHT$(f$,SUB(LEN(f$),a%))
  9010.         WEND
  9011.         param%=VAL(f$)                          ! Hop on l'a!
  9012.       ELSE
  9013.         param%=0
  9014.       ENDIF
  9015.       '
  9016.       code2$=code1$                             ! Cherche si l'emplacement est libre
  9017.       WHILE BYTE{ADD(V:dejafait_touche$,numero_fonction%)}<>0 AND code2$=code1$ AND code2$<>"***"
  9018.         READ code2$                             ! Sinon trouve dans la meme serie un autre emplacement
  9019.         INC numero_fonction%
  9020.       WEND
  9021.       IF code2$=code1$                          ! Si c'est bon...
  9022.         GOSUB cherche_combinaison_touches(t$,am%,ae%,bm%,be%)
  9023.         keydef_val%(0,numero_fonction%)=ae%
  9024.         keydef_val%(1,numero_fonction%)=be%
  9025.         keydef_mask%(0,numero_fonction%)=am%
  9026.         keydef_mask%(1,numero_fonction%)=bm%
  9027.         keydef_param%(numero_fonction%)=param%
  9028.         BYTE{ADD(V:dejafait_touche$,numero_fonction%)}=1
  9029.         trouve!=TRUE
  9030.       ENDIF
  9031.     ENDIF
  9032.     INC numero_fonction%
  9033.     READ code$
  9034.   WEND
  9035. RETURN
  9036. PROCEDURE save_prefs
  9037.   LOCAL a$
  9038.   IF flag_registered!
  9039.     IF km%=2 AND nfile_prefs$<>""
  9040.       a$=npath_prefs$+nfile_prefs$
  9041.     ELSE
  9042.       CLS
  9043.       GOSUB cadre_texte("SAVE PREFERENCES",0,0,PRED(scr_ncol%))
  9044.       GOSUB sjx_system_to_gem
  9045.       FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  9046.       GOSUB sjx_system_to_gtk
  9047.     ENDIF
  9048.     IF a$<>""
  9049.       CLS
  9050.       GOSUB cadre_texte("WAITING : SAVING PREFERENCES "+a$+"...",0,0,PRED(scr_ncol%))
  9051.       GOSUB save_prefs2(a$)
  9052.       GOSUB separe_nom_chemin(a$)
  9053.       nfile_prefs$=nfile_$
  9054.       npath_prefs$=npath_$
  9055.     ENDIF
  9056.   ELSE
  9057.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  9058.   ENDIF
  9059.   GOSUB affiche_panneau_principal
  9060. RETURN
  9061. PROCEDURE save_prefs2(fic$)
  9062.   LOCAL i%,j%,n%
  9063.   LOCAL a$,b$,lig$,old$
  9064.   LOCAL param!,groupement!
  9065.   OPEN "o",#0,fic$
  9066.   PRINT #0,";*****************************************************************************"
  9067.   PRINT #0,";*                                                                           *"
  9068.   PRINT #0,";*                              GRAOUMF TRACKER                              *"
  9069.   PRINT #0,";*                        by Laurent de Soras 1994-95                        *"
  9070.   PRINT #0,";*                                                                           *"
  9071.   PRINT #0,";*                              Preference file                              *"
  9072.   PRINT #0,";*                          Last update: "+LEFT$(DATE$+"  ",10)+"                          *"
  9073.   PRINT #0,";*                                                                           *"
  9074.   PRINT #0,";*****************************************************************************"
  9075.   PRINT #0,"; Tab = 8"
  9076.   PRINT #0
  9077.   PRINT #0,"; Text following a "";"" is a comment and ignored by Graoumf Tracker."
  9078.   PRINT #0,"; In the file names, a ""/"" means no file."
  9079.   PRINT #0,"; ""$"" means the value is in hexadecimal."
  9080.   PRINT #0
  9081.   PRINT #0
  9082.   PRINT #0
  9083.   '
  9084.   '
  9085.   '
  9086.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9087.   '
  9088.   PRINT #0,";============================================================================;"
  9089.   PRINT #0,";                       Keyboard                                             ;"
  9090.   PRINT #0,";============================================================================;"
  9091.   PRINT #0
  9092.   lig$="keyboard_type = "+FN get_elt_in_list$("azerty,qwerty",keyboard_type%)
  9093.   GOSUB write_comment("azerty or qwerty")
  9094.   lig$="keyboard_buffer = "+FN offon$(flag_keyboard_buffer!)
  9095.   GOSUB write_comment("Keep pressed keys in memory")
  9096.   PRINT #0
  9097.   PRINT #0,"; Names of available keys:"
  9098.   PRINT #0,";   a-z, esc, tab, space, return, backspace, help, undo, ins, del, clr"
  9099.   PRINT #0,";   up, down, left, right, F1-F10, <, #, &, 1, pad0, padpoint, nokey"
  9100.   PRINT #0,"; This keys are considered as groups:"
  9101.   PRINT #0,";   fkeys, numpad"
  9102.   PRINT #0,"; Following keys can be combined with others:"
  9103.   PRINT #0,";   shift (left or right), lshift, rshift, ctrl, alt, caps, nocaps"
  9104.   PRINT #0,"; You can define two combinations, separated by ""/""."
  9105.   PRINT #0
  9106.   old$=""
  9107.   RESTORE keycode_names
  9108.   FOR i%=0 TO 84                                ! sjx - VSLD
  9109.     ' Nom de la fonction
  9110.     READ a$
  9111.     FOR j%=0 TO PRED(LEN(a$))                   ! Conversion en minuscules
  9112.       a%=BYTE{ADD(V:a$,j%)}
  9113.       IF a%>=65 AND a%<91
  9114.         BYTE{ADD(V:a$,j%)}=a% OR &H20
  9115.       ENDIF
  9116.     NEXT j%
  9117.     IF a$=old$
  9118.       INC n%
  9119.     ELSE
  9120.       n%=1
  9121.     ENDIF
  9122.     old$=a$
  9123.     ' Attributs
  9124.     IF LEFT$(a$,1)="*"
  9125.       param!=TRUE
  9126.       a$=RIGHT$(a$,PRED(LEN(a$)))
  9127.     ELSE
  9128.       param!=FALSE
  9129.     ENDIF
  9130.     IF LEFT$(a$,1)="^"
  9131.       groupement!=TRUE
  9132.       a$=RIGHT$(a$,PRED(LEN(a$)))
  9133.     ELSE
  9134.       groupement!=FALSE
  9135.     ENDIF
  9136.     lig$=a$
  9137.     ' Parametre
  9138.     IF param!
  9139.       IF keydef_val%(0,i%)=0                    ! Touche non definie
  9140.         b$="n"
  9141.         IF groupement!
  9142.           b$=b$+STR$(n%)
  9143.         ENDIF
  9144.       ELSE
  9145.         b$=STR$(keydef_param%(i%))
  9146.       ENDIF
  9147.       SELECT i%
  9148.       CASE 45 TO 54                             ! Ne met pas de "+" sur les lines
  9149.         lig$=lig$+b$
  9150.       DEFAULT
  9151.         IF b$<>"0"
  9152.           lig$=lig$+" + "+b$
  9153.         ENDIF
  9154.       ENDSELECT
  9155.     ENDIF
  9156.     lig$="keydef"+CHR$(9)+lig$+STRING$(MAX(SUCC(DIV(SUB(31,LEN(lig$)),8)),1),9)  ! Tab a la 41eme colonne
  9157.     ' Nom des touches
  9158.     lig$=lig$+"= "+FN donne_combinaison_touche$(keydef_mask%(0,i%),keydef_val%(0,i%),keydef_mask%(1,i%),keydef_val%(1,i%))
  9159.     ' Groupement
  9160.     IF groupement!
  9161.       lig$=lig$+CHR$(9)+"; Group"
  9162.     ENDIF
  9163.     ' Ligne terminee
  9164.     PRINT #0,lig$
  9165.   NEXT i%
  9166.   PRINT #0
  9167.   PRINT #0
  9168.   PRINT #0
  9169.   '
  9170.   '
  9171.   '
  9172.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9173.   '
  9174.   PRINT #0,";============================================================================;"
  9175.   PRINT #0,";                       Main pannel                                          ;"
  9176.   PRINT #0,";============================================================================;"
  9177.   PRINT #0
  9178.   lig$="system_memory = "+STR$(system_memory%)
  9179.   GOSUB write_comment("Memory for the system (bytes). Min: 16384")
  9180.   lig$="color_pal ="
  9181.   FOR i%=0 TO 15
  9182.     lig$=lig$+" "+HEX$(SHR(PEEK(ADD(&HFFFF9800,SHL(i%,2))),4),1)
  9183.     lig$=lig$+HEX$(SHR(PEEK(ADD(&HFFFF9801,SHL(i%,2))),4),1)
  9184.     lig$=lig$+HEX$(SHR(PEEK(ADD(&HFFFF9803,SHL(i%,2))),4),1)
  9185.   NEXT i%
  9186.   PRINT #0,lig$
  9187.   lig$="grmode_overscan = "+FN get_elt_in_list$("leave,no,yes",SUCC(grmode_overscan%))
  9188.   GOSUB write_comment("yes, no, leave")
  9189.   lig$="grmode_80col = "+FN get_elt_in_list$("leave,no,yes",SUCC(grmode_80colonnes%))
  9190.   GOSUB write_comment("yes, no, leave")
  9191.   lig$="grmode_400lines = "+FN get_elt_in_list$("leave,no,yes",SUCC(grmode_entrelace%))
  9192.   GOSUB write_comment("yes, no, leave")
  9193.   lig$="grmode_preserve = "+FN get_elt_in_list$("no,yes",grmode_preserve%)
  9194.   GOSUB write_comment("yes, no")
  9195.   lig$="grmode_skipxbra = "+FN get_elt_in_list$("no,yes",grmode_skipxbra%)
  9196.   GOSUB write_comment("yes, no")
  9197.   lig$=""
  9198.   PRINT #0,"gtlogo_color = "+STR$(graoumf_logo_color%)
  9199.   GOSUB write_comment("RGB for 16 colors")
  9200.   lig$="number_of_tracks = "+STR$(nbr_track%)
  9201.   GOSUB write_comment("1-32")
  9202.   lig$="number_of_lines = "+STR$(default_pattern_high%)
  9203.   GOSUB write_comment("1-255 (default length of pattern)")
  9204.   lig$="instrument = "+STR$(instr%)
  9205.   GOSUB write_comment("1-255")
  9206.   lig$="sample = "+STR$(sample%)
  9207.   GOSUB write_comment("1-255")
  9208.   lig$="preset = "+STR$(n_preset%)
  9209.   GOSUB write_comment("1-32")
  9210.   lig$="line_step = "
  9211.   SELECT line_step%
  9212.   CASE -255 TO 255
  9213.     lig$=lig$+STR$(line_step%)
  9214.   CASE 256
  9215.     lig$=lig$+"next line taken"
  9216.   CASE 257
  9217.     lig$=lig$+"next note"
  9218.   CASE 258
  9219.     lig$=lig$+"next FX"
  9220.   CASE 259
  9221.     lig$=lig$+"next volume"
  9222.   ENDSELECT
  9223.   GOSUB write_comment("Jump n-1 lines when entering a note")
  9224.   lig$="octave = "+STR$(SUCC(octave%))
  9225.   GOSUB write_comment("1-7")
  9226.   lig$="pattern_display = "+STR$(type_affpiste%)
  9227.   GOSUB write_comment("0 (without effect), 1 (normal) or 2 (with")
  9228.   GOSUB write_comment("volume column)")
  9229.   a%=DIV(SUB(scr_haut%,180),6) OR 1
  9230.   IF a%=haut_lig%
  9231.     a%=99999
  9232.   ELSE
  9233.     a%=haut_lig%
  9234.   ENDIF
  9235.   lig$="pattern_line_max = "+STR$(a%)
  9236.   GOSUB write_comment("Maximum number of lines displayed on screen.")
  9237.   GOSUB write_comment("99999 (or very high #) = resolution limit.")
  9238.   lig$="numpad = "+FN get_elt_in_list$("samples,drumkit",drumpad_flag%)
  9239.   GOSUB write_comment("samples, drumkit")
  9240.   lig$="menu = "+FN get_elt_in_list$("disk,tools,instruments,samples,envelopes",PRED(ss_menu%))
  9241.   GOSUB write_comment("disk, tools, instruments, samples, envelopes, control")
  9242.   PRINT #0
  9243.   '
  9244.   '
  9245.   '
  9246.   PRINT #0,";-----------------------------------------------------------------------------"
  9247.   PRINT #0,"; Disk"
  9248.   PRINT #0,";------"
  9249.   PRINT #0
  9250.   lig$=";program_path = "+npath_prog$
  9251.   GOSUB write_comment("Path of GTPLAY.PGT and DUMTRACK.PGT. Usually")
  9252.   GOSUB write_comment("unused.")
  9253.   PRINT #0,"module_path = "+npath_module$
  9254.   PRINT #0,"sample_path = "+npath_sample$
  9255.   PRINT #0,"autoload_path = "+npath_autoload$
  9256.   PRINT #0,"pref_path = "+npath_prefs$
  9257.   PRINT #0,"misc_path = "+npath_div$
  9258.   PRINT #0
  9259.   PRINT #0,"module_ext = "+next_module$
  9260.   PRINT #0,"sample_ext = "+next_sample$
  9261.   PRINT #0
  9262.   PRINT #0,"module_file = ";
  9263.   IF nfile_module$<>""
  9264.     PRINT #0,nfile_module$
  9265.   ELSE
  9266.     PRINT #0,"/"
  9267.   ENDIF
  9268.   PRINT #0,"sample_file = ";
  9269.   IF nfile_sample$<>""
  9270.     PRINT #0,nfile_sample$
  9271.   ELSE
  9272.     PRINT #0,"/"
  9273.   ENDIF
  9274.   PRINT #0,"autoload_file = ";
  9275.   IF nfile_autoload$<>""
  9276.     PRINT #0,nfile_autoload$
  9277.   ELSE
  9278.     PRINT #0,"/"
  9279.   ENDIF
  9280.   PRINT #0,"pref_file = ";
  9281.   IF nfile_prefs$<>""
  9282.     PRINT #0,nfile_prefs$
  9283.   ELSE
  9284.     PRINT #0,"/"
  9285.   ENDIF
  9286.   PRINT #0
  9287.   PRINT #0,"save_config_gt2 = "+FN falsetrue$(flag_gt2cnf!)
  9288.   PRINT #0,"module_backup = "+FN falsetrue$(flag_backup_modules!)
  9289.   PRINT #0
  9290.   '
  9291.   '
  9292.   '
  9293.   PRINT #0,";-----------------------------------------------------------------------------"
  9294.   PRINT #0,"; Tools"
  9295.   PRINT #0,";-------"
  9296.   PRINT #0
  9297.   lig$="block_type = "+FN get_elt_in_list$("track,pattern,preset",trackpat%)
  9298.   GOSUB write_comment("track, pattern, preset")
  9299.   lig$="block_song = "+FN falsetrue$(bl_flagsong!)
  9300.   GOSUB write_comment("If it's on the whole song or just 1 pattern")
  9301.   PRINT #0,"block_replace = "+FN falsetrue$(replaceblock%)
  9302.   PRINT #0,"block_mask = "+FN falsetrue$(maskblock%)
  9303.   ' block_mask1 = ??? ?? ???? ??    ; * Not implemented *
  9304.   ' block_mask2 = ??? ?? ???? ??    ; * Not implemented *
  9305.   lig$="tools_echo_step = "+STR$(bl_echo_lines%)
  9306.   GOSUB write_comment("1-64")
  9307.   lig$="tools_echo_fdbkval = "+STR$(bl_echo_feedback%)
  9308.   GOSUB write_comment("Feedback value (0-100 per cent)")
  9309.   lig$="tools_echo_fadestep = "+STR$(bl_echo_fadestep%)
  9310.   GOSUB write_comment("0-255")
  9311.   PRINT #0,"tools_echo_cont = "+FN falsetrue$(bl_echo_cont!)
  9312.   lig$="tools_echo_feedback = "+FN falsetrue$(bl_echo_fdbk!)
  9313.   GOSUB write_comment("Feedback (logarithmic fade) or linear fade")
  9314.   PRINT #0
  9315.   ' note_extension = ???? ??    ; * Not implemented *
  9316.   PRINT #0
  9317.   '
  9318.   '
  9319.   '
  9320.   PRINT #0,";-----------------------------------------------------------------------------"
  9321.   PRINT #0,"; Envelopes"
  9322.   PRINT #0,";-----------"
  9323.   PRINT #0
  9324.   lig$="envelope = "+STR$(env_num&)
  9325.   GOSUB write_comment("1-64")
  9326.   lig$="env_section = "+FN get_elt_in_list$("attack,keyoff",env_sect&)
  9327.   GOSUB write_comment("attack, keyoff")
  9328.   lig$="envelope_type = "+FN get_elt_in_list$("volume,tone,panning",ss_menue%)
  9329.   GOSUB write_comment("volume, tone, panning")
  9330.   lig$="envelope_copy = "+STR$(env_copy&)
  9331.   GOSUB write_comment("1-64")
  9332.   PRINT #0
  9333.   '
  9334.   '
  9335.   '
  9336.   PRINT #0,";-----------------------------------------------------------------------------"
  9337.   PRINT #0,"; MIDI"
  9338.   PRINT #0,";------"
  9339.   PRINT #0
  9340.   PRINT #0,"midi_in = "+FN falsetrue$(midi_flag_data_in!)
  9341.   lig$="midi_sync = "+FN get_elt_in_list$("none,in,out",midi_flag_synchro%)
  9342.   GOSUB write_comment("none, in, out")
  9343.   ' PRINT #0,"midi_in_note_off = "+FN falsetrue$(midi_flag_note_off!)
  9344.   ' PRINT #0,"midi_in_velocity = "+FN falsetrue$(midi_flag_velocity!)
  9345.   PRINT #0,"midi_in_polyphonic = "+FN falsetrue$(midi_polyphonic_mode!)
  9346.   PRINT #0
  9347.   PRINT #0
  9348.   PRINT #0
  9349.   '
  9350.   '
  9351.   '
  9352.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9353.   '
  9354.   PRINT #0,";============================================================================;"
  9355.   PRINT #0,";                       Sample Editor                                        ;"
  9356.   PRINT #0,";============================================================================;"
  9357.   PRINT #0
  9358.   lig$="se_revbuffer = "+FN falsetrue$(se_revbuffer!)
  9359.   GOSUB write_comment("true - old behaviour, slow going into/out of")
  9360.   GOSUB write_comment("the sample editor - false, default, fast!")
  9361.   lig$="keep_buffer = "+FN falsetrue$(flag_keep_buffer!)
  9362.   GOSUB write_comment("true: keep better the buffer when loading")
  9363.   GOSUB write_comment("a module (but it's slower)")
  9364.   PRINT #0
  9365.   '
  9366.   '
  9367.   '
  9368.   PRINT #0,";-----------------------------------------------------------------------------"
  9369.   PRINT #0,"; Mix"
  9370.   PRINT #0,";-----"
  9371.   PRINT #0
  9372.   lig$="mix_master_volume = "+FN pourcent$(se.mix_master_volume%,32768)
  9373.   GOSUB write_comment("%")
  9374.   PRINT #0
  9375.   '
  9376.   '
  9377.   '
  9378.   PRINT #0,";-----------------------------------------------------------------------------"
  9379.   PRINT #0,"; Frequency"
  9380.   PRINT #0,";-----------"
  9381.   PRINT #0
  9382.   lig$="freq_new_sample_freq = "+STR$(se.freq_nfe%)
  9383.   GOSUB write_comment("Hz")
  9384.   lig$="freq_old_note_freq = "+STR$(se.freq_ofn%)
  9385.   GOSUB write_comment("Hz")
  9386.   lig$="freq_new_note_freq = "+STR$(se.freq_nfn%)
  9387.   GOSUB write_comment("Hz")
  9388.   lig$="freq_interpolation = "+FN get_elt_in_list$("none,linear,3rd degree",se.freq_iptype%)
  9389.   GOSUB write_comment("none, linear")
  9390.   lig$="freq_fft_display = "+FN get_elt_in_list$("linear,logarithmic",se.freq_fftdisp%)
  9391.   GOSUB write_comment("linear, logarithmic")
  9392.   lig$="freq_fft_window = "+FN get_elt_in_list$("rectangle,Blackman",se.freq_fftwin%)
  9393.   GOSUB write_comment("rectangle, Blackman")
  9394.   PRINT #0,"freq_fft_note_display = "+FN falsetrue$(se.freq_fftnoteon!)
  9395.   lig$="freq_fft_num_of_points = "+STR$(se.freq_fft_pnbr%)
  9396.   GOSUB write_comment("1-1024")
  9397.   PRINT #0
  9398.   '
  9399.   '
  9400.   '
  9401.   PRINT #0,";-----------------------------------------------------------------------------"
  9402.   PRINT #0,"; Flanger"
  9403.   PRINT #0,";---------"
  9404.   PRINT #0
  9405.   lig$="flanger_dry_level = "+FN pourcent$(se.flanger_dry%,32768)
  9406.   GOSUB write_comment("%")
  9407.   lig$="flanger_wet_level = "+FN pourcent$(se.flanger_wet%,32768)
  9408.   GOSUB write_comment("%")
  9409.   lig$="flanger_left_source = "
  9410.   IF se.flanger_lsource%=0
  9411.     lig$=lig$+"buffer"
  9412.   ELSE
  9413.     lig$=lig$+STR$(se.flanger_lsource%)
  9414.   ENDIF
  9415.   GOSUB write_comment("Left source: buffer or sample # (1-255)")
  9416.   lig$="flanger_right_source = "
  9417.   IF se.flanger_rsource%=0
  9418.     lig$=lig$+"buffer"
  9419.   ELSE
  9420.     lig$=lig$+STR$(se.flanger_rsource%)
  9421.   ENDIF
  9422.   GOSUB write_comment("Right source: buffer or sample # (1-255)")
  9423.   lig$="flanger_delay = "+STR$(se.flanger_time%/1000)
  9424.   GOSUB write_comment("Flanger delay (ms). Maximum: 10 ms")
  9425.   lig$="flanger_freq = "+STR$(se.flanger_freq%/1000)
  9426.   GOSUB write_comment("Flanger LFO frequency (Hz). Maximum: 50 Hz")
  9427.   lig$="flanger_depth = "+STR$(se.flanger_depth%/1000)
  9428.   GOSUB write_comment("Flanger depth (ms). Maximum: 6.35 ms")
  9429.   lig$="flanger_fdbk_l_l = "+FN pourcent$(se.flanger_fdbkll%,32768)
  9430.   GOSUB write_comment("Feedback Left -> Left (%)")
  9431.   lig$="flanger_fdbk_l_r = "+FN pourcent$(se.flanger_fdbklr%,32768)
  9432.   GOSUB write_comment("Feedback Left -> Right (%)")
  9433.   lig$="flanger_fdbk_r_r = "+FN pourcent$(se.flanger_fdbkrr%,32768)
  9434.   GOSUB write_comment("Feedback Right -> Right (%)")
  9435.   lig$="flanger_fdbk_r_l = "+FN pourcent$(se.flanger_fdbkrl%,32768)
  9436.   GOSUB write_comment("Feedback Right -> Left (%)")
  9437.   lig$="flanger_init_phase = "+STR$(MUL(se.flanger_phase%,360)/4096)
  9438.   GOSUB write_comment("Initial phase (0-359°)")
  9439.   lig$="flanger_wave_type = "+FN get_elt_in_list$("sin,square,triangle,rampdown,rampup",se.flanger_wave%)
  9440.   GOSUB write_comment("sin, square, triangle, rampdown or rampup")
  9441.   lig$="flanger_stereo = "+FN falsetrue$(se.flanger_stereo!)
  9442.   GOSUB write_comment("false = mono, true = stereo")
  9443.   PRINT #0
  9444.   '
  9445.   '
  9446.   '
  9447.   PRINT #0,";-----------------------------------------------------------------------------"
  9448.   PRINT #0,"; Delay"
  9449.   PRINT #0,";-------"
  9450.   PRINT #0
  9451.   lig$="delay_flags = "+STR$(se.delay_flags%)
  9452.   GOSUB write_comment("+1: Tap 1 on, +2: Tap 2 on, +4: Tap 3 on, +8: Tap 4 on, +16: Mute in, +32: Multi-tap mode")
  9453.   lig$="delay_feedback = "+FN pourcent$(se.delay_feedback%,32768)
  9454.   GOSUB write_comment("%")
  9455.   lig$="delay_feedtime = "+STR$(se.delay_timefeed%)
  9456.   GOSUB write_comment("(ms)")
  9457.   lig$="delay_drylevel = "+FN pourcent$(se.delay_dry%,32768)
  9458.   GOSUB write_comment("%")
  9459.   lig$="delay_wetlevel = "+FN pourcent$(se.delay_wet%,32768)
  9460.   GOSUB write_comment("%")
  9461.   lig$="delay_mute_in = "+STR$(se.delay_mutein%)
  9462.   GOSUB write_comment("(ms)")
  9463.   lig$="delay_source = "
  9464.   IF se.delay_source%=0
  9465.     lig$=lig$+"buffer"
  9466.   ELSE
  9467.     lig$=lig$+STR$(se.delay_source%)
  9468.   ENDIF
  9469.   GOSUB write_comment("Source: buffer or sample # (1-255)")
  9470.   PRINT #0
  9471.   '
  9472.   '
  9473.   '
  9474.   PRINT #0,";-----------------------------------------------------------------------------"
  9475.   PRINT #0,"; Reverberation"
  9476.   PRINT #0,";---------------"
  9477.   PRINT #0
  9478.   lig$="reverb_source = "
  9479.   IF se.rev_source%=0
  9480.     lig$=lig$+"buffer"
  9481.   ELSE
  9482.     lig$=lig$+STR$(se.rev_source%)
  9483.   ENDIF
  9484.   GOSUB write_comment("Source: buffer or sample # (1-255)")
  9485.   lig$="reverb_drylevel = "+FN pourcent$(se.rev_drylevel%,32768)
  9486.   GOSUB write_comment("%")
  9487.   lig$="reverb_reverblevel = "+FN pourcent$(se.rev_revlevel%,32768)
  9488.   GOSUB write_comment("%")
  9489.   lig$="reverb_earlyreflevel = "+FN pourcent$(se.rev_ereflevel%,32768)
  9490.   GOSUB write_comment("Early reflection level (%)")
  9491.   lig$="reverb_nbrtaps = "+STR$(se.rev_nbrtaps%)
  9492.   GOSUB write_comment("Nbr of taps for early reflection (1-16)")
  9493.   lig$="reverb_nbrcomb = "+STR$(se.rev_nbrcomb%)
  9494.   GOSUB write_comment("Nbr of comb filters (1-8)")
  9495.   lig$="reverb_combgain = "+FN pourcent$(se.rev_combgain%,32768)
  9496.   GOSUB write_comment("%")
  9497.   lig$="reverb_aprlevel = "+FN pourcent$(se.rev_aprg%,32768)
  9498.   GOSUB write_comment("All Pass Reverb level (%)")
  9499.   lig$="reverb_aprdelay = "+STR$(se.rev_aprdelay%)
  9500.   GOSUB write_comment("All Pass Reverb delay (ms)")
  9501.   PRINT #0
  9502.   '
  9503.   '
  9504.   '
  9505.   PRINT #0,";-----------------------------------------------------------------------------"
  9506.   PRINT #0,"; Song To Disk"
  9507.   PRINT #0,";--------------"
  9508.   PRINT #0
  9509.   lig$="song2disk_startpos = $"+HEX$(se.s2d_posstart%)
  9510.   GOSUB write_comment("Start position")
  9511.   lig$="song2disk_startline = $"+HEX$(se.s2d_ligstart%)
  9512.   GOSUB write_comment("Start line")
  9513.   lig$="song2disk_endpos = $"+HEX$(se.s2d_posend%)
  9514.   GOSUB write_comment("End position")
  9515.   lig$="song2disk_endline = $"+HEX$(se.s2d_ligend%)
  9516.   GOSUB write_comment("End line")
  9517.   lig$="song2disk_output = "+FN get_elt_in_list$("block,disk",PRED(se.s2d_out%))
  9518.   GOSUB write_comment("block, disk")
  9519.   lig$="song2disk_stereo = "+FN get_elt_in_list$("mono,stereo",PRED(se.s2d_stereo%))
  9520.   GOSUB write_comment("mono, stereo")
  9521.   lig$="song2disk_bits = "+STR$(MUL(se.s2d_bits%,8))
  9522.   GOSUB write_comment("Resolution (8 or 16 bits)")
  9523.   lig$="song2disk_speed = "+STR$(SUCC(se.s2d_speed%))
  9524.   GOSUB write_comment("Speed (1 = fast, 8 = low)")
  9525.   lig$="song2disk_maxlength = "+STR$(se.s2d_maxsize%)
  9526.   GOSUB write_comment("Kb")
  9527.   ' PRINT #0,"song2disk_2ndtime = "+fn falsetrue$(se.s2d_2ndtime!)
  9528.   PRINT #0
  9529.   '
  9530.   '
  9531.   '
  9532.   PRINT #0,";-----------------------------------------------------------------------------"
  9533.   PRINT #0,"; Compression"
  9534.   PRINT #0,";-------------"
  9535.   PRINT #0
  9536.   lig$="comp_source = "
  9537.   IF se.comp_source%=0
  9538.     lig$=lig$+"buffer"
  9539.   ELSE
  9540.     lig$=lig$+STR$(se.comp_source%)
  9541.   ENDIF
  9542.   GOSUB write_comment("Source: buffer or sample # (1-255)")
  9543.   lig$="comp_level = "+FN pourcent$(se.comp_level%,32768)
  9544.   GOSUB write_comment("%")
  9545.   lig$="comp_speed = "+STR$(se.comp_speed%/1000)
  9546.   GOSUB write_comment("(ms)")
  9547.   PRINT #0
  9548.   PRINT #0
  9549.   PRINT #0
  9550.   '
  9551.   '
  9552.   '
  9553.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9554.   '
  9555.   PRINT #0,";-----------------------------------------------------------------------------"
  9556.   PRINT #0,"; End of file"
  9557.   CLOSE #0
  9558. RETURN
  9559. PROCEDURE write_comment(a$)
  9560.   ' Ecrit sur le fichier #0 un commentaire au bout de la variable lig$
  9561.   ' Utilise et modifie lig$
  9562.   ' Tab a la 33eme colonne
  9563.   lig$=lig$+STRING$(MAX(SUCC(DIV(SUB(31,LEN(lig$)),8)),1),9)
  9564.   lig$=lig$+"; "+a$
  9565.   PRINT #0,lig$
  9566.   lig$=""
  9567. RETURN
  9568. PROCEDURE autoload
  9569.   ' Autochargement de modules/samples
  9570.   ' Module
  9571.   LOCAL i%,sample%,erreur%
  9572.   LOCAL cat$,a$,baze$,masque_fichier$,dta$
  9573.   ~FRE(0)
  9574.   SHOWM
  9575.   GOSUB bee(TRUE)
  9576.   flag_autoload!=TRUE
  9577.   dta$=STRING$(44,0)
  9578.   masque_fichier$=npath_autoload$+next_module$+CHR$(0)
  9579.   ~FRE(0)
  9580.   ~GEMDOS(&H1A,L:V:dta$)
  9581.   IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  9582.     baze$=""
  9583.     i%=ADD(V:dta$,30)
  9584.     WHILE PEEK(i%)<>0
  9585.       baze$=baze$+CHR$(PEEK(i%))
  9586.       INC i%
  9587.     WEND
  9588.     a$=npath_autoload$+baze$
  9589.     GOSUB aff_message("WAITING : AUTOLOADING MODULE "+a$)
  9590.     GOSUB load_module2
  9591.     IF play%=1
  9592.       GOSUB play_song(TRUE)
  9593.     ELSE IF play%=2
  9594.       GOSUB play_pattern(TRUE)
  9595.     ELSE
  9596.       GOSUB stop_voices
  9597.     ENDIF
  9598.     IF erreur%>0
  9599.       GOSUB separe_nom_chemin(a$)
  9600.       npath_module$=npath_$
  9601.       nfile_module$=nfile_$
  9602.     ENDIF
  9603.     IF ss_menu%=1
  9604.       GOSUB affiche_icones_diskb
  9605.     ENDIF
  9606.     GOSUB affiche_info_song
  9607.     GOSUB affiche_info_sample
  9608.     GOSUB affiche_info_preset
  9609.     GOSUB affiche_c_pattern
  9610.   ENDIF
  9611.   ' Samples
  9612.   masque_fichier$=npath_autoload$+next_sample$+CHR$(0)
  9613.   ~GEMDOS(&H1A,L:V:dta$)
  9614.   IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  9615.     cat$=""
  9616.     REPEAT
  9617.       baze$=""
  9618.       i%=ADD(V:dta$,30)
  9619.       WHILE PEEK(i%)<>0
  9620.         baze$=baze$+CHR$(PEEK(i%))
  9621.         INC i%
  9622.       WEND
  9623.       cat$=cat$+baze$+CHR$(0)
  9624.     UNTIL LEN(cat$)>32000 OR GEMDOS(&H4F)<0
  9625.     sample%=1
  9626.     REPEAT
  9627.       IF FN length(sample%)=0     ! Trouve une place pour charger
  9628.         i%=INSTR(cat$,CHR$(0))
  9629.         baze$=LEFT$(cat$,PRED(i%))
  9630.         a$=npath_autoload$+baze$
  9631.         cat$=RIGHT$(cat$,SUB(LEN(cat$),i%))
  9632.         GOSUB aff_message("WAITING : AUTOLOADING SAMPLE "+a$)
  9633.         GOSUB load_sample2(FALSE)
  9634.         IF erreur%=1
  9635.           GOSUB aff_message("NOT ENOUGH MEMORY TO LOAD THIS SAMPLE !")
  9636.           IF FN length(sample%)<>0
  9637.             GOSUB affiche_info_sample
  9638.             INC sample%
  9639.           ENDIF
  9640.         ENDIF
  9641.       ELSE
  9642.         GOSUB affiche_info_sample
  9643.         INC sample%
  9644.       ENDIF
  9645.     UNTIL sample%=256 OR LEN(cat$)=0
  9646.     sample%=1
  9647.     GOSUB affiche_info_sample
  9648.   ENDIF
  9649. fin_autoload:
  9650.   flag_autoload!=FALSE
  9651.   GOSUB bee(FALSE)
  9652.   SHOWM
  9653. RETURN
  9654. PROCEDURE make_directory
  9655.   LOCAL a$,bouton%
  9656.   CLS
  9657.   GOSUB cadre_texte("MAKE NEW DIRECTORY",0,0,PRED(scr_ncol%))
  9658.   GOSUB sjx_system_to_gem
  9659.   FILESELECT npath_div$+"*.*","",a$
  9660.   GOSUB sjx_system_to_gtk
  9661.   IF a$<>""
  9662.     CLS
  9663.     GOSUB separe_nom_chemin(a$)
  9664.     IF nfile_$<>""
  9665.       GOSUB dialog("DISK","Do you really want|to create a new directory|"+a$+"\|ON DISK ?","YES|CANCEL",MOUSEX,MOUSEY)
  9666.       IF bouton%=0
  9667.         CLS
  9668.         GOSUB cadre_texte("CREATING DIRECTORY "+a$+"\...",0,0,PRED(scr_ncol%))
  9669.         MKDIR a$
  9670.         npath_div$=a$+"\"
  9671.       ENDIF
  9672.     ENDIF
  9673.   ENDIF
  9674.   GOSUB affiche_panneau_principal
  9675. RETURN
  9676. PROCEDURE delete_directory
  9677.   LOCAL bouton%,e%
  9678.   LOCAL a$,b$
  9679.   CLS
  9680.   GOSUB cadre_texte("DELETE DIRECTORY",0,0,PRED(scr_ncol%))
  9681.   GOSUB sjx_system_to_gem
  9682.   FILESELECT npath_div$+"*.*","",a$
  9683.   GOSUB sjx_system_to_gtk
  9684.   IF a$<>""
  9685.     CLS
  9686.     GOSUB separe_nom_chemin(a$)
  9687.     IF FN exist(npath_$+"*.*")
  9688.       GOSUB dialog("STOP","Directory|"+npath_$+"|must be empty","Cancel",MOUSEX,MOUSEY)
  9689.     ELSE
  9690.       GOSUB dialog("DISK","Do you really want|to delete directory|"+npath_$+"|on disk ?","Ok|Cancel",MOUSEX,MOUSEY)
  9691.       IF bouton%=0
  9692.         CLS
  9693.         GOSUB cadre_texte("DELETING DIRECTORY "+npath_$+"...",0,0,PRED(scr_ncol%))
  9694.         a$=LEFT$(npath_$,PRED(LEN(npath_$)))
  9695.         b$=a$+CHR$(0)
  9696.         e%=GEMDOS(58,L:V:b$)
  9697.         IF e%<0
  9698.           GOSUB dialog("FILE","Error "+STR$(e%)+"during deleting directory|"+a$+"\","Cancel",MOUSEX,MOUSEY)
  9699.         ENDIF
  9700.         GOSUB separe_nom_chemin(a$)
  9701.         npath_div$=npath_$
  9702.       ENDIF
  9703.     ENDIF
  9704.   ENDIF
  9705.   GOSUB affiche_panneau_principal
  9706. RETURN
  9707. PROCEDURE delete_file
  9708.   LOCAL bouton%,e%
  9709.   LOCAL b$
  9710.   CLS
  9711.   GOSUB cadre_texte("DELETE FILE",0,0,PRED(scr_ncol%))
  9712.   GOSUB sjx_system_to_gem
  9713.   FILESELECT npath_div$+"*.*","",a$
  9714.   GOSUB sjx_system_to_gtk
  9715.   IF a$<>""
  9716.     IF FN exist(a$)
  9717.       CLS
  9718.       GOSUB dialog("FILE","Do you really|want to delete|"+a$+"|on disk ?","Ok|Cancel",MOUSEX,MOUSEY)
  9719.       IF bouton%=0
  9720.         CLS
  9721.         GOSUB cadre_texte("DELETING FILE "+a$+"...",0,0,PRED(scr_ncol%))
  9722.         b$=a$+CHR$(0)
  9723.         e%=GEMDOS(65,L:V:a$)
  9724.         IF e%<0
  9725.           GOSUB dialog("FILE","Error "+STR$(e%)+" during deleting|file "+a$,"Cancel",MOUSEX,MOUSEY)
  9726.         ENDIF
  9727.         GOSUB separe_nom_chemin(a$)
  9728.         npath_div$=npath_$
  9729.       ENDIF
  9730.     ELSE
  9731.       GOSUB dialog("FILE","File not found:|"+a$,"Cancel",MOUSEX,MOUSEY)
  9732.     ENDIF
  9733.   ENDIF
  9734.   GOSUB affiche_panneau_principal
  9735. RETURN
  9736. PROCEDURE format_disk                   !!!
  9737. RETURN
  9738. PROCEDURE rename_file
  9739.   LOCAL e%
  9740.   LOCAL a$,b$,c$,d$,e$,f$
  9741.   ~FRE(0)
  9742.   CLS
  9743.   GOSUB cadre_texte("RENAME A FILE",0,0,PRED(scr_ncol%))
  9744.   GOSUB sjx_system_to_gem
  9745.   FILESELECT npath_div$+"*.*","",a$
  9746.   GOSUB sjx_system_to_gtk
  9747.   IF a$<>""
  9748.     IF FN exist(a$)
  9749.       CLS
  9750.       GOSUB cadre_texte("SELECT NEW NAME OF "+a$,0,0,PRED(scr_ncol%))
  9751.       GOSUB separe_nom_chemin(a$)
  9752.       npath_div$=npath_$
  9753.       c$=nfile_$
  9754.       GOSUB sjx_system_to_gem
  9755.       FILESELECT npath_div$+"*.*",c$,b$
  9756.       GOSUB sjx_system_to_gtk
  9757.       GOSUB separe_nom_chemin(b$)
  9758.       d$=nfile_$
  9759.       IF d$<>"" AND d$<>c$ AND npath_$=npath_div$
  9760.         CLS
  9761.         GOSUB cadre_texte("RENAMING "+a$+" AS "+d$+"...",0,0,PRED(scr_ncol%))
  9762.         f$=a$+CHR$(0)
  9763.         e$=b$+CHR$(0)
  9764.         e%=GEMDOS(86,0,L:V:f$,L:V:e$)
  9765.         IF e%<0
  9766.           GOSUB dialog("FILE","Error "+STR$(e%)+" during renaming.","Ok",MOUSEX,MOUSEY)
  9767.         ENDIF
  9768.       ELSE IF npath_$<>npath_div$
  9769.         GOSUB dialog("RENAME","Old and new file|must be in the|same path!","Cancel",MOUSEX,MOUSEY)
  9770.       ENDIF
  9771.     ELSE
  9772.       GOSUB dialog("FILE","File not found:|"+a$,"Cancel",MOUSEX,MOUSEY)
  9773.     ENDIF
  9774.   ENDIF
  9775.   GOSUB affiche_panneau_principal
  9776. RETURN
  9777. PROCEDURE separe_nom_chemin(aaaa$)
  9778.   ' Chercher le nom et le chemin
  9779.   ' Renvoie npath_$ et nfile_$
  9780.   LOCAL iiii%,flag%
  9781.   nfile_$=""
  9782.   npath_$=""
  9783.   flag%=0
  9784.   FOR iiii%=LEN(aaaa$) DOWNTO 1
  9785.     IF MID$(aaaa$,iiii%,1)="\" AND flag%=0
  9786.       flag%=1
  9787.       npath_$=LEFT$(aaaa$,iiii%)
  9788.     ELSE IF flag%=0
  9789.       nfile_$=MID$(aaaa$,iiii%,1)+nfile_$
  9790.     ENDIF
  9791.   NEXT iiii%
  9792. RETURN
  9793. PROCEDURE selpath_module
  9794.   LOCAL a$
  9795.   CLS
  9796.   GOSUB cadre_texte("SELECT PATH FOR MODULE",0,0,PRED(scr_ncol%))
  9797.   GOSUB sjx_system_to_gem
  9798.   FILESELECT npath_module$+next_module$,nfile_module$,a$
  9799.   GOSUB sjx_system_to_gtk
  9800.   IF a$<>""
  9801.     GOSUB separe_nom_chemin(a$)
  9802.     nfile_module$=nfile_$
  9803.     npath_module$=npath_$
  9804.   ENDIF
  9805.   GOSUB affiche_panneau_principal
  9806. RETURN
  9807. PROCEDURE selpath_sample
  9808.   LOCAL a$
  9809.   CLS
  9810.   GOSUB cadre_texte("SELECT PATH FOR SAMPLE",0,0,PRED(scr_ncol%))
  9811.   GOSUB sjx_system_to_gem
  9812.   FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  9813.   GOSUB sjx_system_to_gtk
  9814.   IF a$<>""
  9815.     GOSUB separe_nom_chemin(a$)
  9816.     nfile_sample$=nfile_$
  9817.     npath_sample$=npath_$
  9818.   ENDIF
  9819.   GOSUB affiche_panneau_principal
  9820. RETURN
  9821. PROCEDURE selpath_prefs
  9822.   LOCAL a$
  9823.   CLS
  9824.   GOSUB cadre_texte("SELECT PATH FOR PREFERENCE FILE",0,0,PRED(scr_ncol%))
  9825.   GOSUB sjx_system_to_gem
  9826.   FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  9827.   GOSUB sjx_system_to_gtk
  9828.   IF a$<>""
  9829.     GOSUB separe_nom_chemin(a$)
  9830.     nfile_prefs$=nfile_$
  9831.     npath_prefs$=npath_$
  9832.   ENDIF
  9833.   GOSUB affiche_panneau_principal
  9834. RETURN
  9835. PROCEDURE selpath_autoload
  9836.   LOCAL a$
  9837.   CLS
  9838.   GOSUB cadre_texte("SELECT PATH FOR AUTOLOAD",0,0,PRED(scr_ncol%))
  9839.   GOSUB sjx_system_to_gem
  9840.   FILESELECT npath_autoload$+next_module$,nfile_autoload$,a$
  9841.   GOSUB sjx_system_to_gtk
  9842.   IF a$<>""
  9843.     GOSUB separe_nom_chemin(a$)
  9844.     nfile_autoload$=nfile_$
  9845.     npath_autoload$=npath_$
  9846.   ENDIF
  9847.   GOSUB affiche_panneau_principal
  9848. RETURN
  9849. '
  9850. ' Gestion du clavier
  9851. ' ------------------
  9852. PROCEDURE gestion_clavier
  9853.   '
  9854.   ' Recupere le code clavier
  9855.   '
  9856.   IF GEMDOS(11)<>0                              ! une touche ?
  9857.     KEYGET clavier%
  9858.     GOSUB vide_buffer_clavier
  9859.     clavier%=clavier% AND &H1FFF00FF
  9860.   ELSE
  9861.     clavier%=SHL(BIOS(11,-1) AND &H1F,24)       ! Kbshift
  9862.   ENDIF
  9863.   IF clavier%>0
  9864.     '
  9865.     ' Trafique le code clavier et identifie la fonction
  9866.     '
  9867.     a%=FN key_trafique_code_clavier(clavier%)
  9868.     clavier%=LONG{a%}
  9869.     numero_touche%=CARD{ADD(a%,4)}
  9870.     IF INT{ADD(a%,6)}<>-1
  9871.       fonction_trouvee!=TRUE
  9872.       numero_fonction%=CARD{ADD(a%,6)}
  9873.     ELSE
  9874.       fonction_trouvee!=FALSE
  9875.     ENDIF
  9876.     asciicode%=clavier% AND 255                 ! Remise a jour apres les modifs
  9877.     scancode%=SHR(clavier%,16) AND 255          ! Idem
  9878.     '
  9879.     ' Sauts aux sous-routines
  9880.     '
  9881.     IF fonction_trouvee!
  9882.       SELECT numero_fonction%
  9883.       CASE 0 TO 7
  9884.         ON SUCC(numero_fonction%) GOSUB key_cursor_left,key_cursor_right,key_prev_line,key_next_line,key_prev_octave,key_next_octave,key_prev_column,key_next_column
  9885.       CASE 8 TO 15
  9886.         ON SUB(numero_fonction%,7) GOSUB key_prev_bar,key_next_bar,key_prev_songpos,key_next_songpos,key_prev_preset,key_next_preset,key_dec_step,key_inc_step
  9887.       CASE 16 TO 23
  9888.         ON SUB(numero_fonction%,15) GOSUB key_dec_high,key_inc_high,key_play_line,key_play_song,key_cont_song,key_play_pattern,key_cont_pattern,key_stop_edit
  9889.       CASE 24 TO 31
  9890.         ON SUB(numero_fonction%,23) GOSUB key_prev_instr,key_next_instr,key_prev_sample,key_next_sample,key_expand,key_cpu_time,key_replay_freq,key_interpolation_one_track
  9891.       CASE 32 TO 39
  9892.         ON SUB(numero_fonction%,31) GOSUB key_interpolation_all_tracks,key_load_module,key_save_module,key_resync_screen,key_snapshot,key_samplepad_drumpad,key_help,key_block_start
  9893.       CASE 40 TO 47
  9894.         ON SUB(numero_fonction%,39) GOSUB key_block_end,key_instr_under_cursor,key_clear_note,key_clear_effect,key_clear_volume,key_clear_whole_note,key_copy_block_track,key_copy_block_pattern
  9895.       CASE 48 TO 51
  9896.         ON SUB(numero_fonction%,47) GOSUB key_copy_block_preset,key_copy_block_track_cursor,key_insert_line_pattern,key_insert_line_track
  9897.       CASE 52 TO 55
  9898.         ON SUB(numero_fonction%,51) GOSUB key_insert_line_preset,key_insert_line_pattern_rotate,key_insert_line_track_rotate,key_insert_line_preset_rotate
  9899.       CASE 56 TO 63
  9900.         ON SUB(numero_fonction%,55) GOSUB key_delete_line_pattern,key_delete_line_track,key_delete_line_preset,key_delete_line_pattern_rotate,key_delete_line_track_rotate,key_delete_line_preset_rotate,key_line,key_line
  9901.       CASE 64 TO 71
  9902.         ON SUB(numero_fonction%,63) GOSUB key_line,key_line,key_line,key_line,key_line,key_line,key_line,key_line
  9903.       CASE 72 TO 79
  9904.         ON SUB(numero_fonction%,71) GOSUB key_select_preset,key_select_preset,key_rec_preset,key_rec_preset,key_instr_sample_drum,key_instr_sample_drum,key_rec_instr_sample_drum,key_rec_instr_sample_drum
  9905.       CASE 80 TO 87
  9906.         ' sjx - volume slide = 84 - VSLD
  9907.         ON SUB(numero_fonction%,79) GOSUB key_track_onoff,key_track_onoff,key_rec_track_onoff,key_rec_track_onoff,key_volume_slide,rien,rien,rien
  9908.       ENDSELECT
  9909.     ELSE
  9910.       '
  9911.       ' Si aucune fonction speciale trouvee, c'est peut-etre une note
  9912.       '
  9913.       GOSUB teste_touches_notes
  9914.     ENDIF
  9915.   ENDIF
  9916. RETURN
  9917. FUNCTION key_trafique_code_clavier(clavier%)
  9918.   ' Trafique le code du clavier et trouve la bonne fonction
  9919.   LOCAL a%,b%,c%,d%,e%,f%
  9920.   a%=ADD(SHL(play%,16),edit%)
  9921.   b%=V:keydef_mask%(0,0)
  9922.   c%=V:keydef_val%(0,0)
  9923.   d%=V:scancode2ascii$(0,keyboard_type%)
  9924.   e%=V:scancode2ascii$(1,keyboard_type%)
  9925.   f%=V:scancode2ascii$(2,keyboard_type%)
  9926.   '  a%=C:g_find_key_function%(L:clavier%,L:a%,W:84,L:b%,L:c%,L:d%,L:e%,L:f%)
  9927.   ' sjx - VSLD
  9928.   a%=C:g_find_key_function%(L:clavier%,L:a%,W:85,L:b%,L:c%,L:d%,L:e%,L:f%)
  9929.   RETURN a%
  9930. ENDFUNC
  9931. PROCEDURE teste_touches_notes
  9932.   IF edit%=1
  9933.     '
  9934.     ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9935.     '
  9936.     ' Touches en mode Edit
  9937.     ' --------------------
  9938.     IF scancode%<54 AND curs_x%=0               ! Frappe d'une note en mode d'edition
  9939.       a%=t_note%(scancode%)
  9940.       IF a%<>-1 AND ADD(a%,MUL(octave%,12))<104
  9941.         ADD a%,ADD(MUL(octave%,12),24)          ! Ajuste a la bonne note
  9942.         FOR i%=0 TO PRED(nbr_track%)
  9943.           b%=LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}
  9944.           d%=BYTE{FN adr_strk(songpos%,posligne%,i%)}
  9945.           IF i%=preset&(curs_col%,n_preset%)
  9946.             c%=ADD(SHL(instr%,24),ADD(b% AND ext_note1%,ext_note2%))
  9947.             IF play%=0
  9948.               BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=a%
  9949.               LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=c%
  9950.             ENDIF
  9951.             BYTE{FN adr_strk(songpos%,posligne%,i%)}=a%
  9952.             LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}=c%
  9953.           ELSE IF play%=0
  9954.             BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=d%
  9955.             LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=b%
  9956.           ENDIF
  9957.         NEXT i%
  9958.         IF BTST(clavier%,8)
  9959.           curs_x%=2
  9960.           GOSUB curseur_a_droite                ! + Shift : va sur le premier chiffre de l'effet
  9961.         ELSE
  9962.           GOSUB next_line
  9963.         ENDIF
  9964.         IF play%=0
  9965.           GOSUB play_pattern_bidon
  9966.         ENDIF
  9967.       ENDIF
  9968.     ELSE IF scancode%>1 AND scancode%<12 AND curs_x%>0
  9969.       ' Touches 0 - 9
  9970.       a%=PRED(scancode%) MOD 10
  9971.       b%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  9972.       POKE ADD(b%,SHR(SUCC(curs_x%),1)),ADD(PEEK(ADD(b%,SHR(SUCC(curs_x%),1))) AND SHR(240,SHL(curs_x% AND 1,2)),SHL(a%,SHL(curs_x% AND 1,2)))
  9973.       BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  9974.       GOSUB play_pattern_bidon
  9975.       IF BTST(clavier%,8)
  9976.         GOSUB curseur_a_droite                  ! + Shift : Chiffre suivant
  9977.       ELSE
  9978.         GOSUB next_line
  9979.       ENDIF
  9980.     ELSE IF ((asciicode%>64 AND asciicode%<71) OR (asciicode%>96 AND asciicode%<103)) AND curs_x%>0
  9981.       ' Touches A - F
  9982.       a%=SUB(asciicode% AND &HDF,55)
  9983.       b%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  9984.       POKE ADD(b%,SHR(SUCC(curs_x%),1)),ADD(PEEK(ADD(b%,SHR(SUCC(curs_x%),1))) AND SHR(240,SHL(curs_x% AND 1,2)),SHL(a%,SHL(curs_x% AND 1,2)))
  9985.       BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  9986.       GOSUB play_pattern_bidon
  9987.       IF BTST(clavier%,8)
  9988.         GOSUB curseur_a_droite                  ! + Shift : Chiffre suivant
  9989.       ELSE
  9990.         GOSUB next_line
  9991.       ENDIF
  9992.     ENDIF
  9993.   ELSE
  9994.     '
  9995.     ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9996.     '
  9997.     ' Touches en mode Stop
  9998.     ' --------------------
  9999.     IF scancode%<54 AND edit%=0 AND play%=0     ! Frappe d'une note en mode Stop
  10000.       a%=t_note%(scancode%)
  10001.       IF a%<>-1 AND ADD(a%,MUL(octave%,12))<104
  10002.         ADD a%,ADD(MUL(octave%,12),24)          ! Ajuste a la bonne note
  10003.         FOR i%=0 TO PRED(nbr_track%)
  10004.           IF i%=preset&(curs_col%,n_preset%)
  10005.             BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=a%
  10006.             LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=ADD(SHL(instr%,24),ext_note2%)
  10007.           ELSE
  10008.             BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=0
  10009.             LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=0
  10010.           ENDIF
  10011.         NEXT i%
  10012.         GOSUB play_pattern_bidon
  10013.       ENDIF
  10014.     ENDIF
  10015.     '
  10016.     ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  10017.     '
  10018.     ' Touches en mode Play sans Edit
  10019.     ' ------------------------------
  10020.     IF play%<>0 AND edit%=0
  10021.       IF scancode%<54                           ! Frappe d'une note en mode play
  10022.         a%=t_note%(scancode%)
  10023.         IF a%<>-1 AND ADD(a%,MUL(octave%,12))<104
  10024.           ADD a%,ADD(MUL(octave%,12),24)        ! Ajuste a la bonne note
  10025.           i%=preset&(curs_col%,n_preset%)
  10026.           b%=LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}
  10027.           c%=ADD(SHL(instr%,24),ADD(b% AND ext_note1%,ext_note2%))
  10028.           a$=CHR$(a%)+MKL$(c%)
  10029.           ~C:rr_play_one_note%(L:V:a$,W:i%)
  10030.         ENDIF
  10031.       ENDIF
  10032.     ENDIF
  10033.   ENDIF
  10034. RETURN
  10035. PROCEDURE vide_buffer_clavier
  10036.   IF NOT flag_keyboard_buffer!
  10037.     WHILE GEMDOS(11)<>0
  10038.       ~GEMDOS(7)
  10039.     WEND
  10040.   ENDIF
  10041. RETURN
  10042. ' Touches valables tout le temps
  10043. PROCEDURE key_next_octave
  10044.   octave%=SUCC(octave%) MOD 7
  10045.   GOSUB affiche_barre_info
  10046. RETURN
  10047. PROCEDURE key_prev_octave
  10048.   DEC octave%
  10049.   WHILE octave%<0
  10050.     ADD octave%,7
  10051.   WEND
  10052.   GOSUB affiche_barre_info
  10053. RETURN
  10054. PROCEDURE key_next_column
  10055.   INC curs_col%
  10056.   IF curs_col%>PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  10057.     curs_col%=0
  10058.   ENDIF
  10059.   GOSUB affiche_c_pattern
  10060. RETURN
  10061. PROCEDURE key_prev_column
  10062.   DEC curs_col%
  10063.   IF curs_col%<0
  10064.     curs_col%=PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  10065.   ENDIF
  10066.   GOSUB affiche_c_pattern
  10067. RETURN
  10068. PROCEDURE key_cpu_time
  10069.   DPOKE r_flag_mt_display%,DPEEK(r_flag_mt_display%) XOR 1
  10070.   IF DPEEK(r_flag_mt_display%)=0            ! Attend la fin de la VBL pour remettre le noir
  10071.     PAUSE 1
  10072.     SLPOKE &HFFFF9800,&H0
  10073.     GOSUB aff_message("CPU time not displayed.")
  10074.   ELSE
  10075.     GOSUB aff_message("CPU time displayed.")
  10076.   ENDIF
  10077. RETURN
  10078. PROCEDURE key_expand
  10079.   GOSUB chg_type_affpiste(SUCC(type_affpiste%) MOD 3)
  10080.   curs_x%=0
  10081.   curs_col%=MIN(curs_col%,PRED(nbr_col%))
  10082.   CARD{ADD(V:para_affiche_pattern$,72)}=type_affpiste%
  10083.   GOSUB cadre_ext(1,160,SUB(scr_ncol%,3),SUB(scr_haut%,164),9,9,9,9)
  10084.   GOSUB affiche_cadre_voies
  10085.   GOSUB affiche_info_preset
  10086.   GOSUB affiche_c_pattern
  10087. RETURN
  10088. PROCEDURE key_replay_freq
  10089.   c%=FN mod_tempo
  10090.   a%=CARD{r_adr_replay_frequency%}
  10091.   SELECT a%
  10092.   CASE 49170
  10093.     b%=32780
  10094.     d%=&H102
  10095.   CASE 32780
  10096.     b%=24585
  10097.     d%=&H103
  10098.   CASE 24585
  10099.     b%=19668
  10100.     d%=&H104
  10101.   CASE 19668
  10102.     b%=16390
  10103.     d%=&H105
  10104.   CASE 16390
  10105.     b%=12292
  10106.     d%=&H107
  10107.   DEFAULT
  10108.     b%=49170
  10109.     d%=&H101
  10110.   ENDSELECT
  10111.   IF b%>a%                                  ! C'est pour eviter des bugs dus a une desychro entre
  10112.     CARD{r_adr_replay_frequency%}=b%        ! nombre d'ech a calculer / frequence de replay, a
  10113.     GOSUB chg_tempo(c%)                     ! cause du double buffer.
  10114.     PAUSE 5                                 ! *** Principe a verifier plus en detail
  10115.     SDPOKE &HFFFF8934,d%
  10116.   ELSE
  10117.     SDPOKE &HFFFF8934,d%
  10118.     PAUSE 5
  10119.     CARD{r_adr_replay_frequency%}=b%
  10120.     GOSUB chg_tempo(c%)
  10121.   ENDIF
  10122.   GOSUB aff_message("Replay in "+STR$(b%/1000)+" KHz.")
  10123. RETURN
  10124. PROCEDURE key_interpolation_one_track
  10125.   b%=preset&(curs_col%,n_preset%)
  10126.   a%=ABS(SGN(FN track_interpol(b%))) XOR 1
  10127.   CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,b%))}=a%
  10128.   IF a%<>0
  10129.     GOSUB aff_message("Interpolation on track "+STR$(SUCC(b%))+".")
  10130.   ELSE
  10131.     GOSUB aff_message("Interpolation disabled on track "+STR$(SUCC(b%))+".")
  10132.   ENDIF
  10133. RETURN
  10134. PROCEDURE key_interpolation_all_tracks
  10135.   a%=ABS(SGN(FN track_interpol(preset&(curs_col%,n_preset%)))) XOR 1
  10136.   FOR i%=0 TO PRED(nbr_track%)
  10137.     CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,i%))}=a%
  10138.   NEXT i%
  10139.   IF a%<>0
  10140.     GOSUB aff_message("Interpolation on all the tracks.")
  10141.   ELSE
  10142.     GOSUB aff_message("Interpolation disabled on all the tracks.")
  10143.   ENDIF
  10144. RETURN
  10145. PROCEDURE key_inc_step
  10146.   IF line_step%>-256 AND line_step%<256
  10147.     line_step%=SUCC(line_step%) MOD FN nbr_lines3
  10148.   ELSE
  10149.     line_step%=1
  10150.   ENDIF
  10151.   GOSUB affiche_info_song
  10152. RETURN
  10153. PROCEDURE key_dec_step
  10154.   IF line_step%>-256 AND line_step%<256
  10155.     line_step%=MAX(PRED(line_step%) MOD FN nbr_lines3,-15)
  10156.   ELSE
  10157.     line_step%=1
  10158.   ENDIF
  10159.   GOSUB affiche_info_song
  10160. RETURN
  10161. PROCEDURE key_load_module
  10162.   km%=1
  10163.   GOSUB load_module
  10164.   km%=0
  10165. RETURN
  10166. PROCEDURE key_save_module
  10167.   km%=1
  10168.   GOSUB save_module
  10169.   km%=0
  10170. RETURN
  10171. PROCEDURE key_resync_screen
  10172.   GOSUB resync_tv_screen
  10173. RETURN
  10174. PROCEDURE key_snapshot
  10175.   GOSUB aff_message("Please clic on 2 corners for the snapshot")
  10176.   GOSUB snapshot
  10177. RETURN
  10178. PROCEDURE key_stop_edit
  10179.   GOSUB stop_edit
  10180. RETURN
  10181. PROCEDURE key_block_start
  10182.   GOSUB block_start
  10183. RETURN
  10184. PROCEDURE key_block_end
  10185.   GOSUB block_end
  10186. RETURN
  10187. PROCEDURE key_cont_song
  10188.   GOSUB edit_mode_off
  10189.   GOSUB play_song(TRUE)
  10190. RETURN
  10191. PROCEDURE key_cont_pattern
  10192.   GOSUB edit_mode_off
  10193.   GOSUB play_pattern(TRUE)
  10194. RETURN
  10195. PROCEDURE key_samplepad_drumpad
  10196.   drumpad_flag%=SUCC(drumpad_flag%) MOD 3
  10197.   GOSUB affiche_barre_info
  10198. RETURN
  10199. PROCEDURE key_line
  10200.   posligne%=MIN(keydef_param%(numero_fonction%),PRED(FN nbr_lines3))
  10201.   IF play%>0
  10202.     DPOKE r_mod_linepos%,posligne%
  10203.   ELSE
  10204.     GOSUB affiche_c_pattern
  10205.   ENDIF
  10206. RETURN
  10207. PROCEDURE key_prev_instr
  10208.   instr%=MAX(PRED(instr%),1)
  10209.   GOSUB affiche_info_sample
  10210. RETURN
  10211. PROCEDURE key_next_instr
  10212.   instr%=MIN(SUCC(instr%),255)
  10213.   GOSUB affiche_info_sample
  10214. RETURN
  10215. PROCEDURE key_prev_sample
  10216.   sample%=MAX(PRED(sample%),1)
  10217.   GOSUB affiche_info_sample
  10218. RETURN
  10219. PROCEDURE key_next_sample
  10220.   sample%=MIN(SUCC(sample%),255)
  10221.   GOSUB affiche_info_sample
  10222. RETURN
  10223. PROCEDURE key_select_preset
  10224.   a%=presetpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))
  10225.   GOSUB chg_preset(a%)
  10226. RETURN
  10227. PROCEDURE key_rec_preset
  10228.   presetpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))=n_preset%
  10229.   GOSUB aff_message("Preset #"+STR$(a%)+" recorded on presetpad.")
  10230. RETURN
  10231. PROCEDURE key_track_onoff
  10232.   a%=trackpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))
  10233.   IF a%<nbr_track%
  10234.     GOSUB chg_a_track_onoff(a%,ABS(SGN(FN track_onoff(a%))) XOR 1)
  10235.   ENDIF
  10236. RETURN
  10237. PROCEDURE key_rec_track_onoff
  10238.   a%=preset&(curs_col%,n_preset%)
  10239.   IF a%<nbr_track%
  10240.     trackpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))=a%
  10241.     GOSUB aff_message("Track #"+STR$(a%)+" recorded on trackpad.")
  10242.   ENDIF
  10243. RETURN
  10244. PROCEDURE key_prev_line
  10245.   DEC posligne%
  10246.   IF posligne%<0
  10247.     posligne%=PRED(FN nbr_lines3)
  10248.   ENDIF
  10249.   IF play%>0
  10250.     DPOKE r_mod_linepos%,posligne%
  10251.   ELSE
  10252.     GOSUB affiche_c_pattern
  10253.   ENDIF
  10254. RETURN
  10255. PROCEDURE key_next_line
  10256.   INC posligne%
  10257.   IF posligne%=>FN nbr_lines3
  10258.     posligne%=0
  10259.   ENDIF
  10260.   IF play%>0
  10261.     DPOKE r_mod_linepos%,posligne%
  10262.   ELSE
  10263.     GOSUB affiche_c_pattern
  10264.   ENDIF
  10265. RETURN
  10266. PROCEDURE key_instr_sample_drum
  10267.   a%=ADD(keydef_param%(numero_fonction%),numero_touche%)
  10268.   IF drumpad_flag%=0                            ! Numero d'instrument
  10269.     instr%=drumpad%(a%,0)
  10270.     GOSUB affiche_info_sample
  10271.   ELSE IF drumpad_flag%=1                       ! Numero de sample
  10272.     sample%=drumpad%(a%,1)
  10273.     GOSUB affiche_info_sample
  10274.   ELSE                                          ! Sort une note du drumpad
  10275.     IF edit%=1
  10276.       LPOKE FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%)),drumpad%(a%,2)
  10277.       GOSUB next_line
  10278.     ENDIF
  10279.   ENDIF
  10280. RETURN
  10281. PROCEDURE key_rec_instr_sample_drum
  10282.   a%=ADD(keydef_param%(numero_fonction%),numero_touche%)
  10283.   IF drumpad_flag%=0                            ! Instrument
  10284.     drumpad%(a%,0)=instr%
  10285.     GOSUB aff_message("Instrument #"+HEX$(instr%,2)+" recorded on samplepad.")
  10286.   ELSE IF drumpad_flag%=1                       ! Sample
  10287.     drumpad%(a%,1)=sample%
  10288.     GOSUB aff_message("Sample #"+HEX$(instr%,2)+" recorded on samplepad.")
  10289.   ELSE                                          ! Drum
  10290.     b%=LPEEK(FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%)))
  10291.     drumpad%(a%,2)=b%
  10292.     IF (b% AND &H0)>0
  10293.       c%=SHR(b%,24)       ! c% = note
  10294.       GOSUB aff_message(MID$(gamme$,SUCC(SHL(c% MOD 12,1)),2)+STR$(SUB(DIV(c%,12),2),1)+" "+HEX$(SHR(b%,16) AND 255)+HEX$(b%,4)+" recorded on drumpad.")
  10295.     ELSE
  10296.       GOSUB aff_message("--- "+HEX$(SHR(b%,16) AND 255)+HEX$(b%,4)+" recorded on drumpad.")
  10297.     ENDIF
  10298.   ENDIF
  10299. RETURN
  10300. PROCEDURE key_help
  10301.   GOSUB help(4)             ! Page des effets
  10302. RETURN
  10303. PROCEDURE key_instr_under_cursor
  10304.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10305.   b%=BYTE{SUCC(a%)}
  10306.   IF b%<>0
  10307.     instr%=b%
  10308.     GOSUB affiche_info_sample
  10309.   ENDIF
  10310. RETURN
  10311. PROCEDURE key_prev_bar
  10312.   posligne%=PRED(posligne%) AND -16
  10313.   IF posligne%<0
  10314.     posligne%=PRED(FN nbr_lines3) AND -16
  10315.   ENDIF
  10316.   IF play%>0
  10317.     DPOKE r_mod_linepos%,posligne%
  10318.   ELSE
  10319.     GOSUB affiche_c_pattern
  10320.   ENDIF
  10321. RETURN
  10322. PROCEDURE key_next_bar
  10323.   posligne%=ADD(posligne%,16) AND -16
  10324.   IF posligne%=>FN nbr_lines3
  10325.     posligne%=0
  10326.   ENDIF
  10327.   IF play%>0
  10328.     DPOKE r_mod_linepos%,posligne%
  10329.   ELSE
  10330.     GOSUB affiche_c_pattern
  10331.   ENDIF
  10332. RETURN
  10333. PROCEDURE key_cursor_left
  10334.   GOSUB curseur_a_gauche
  10335. RETURN
  10336. PROCEDURE key_cursor_right
  10337.   GOSUB curseur_a_droite
  10338. RETURN
  10339. PROCEDURE key_prev_songpos
  10340.   d%=-1
  10341.   GOSUB chg_songpos
  10342. RETURN
  10343. PROCEDURE key_next_songpos
  10344.   d%=1
  10345.   GOSUB chg_songpos
  10346. RETURN
  10347. PROCEDURE key_prev_preset
  10348.   GOSUB chg_preset(PRED(n_preset%) AND 31)
  10349. RETURN
  10350. PROCEDURE key_next_preset
  10351.   GOSUB chg_preset(SUCC(n_preset%) AND 31)
  10352. RETURN
  10353. PROCEDURE key_dec_high
  10354.   haut_lig%=MAX(SUB(haut_lig%,2),1)
  10355.   CARD{ADD(V:para_affiche_pattern$,6)}=haut_lig%
  10356.   GOSUB cadre_ext(1,ADD(MUL(haut_lig%,6),170),SUB(scr_ncol%,3),11,9,9,9,9)
  10357.   GOSUB affiche_cadre_voies
  10358.   GOSUB affiche_info_preset
  10359.   GOSUB affiche_c_pattern
  10360. RETURN
  10361. PROCEDURE key_inc_high
  10362.   haut_lig%=MIN(ADD(haut_lig%,2),DIV(SUB(scr_haut%,180),6) OR 1)
  10363.   CARD{ADD(V:para_affiche_pattern$,6)}=haut_lig%
  10364.   GOSUB affiche_cadre_voies
  10365.   GOSUB affiche_info_preset
  10366.   GOSUB affiche_c_pattern
  10367. RETURN
  10368. PROCEDURE key_play_line
  10369.   IF play%=0
  10370.     FOR i%=0 TO PRED(nbr_track%)
  10371.       b%=LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}
  10372.       d%=BYTE{FN adr_strk(songpos%,posligne%,i%)}
  10373.       BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=d%
  10374.       LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=b%
  10375.     NEXT i%
  10376.     GOSUB next_line
  10377.     GOSUB play_pattern_bidon
  10378.   ENDIF
  10379. RETURN
  10380. PROCEDURE key_play_song
  10381.   GOSUB play_song(0)
  10382. RETURN
  10383. PROCEDURE key_play_pattern
  10384.   GOSUB play_pattern(0)
  10385. RETURN
  10386. ' Touches en mode Edit
  10387. PROCEDURE key_clear_note
  10388.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10389.   LPOKE a%,LPEEK(a%) AND 65535
  10390.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10391.   GOSUB play_pattern_bidon
  10392.   GOSUB next_line
  10393. RETURN
  10394. PROCEDURE key_copy_block_track
  10395.   trackpat_s%=trackpat%
  10396.   trackpat%=0
  10397.   GOSUB paste_block
  10398.   trackpat%=trackpat_s%
  10399.   GOSUB affiche_c_pattern
  10400.   GOSUB aff_message("Track copied.")
  10401. RETURN
  10402. PROCEDURE key_copy_block_pattern
  10403.   trackpat_s%=trackpat%
  10404.   trackpat%=1
  10405.   GOSUB paste_block
  10406.   trackpat%=trackpat_s%
  10407.   GOSUB affiche_c_pattern
  10408.   GOSUB aff_message("Pattern copied.")
  10409. RETURN
  10410. PROCEDURE key_copy_block_preset
  10411.   trackpat_s%=trackpat%
  10412.   trackpat%=2
  10413.   GOSUB paste_block
  10414.   trackpat%=trackpat_s%
  10415.   GOSUB affiche_c_pattern
  10416.   GOSUB aff_message("Preset copied.")
  10417. RETURN
  10418. PROCEDURE key_copy_block_track_cursor
  10419.   trackpat_s%=trackpat%
  10420.   bl_trk_s&=bl_trk&
  10421.   trackpat%=0
  10422.   bl_trk&=preset&(curs_col%,n_preset%)
  10423.   GOSUB paste_block
  10424.   trackpat%=trackpat_s%
  10425.   bl_trk&=bl_trk_s&
  10426.   GOSUB affiche_c_pattern
  10427.   GOSUB aff_message("Track copied.")
  10428. RETURN
  10429. PROCEDURE key_clear_effect
  10430.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10431.   LPOKE a%,LPEEK(a%) AND -65536
  10432.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10433.   GOSUB play_pattern_bidon
  10434.   GOSUB next_line
  10435. RETURN
  10436. PROCEDURE key_clear_volume
  10437.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10438.   POKE ADD(a%,4),0
  10439.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10440.   GOSUB play_pattern_bidon
  10441.   GOSUB next_line
  10442. RETURN
  10443. PROCEDURE key_clear_whole_note
  10444.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10445.   LPOKE a%,0
  10446.   POKE ADD(a%,4),0
  10447.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10448.   GOSUB play_pattern_bidon
  10449.   GOSUB next_line
  10450. RETURN
  10451. PROCEDURE key_insert_line_pattern
  10452.   GOSUB insert_line_pattern(song&(songpos%),posligne%)
  10453.   GOSUB affiche_c_pattern
  10454. RETURN
  10455. PROCEDURE key_insert_line_track
  10456.   GOSUB insert_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%),STRING$(5,0))
  10457.   GOSUB affiche_c_pattern
  10458. RETURN
  10459. PROCEDURE key_insert_line_preset
  10460.   GOSUB insert_line_preset(song&(songpos%),posligne%)
  10461.   GOSUB affiche_c_pattern
  10462. RETURN
  10463. PROCEDURE key_insert_line_pattern_rotate
  10464.   GOSUB insert_r_line_pattern(song&(songpos%),posligne%)
  10465.   GOSUB affiche_c_pattern
  10466. RETURN
  10467. PROCEDURE key_insert_line_track_rotate
  10468.   GOSUB insert_r_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  10469.   GOSUB affiche_c_pattern
  10470. RETURN
  10471. PROCEDURE key_insert_line_preset_rotate
  10472.   GOSUB insert_r_line_preset(song&(songpos%),posligne%)
  10473.   GOSUB affiche_c_pattern
  10474. RETURN
  10475. PROCEDURE key_delete_line_pattern
  10476.   GOSUB delete_line_pattern(song&(songpos%),posligne%)
  10477.   GOSUB affiche_c_pattern
  10478. RETURN
  10479. PROCEDURE key_delete_line_track
  10480.   GOSUB delete_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%),STRING$(5,0))
  10481.   GOSUB affiche_c_pattern
  10482. RETURN
  10483. PROCEDURE key_delete_line_preset
  10484.   GOSUB delete_line_preset(song&(songpos%),posligne%)
  10485.   GOSUB affiche_c_pattern
  10486. RETURN
  10487. PROCEDURE key_delete_line_pattern_rotate
  10488.   GOSUB delete_r_line_pattern(song&(songpos%),posligne%)
  10489.   GOSUB affiche_c_pattern
  10490. RETURN
  10491. PROCEDURE key_delete_line_track_rotate
  10492.   GOSUB delete_r_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  10493.   GOSUB affiche_c_pattern
  10494. RETURN
  10495. PROCEDURE key_delete_line_preset_rotate
  10496.   GOSUB delete_r_line_preset(song&(songpos%),posligne%)
  10497.   GOSUB affiche_c_pattern
  10498. RETURN
  10499. ' sjx - because I found volslide useful, but it had no keyboard shortcut - VSLD
  10500. PROCEDURE key_volume_slide
  10501.   GOSUB volume_slide(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  10502.   GOSUB affiche_c_pattern
  10503. RETURN
  10504. ' Divers
  10505. PROCEDURE cherche_combinaison_touches(t$,VAR am%,ae%,bm%,be%)
  10506.   LOCAL a$
  10507.   LOCAL a%,p%
  10508.   LOCAL deux_touches!
  10509.   deux_touches!=FALSE
  10510.   am%=&HF000100
  10511.   bm%=&HF000100
  10512.   ae%=0
  10513.   be%=0
  10514.   WHILE LEN(t$)
  10515.     GOSUB separe_chaine(t$,a$)
  10516.     IF a$="NOKEY"
  10517.       am%=0
  10518.       bm%=0
  10519.       ae%=0
  10520.       be%=0
  10521.       t$=""
  10522.     ELSE IF a$="/"
  10523.       deux_touches!=TRUE
  10524.       SWAP am%,bm%
  10525.       SWAP ae%,be%
  10526.     ELSE IF a$="SHIFT"
  10527.       am%=(am% AND -&H3000001) OR &H100         ! Ne prend plus en compte les bits
  10528.       ae%=(ae% AND -&H3000001) OR &H100         ! seuls de Lshift et Rshift
  10529.     ELSE IF a$="RSHIFT"
  10530.       am%=(am% AND -&H101) OR &H1000000         ! Retire l'attribut 'Shift quelconque'
  10531.       ae%=(ae% AND -&H101) OR &H1000000
  10532.     ELSE IF a$="LSHIFT"
  10533.       am%=(am% AND -&H101) OR &H2000000         ! Retire l'attribut 'Shift quelconque'
  10534.       ae%=(ae% AND -&H101) OR &H2000000
  10535.     ELSE IF a$="CTRL"
  10536.       am%=am% OR &H4000000
  10537.       ae%=ae% OR &H4000000
  10538.     ELSE IF a$="ALT"
  10539.       am%=am% OR &H8000000
  10540.       ae%=ae% OR &H8000000
  10541.     ELSE IF a$="CAPS"
  10542.       am%=am% OR &H10000000
  10543.       ae%=ae% OR &H10000000
  10544.     ELSE IF a$="NOCAPS"
  10545.       am%=am% OR &H10000000
  10546.       ae%=ae% AND -&H10000001
  10547.     ELSE IF a$="NUMPAD"
  10548.       am%=(am% AND &H0) OR &H200         ! Retire Scan+Ascii+Fkeys
  10549.       ae%=(ae% AND &H0) OR &H200
  10550.     ELSE IF a$="FKEYS"
  10551.       am%=(am% AND &H0) OR &H400         ! Retire Scan+Ascii+Pad
  10552.       ae%=(ae% AND &H0) OR &H400
  10553.     ELSE IF a$="ESC"
  10554.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10555.       ae%=(ae% AND &H0) OR &H10000
  10556.     ELSE IF a$="TAB"
  10557.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10558.       ae%=(ae% AND &H0) OR &HF0000
  10559.     ELSE IF a$="SPACE"
  10560.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10561.       ae%=(ae% AND &H0) OR &H390000
  10562.     ELSE IF a$="RETURN"
  10563.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10564.       ae%=(ae% AND &H0) OR &H1C0000
  10565.     ELSE IF a$="BACKSPACE"
  10566.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10567.       ae%=(ae% AND &H0) OR &HE0000
  10568.     ELSE IF a$="DEL"
  10569.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10570.       ae%=(ae% AND &H0) OR &H530000
  10571.     ELSE IF a$="HELP"
  10572.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10573.       ae%=(ae% AND &H0) OR &H620000
  10574.     ELSE IF a$="UNDO"
  10575.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10576.       ae%=(ae% AND &H0) OR &H610000
  10577.     ELSE IF a$="INS"
  10578.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10579.       ae%=(ae% AND &H0) OR &H520000
  10580.     ELSE IF a$="CLR"
  10581.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10582.       ae%=(ae% AND &H0) OR &H470000
  10583.     ELSE IF a$="UP"
  10584.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10585.       ae%=(ae% AND &H0) OR &H480000
  10586.     ELSE IF a$="DOWN"
  10587.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10588.       ae%=(ae% AND &H0) OR &H500000
  10589.     ELSE IF a$="LEFT"
  10590.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10591.       ae%=(ae% AND &H0) OR &H4B0000
  10592.     ELSE IF a$="RIGHT"
  10593.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10594.       ae%=(ae% AND &H0) OR &H4D0000
  10595.     ELSE IF a$="PAD0"
  10596.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10597.       ae%=(ae% AND &H0) OR &H700000
  10598.     ELSE IF a$="PADPOINT"
  10599.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10600.       ae%=(ae% AND &H0) OR &H710000
  10601.     ELSE IF (a$>="F1" AND a$<="F9") OR a$="F10"
  10602.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10603.       a%=ADD(&H3A,VAL(RIGHT$(a$,PRED(LEN(a$)))))
  10604.       ae%=(ae% AND &H0) OR SHL(a%,16)
  10605.     ELSE IF a$="#"
  10606.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10607.       ae%=(ae% AND &H0) OR &H2B0000
  10608.     ELSE IF a$="<" OR a$=">"
  10609.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10610.       ae%=(ae% AND &H0) OR &H600000
  10611.     ELSE IF a$="&" OR a$="1"
  10612.       am%=(am% AND &H0) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10613.       ae%=(ae% AND &H0) OR &H20000
  10614.     ELSE IF a$>="A" AND a$<="Z"
  10615.       am%=(am% AND &H0) OR &HFF          ! Retire Scan+Pad+Fkeys et met l'Ascii
  10616.       ae%=(ae% AND &H0) OR ASC(a$)
  10617.     ENDIF
  10618.   WEND
  10619.   IF deux_touches! OR ae%=0
  10620.     SWAP am%,bm%
  10621.     SWAP ae%,be%
  10622.   ENDIF
  10623. RETURN
  10624. PROCEDURE separe_chaine(VAR reste$,premier$)
  10625.   ' Separe une chaine en 2 elements, separes par un espace
  10626.   LOCAL p%
  10627.   reste$=TRIM$(reste$)
  10628.   p%=INSTR(reste$," ")
  10629.   IF p%=0
  10630.     premier$=reste$
  10631.     reste$=""
  10632.   ELSE
  10633.     premier$=LEFT$(reste$,PRED(p%))
  10634.     reste$=TRIM$(RIGHT$(reste$,SUB(LEN(reste$),p%)))
  10635.   ENDIF
  10636. RETURN
  10637. '
  10638. ' Procedures diverses
  10639. ' -------------------
  10640. PROCEDURE attente_interruptible(secondes%)
  10641.   ' Attend un certain temps, ou qu'on appuie sur une touche ou la souris
  10642.   LOCAL flag_sortie!
  10643.   MUL secondes%,50                              ! Transforme en 50eme de secondes
  10644.   flag_sortie!=FALSE
  10645.   WHILE secondes%>0 AND (NOT flag_sortie!)
  10646.     IF GEMDOS(11)<>0
  10647.       ~GEMDOS(7)
  10648.       flag_sortie!=TRUE
  10649.     ELSE IF MOUSEK<>0
  10650.       flag_sortie!=TRUE
  10651.     ENDIF
  10652.     PAUSE 1
  10653.     DEC secondes%
  10654.   WEND
  10655.   GOSUB vide_buffer_clavier
  10656. RETURN
  10657. PROCEDURE teste_enregistrement2
  10658.   autodestruction_flag!=FALSE          ! I hate to imagine what that was supposed to do. /sjx.
  10659.   flag_registered2!=TRUE
  10660.   ' LOCAL a,b,a$,c$,i,user
  10661.   ' IF FN exist(npath_prog$+treg_str2$)
  10662.   '   OPEN "i",#0,npath_prog$+treg_str2$
  10663.   '    IF LOF(#0)=1032
  10664.   '     c$=STRING$(1032,0)
  10665.   '   BGET #0,V:c$,1032
  10666.   '    a=0                               ! Teste la somme de controle
  10667.   '     b=1
  10668.   '      FOR i=0 TO 1027
  10669.   '     a=a+b*(BYTE{ADD(V:c$,i)} XOR 255)
  10670.   '      b=b+1
  10671.   '     NEXT i
  10672.   '   IF a=LONG{V:c$+1028}
  10673.   '      user=LONG{V:c$+512}
  10674.   '       a=&H5BA3
  10675.   '     a$=""
  10676.   '      FOR i=0 TO 510 STEP 2
  10677.   '         b=CARD{V:c$+i}
  10678.   '    a$=a$+MKI$(b XOR a)
  10679.   '          a=(a-b) AND &HFFFF
  10680.   '  NEXT i
  10681.   '   IF a$=MID$(c$,517,512) AND user<>10
  10682.   '      flag_registered2!=TRUE
  10683.   '     ELSE
  10684.   '        GOTO erreur_user.reg2
  10685.   '       ENDIF
  10686.   '        flag_registered2!=(a$=MID$(c$,517,512) AND user<>10)
  10687.   '  IF user=10
  10688.   '     autodestruction_flag!=TRUE            ! Peut servir...
  10689.   '    ENDIF
  10690.   '   ELSE
  10691.   '      GOTO erreur_user.reg2
  10692.   '     ENDIF
  10693.   '    ELSE
  10694.   '    erreur_user.reg2:
  10695.   '    ENDIF
  10696.   '    CLOSE #0
  10697.   '  ENDIF
  10698. RETURN
  10699. PROCEDURE edite_chaine(aaaa$,xxxx%,yyyy%,llll%,tttt%)
  10700.   ' Edite la chaine a$ en (xxxx%,yyyy%), longueur max llll%, type tttt%
  10701.   ' tttt% : 0=alphanum, 1=hexa, 2=decimal, 3=virgule flo, 4=virgule fixe (non fait)
  10702.   ' Renvoie bbbb$
  10703.   LOCAL curs%,cla%,flig%,i%
  10704.   aaaa$=RIGHT$(aaaa$,llll%)
  10705.   WHILE LEN(aaaa$)<llll%
  10706.     IF tttt%=1
  10707.       aaaa$="0"+aaaa$
  10708.     ELSE IF tttt%=0
  10709.       aaaa$=aaaa$+" "
  10710.     ELSE
  10711.       aaaa$=" "+aaaa$
  10712.     ENDIF
  10713.   WEND
  10714.   IF tttt%=0
  10715.     curs%=1
  10716.   ELSE
  10717.     curs%=llll%
  10718.   ENDIF
  10719.   cla%=0
  10720.   GOSUB vide_buffer_clavier
  10721.   REPEAT
  10722.     GOSUB affchaine_notrans(aaaa$,xxxx%,yyyy%,1)
  10723.     GOSUB affchaine_notrans(CHR$(7),ADD(xxxx%,PRED(curs%)),yyyy%,1)
  10724.     GOSUB affchaine_trans(MID$(aaaa$,curs%,1),SHL(ADD(xxxx%,PRED(curs%)),1),yyyy%,0)
  10725.     cla%=INP(2)
  10726.     IF tttt%=1 AND cla%>96 AND cla%<123
  10727.       SUB cla%,32
  10728.     ENDIF
  10729.     SELECT cla%
  10730.     CASE 8      ! Backspace
  10731.       IF curs%>1
  10732.         aaaa$=LEFT$(aaaa$,SUB(curs%,2))+RIGHT$(aaaa$,SUB(llll%,PRED(curs%)))
  10733.         IF tttt%=1
  10734.           aaaa$=aaaa$+"0"
  10735.         ELSE
  10736.           aaaa$=aaaa$+" "
  10737.         ENDIF
  10738.         DEC curs%
  10739.       ENDIF
  10740.     CASE 127    ! Delete
  10741.       aaaa$=LEFT$(aaaa$,PRED(curs%))+RIGHT$(aaaa$,SUB(llll%,curs%))
  10742.       IF tttt%=1
  10743.         aaaa$=aaaa$+"0"
  10744.       ELSE
  10745.         aaaa$=aaaa$+" "
  10746.       ENDIF
  10747.     CASE 203    ! <-
  10748.       IF curs%>1
  10749.         DEC curs%
  10750.       ENDIF
  10751.     CASE 205    ! ->
  10752.       IF curs%<llll%
  10753.         INC curs%
  10754.       ENDIF
  10755.     CASE 32 TO 126
  10756.       IF tttt%=0 OR (tttt%=1 AND ((cla%>47 AND cla%<58) OR (cla%>64 AND cla%<71))) OR (tttt%=2 AND cla%>47 AND cla%<58) OR (tttt%=3 AND ((cla%>47 AND cla%<58) OR (cla%=46 AND INSTR(aaaa$,".")=0)))
  10757.         IF curs%<llll%
  10758.           aaaa$=LEFT$(aaaa$,PRED(curs%))+CHR$(cla%)+MID$(aaaa$,curs%,SUB(llll%,curs%))
  10759.           INC curs%
  10760.           flig%=0
  10761.         ELSE
  10762.           IF flig%=1 AND tttt%<>0
  10763.             aaaa$=RIGHT$(aaaa$+CHR$(cla%),llll%)
  10764.           ELSE
  10765.             aaaa$=LEFT$(aaaa$,PRED(curs%))+CHR$(cla%)
  10766.           ENDIF
  10767.           flig%=1
  10768.         ENDIF
  10769.       ENDIF
  10770.     ENDSELECT
  10771.   UNTIL cla%=13
  10772.   GOSUB affchaine_notrans(aaaa$,xxxx%,yyyy%,1)
  10773.   bbbb$=aaaa$
  10774. RETURN
  10775. PROCEDURE edite_mask1(mmmm1$,mmmm2$,xxxx%,yyyy%,ffff%,tttt%)
  10776.   LOCAL aaaa$,pppp%,aaaa%,kkkk1%,kkkk2%
  10777.   HIDEM
  10778.   pppp%=MUL(tttt%,3)
  10779.   GOTO edite_mask1_aff
  10780.   DO
  10781.     kkkk1%=GEMDOS(7)
  10782.     kkkk2%=ASC(UPPER$(CHR$((kkkk1% AND 127))))  ! Code ascii
  10783.     kkkk1%=SHR(kkkk1%,16) AND 255               ! Code clavier
  10784.     IF kkkk1%=75        ! Fleche gauche
  10785.       pppp%=MAX(PRED(pppp%),MUL(tttt%,3))
  10786.     ELSE IF kkkk1%=77   ! Fleche droite
  10787.       pppp%=MIN(SUCC(pppp%),8)
  10788.     ENDIF
  10789.     IF pppp%=0
  10790.       IF kkkk2%=63      ! Point d'interrogation
  10791.         BYTE{V:mmmm1$}=ffff%
  10792.         BYTE{V:mmmm2$}=0
  10793.         pppp%=1
  10794.       ELSE
  10795.         IF kkkk1%=20                    ! Note vide
  10796.           BYTE{V:mmmm1$}=NOT ffff%
  10797.           BYTE{V:mmmm2$}=0
  10798.           pppp%=1
  10799.         ELSE IF kkkk1%<54               ! Note
  10800.           aaaa%=t_note%(kkkk1%)
  10801.           IF aaaa%<>-1 AND ADD(aaaa%,MUL(octave%,12))<60
  10802.             ADD aaaa%,ADD(MUL(octave%,12),24)           ! Ajuste a la bonne note
  10803.             BYTE{V:mmmm1$}=NOT ffff%
  10804.             BYTE{V:mmmm2$}=aaaa%
  10805.             pppp%=1
  10806.           ENDIF
  10807.         ENDIF
  10808.       ENDIF
  10809.     ELSE IF pppp%>0
  10810.       SELECT kkkk2%
  10811.       CASE 63                     ! ?
  10812.         LONG{SUCC(V:mmmm1$)}=ADD(LONG{SUCC(V:mmmm1$)} AND (NOT SHR(&HF0000000,SHL(PRED(pppp%),2))),ffff% AND SHR(&HF0000000,SHL(PRED(pppp%),2)))
  10813.         LONG{SUCC(V:mmmm2$)}=LONG{SUCC(V:mmmm2$)} AND (NOT SHR(&HF0000000,SHL(PRED(pppp%),2)))
  10814.         pppp%=MIN(SUCC(pppp%),8)
  10815.       CASE 48 TO 57,65 TO 70      ! Hexa
  10816.         aaaa%=SUB(kkkk2%,48)
  10817.         IF kkkk2%>64
  10818.           SUB aaaa%,7
  10819.         ENDIF
  10820.         LONG{SUCC(V:mmmm1$)}=ADD(LONG{SUCC(V:mmmm1$)} AND (NOT SHR(&HF0000000,SHL(PRED(pppp%),2))),(NOT ffff%) AND SHR(&HF0000000,SHL(PRED(pppp%),2)))
  10821.         LONG{SUCC(V:mmmm2$)}=ADD(LONG{SUCC(V:mmmm2$)} AND (NOT SHR(&HF0000000,SHL(PRED(pppp%),2))),SHL(aaaa%,SUB(28,SHL(PRED(pppp%),2))))
  10822.         pppp%=MIN(SUCC(pppp%),8)
  10823.       ENDSELECT
  10824.     ENDIF
  10825.     ' Affichage
  10826.   edite_mask1_aff:
  10827.     IF tttt%=0
  10828.       IF BYTE{V:mmmm1$}=(ffff% AND 255)
  10829.         aaaa$="?  "
  10830.       ELSE
  10831.         IF BYTE{V:mmmm2$}=0
  10832.           aaaa$="---"
  10833.         ELSE
  10834.           aaaa$=MID$(gamme$,SUCC(SHL(BYTE{V:mmmm2$} MOD 12,1)),2)+STR$(SUB(DIV(BYTE{V:mmmm2$},12),2),1)
  10835.         ENDIF
  10836.       ENDIF
  10837.     ELSE
  10838.       aaaa$=""
  10839.     ENDIF
  10840.     FOR aaaa%=MUL(tttt%,2) TO 7
  10841.       IF (SHL(LONG{SUCC(V:mmmm1$)},SHL(aaaa%,2)) AND &H0)=(ffff% AND &H0)
  10842.         aaaa$=aaaa$+"?"
  10843.       ELSE
  10844.         aaaa$=aaaa$+HEX$(SHR(LONG{SUCC(V:mmmm2$)},SUB(28,SHL(aaaa%,2))) AND 15,1)
  10845.       ENDIF
  10846.     NEXT aaaa%
  10847.     aaaa%=pppp%
  10848.     IF tttt%=1
  10849.       SUB aaaa%,3
  10850.     ELSE
  10851.       IF pppp%>0
  10852.         ADD aaaa%,2
  10853.       ENDIF
  10854.     ENDIF
  10855.     GOSUB affchaine_notrans(aaaa$,xxxx%,yyyy%,1)
  10856.     EXIT IF kkkk2%=13
  10857.     GOSUB affchaine_notrans(CHR$(7),ADD(xxxx%,aaaa%),yyyy%,1)
  10858.     GOSUB affchaine_trans(MID$(aaaa$,SUCC(aaaa%),1),SHL(ADD(xxxx%,aaaa%),1),yyyy%,0)
  10859.   LOOP
  10860.   SHOWM
  10861.   zzzz1$=mmmm1$
  10862.   zzzz2$=mmmm2$
  10863. RETURN
  10864. PROCEDURE dialog(tit$,txt$,but$,x%,y%)
  10865.   ' Boite de dialogue. txt$=texte, | pour changer de ligne, but$=boutons, | pour separer les boutons
  10866.   ' x% et y% milieu de la boite, tit$ titre
  10867.   ' Renvoie bouton% (0 - n-1)
  10868.   LOCAL a%,b%,i%,j%,ntxt%,nbut%,oldp%,ox%,ox2%,oy%,oy2%,p%,tmax1%,tmax2%,tx%,ty%
  10869.   LOCAL xm%,xm2%,ym%,km%
  10870.   LOCAL ok!
  10871.   LOCAL ptxt$,pbut$
  10872.   HIDEM
  10873.   '
  10874.   ' Recherche du nombre de lignes de texte, indices et longueurs
  10875.   '
  10876.   ptxt$=""
  10877.   p%=1
  10878.   oldp%=p%
  10879.   ntxt%=1
  10880.   tmax1%=0
  10881.   REPEAT
  10882.     IF MID$(txt$,p%,1)="|"
  10883.       ptxt$=ptxt$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10884.       tmax1%=MAX(tmax1%,SUB(p%,oldp%))
  10885.       oldp%=SUCC(p%)
  10886.       INC ntxt%
  10887.     ENDIF
  10888.     INC p%
  10889.   UNTIL p%>LEN(txt$)
  10890.   ptxt$=ptxt$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10891.   tmax1%=MAX(tmax1%,SUB(p%,oldp%))
  10892.   '
  10893.   ' Recherche du nombre de boutons, indices et longueurs
  10894.   '
  10895.   pbut$=""
  10896.   p%=1
  10897.   oldp%=p%
  10898.   nbut%=1
  10899.   tmax2%=6
  10900.   REPEAT
  10901.     IF MID$(but$,p%,1)="|"
  10902.       pbut$=pbut$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10903.       tmax2%=MAX(tmax2%,SUB(p%,oldp%))
  10904.       oldp%=SUCC(p%)
  10905.       INC nbut%
  10906.     ENDIF
  10907.     INC p%
  10908.   UNTIL p%>LEN(but$)
  10909.   pbut$=pbut$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10910.   tmax2%=MAX(tmax2%,SUB(p%,oldp%))
  10911.   ADD tmax2%,2                                  ! 1 espace de chaque cote du bouton
  10912.   '
  10913.   ' Definition de la taille de la boite
  10914.   '
  10915.   tx%=MAX(ADD(tmax1%,4),MUL(ADD(tmax2%,2),nbut%))
  10916.   ty%=ADD(MUL(ntxt%,8),34)                      ! 1+ 12 + 1+4+(8*l-2)+4+1 + 1+1+8+1+1 +1
  10917.   ox%=MIN(MAX(SUB(SHR(x%,3),SHR(tx%,1)),0),SUB(scr_ncol%,SUCC(tx%)))
  10918.   oy%=MIN(MAX(SUB(y%,SUB(ty%,6)),0),SUB(scr_haut%,ADD(ty%,4)))
  10919.   ox2%=SUB(ADD(ox%,tx%),PRED(MUL(ADD(tmax2%,2),nbut%)))
  10920.   oy2%=ADD(oy%,SUB(ty%,12))
  10921.   '
  10922.   ' Affichage de la boite
  10923.   '
  10924.   GOSUB save_background(SHL(ox%,3),oy%,SHL(SUCC(tx%),3),ADD(ty%,4))
  10925.   GOSUB cadre_int(SUCC(ox%),ADD(oy%,4),PRED(tx%),PRED(ty%),0,0,0,0)
  10926.   GOSUB cadre_int(ox%,oy%,PRED(tx%),PRED(ty%),9,9,10,8)
  10927.   GOSUB cadre_ext(SUCC(ox%),ADD(oy%,14),SUB(tx%,3),ADD(SHL(ntxt%,3),5),1,9,8,10)
  10928.   IF tit$<>""
  10929.     GOSUB affchaine_trans(tit$,SHL(SUCC(ox%),1),ADD(oy%,4),8)
  10930.   ENDIF
  10931.   ' Le texte
  10932.   FOR i%=0 TO PRED(ntxt%)
  10933.     a%=CARD{ADD(V:ptxt$,SHL(i%,2))}
  10934.     b%=CARD{ADD(V:ptxt$,ADD(SHL(i%,2),2))}
  10935.     ' GOSUB affchaine_trans(MID$(txt$,a%,b%),SUB(ADD(SHL(ox%,1),tx%),b%),ADD(ADD(oy%,18),SHL(i%,3)),0)
  10936.     ' Texte centre ----^
  10937.     GOSUB affchaine_trans(MID$(txt$,a%,b%),ADD(SHL(ox%,1),4),ADD(ADD(oy%,18),SHL(i%,3)),0)
  10938.   NEXT i%
  10939.   ' Les boutons
  10940.   FOR i%=0 TO PRED(nbut%)
  10941.     GOSUB cadre_texte_b(MID$(but$,CARD{ADD(V:pbut$,SHL(i%,2))},CARD{ADD(V:pbut$,ADD(SHL(i%,2),2))}),ADD(ox2%,MUL(ADD(tmax2%,2),i%)),oy2%,PRED(tmax2%))
  10942.   NEXT i%
  10943.   '
  10944.   ' Gestion de la souris et du clavier
  10945.   '
  10946.   SHOWM
  10947.   GOSUB wait_mouse(TRUE)
  10948.   bouton%=-1                                    ! Aucun bouton selectionne pour l'instant
  10949.   ok!=FALSE
  10950.   REPEAT
  10951.     REPEAT
  10952.       km%=MOUSEK
  10953.     UNTIL km%<>0 OR GEMDOS(11)<>0               ! Attend qu'on appuie sur le bouton de la souris ou une touche
  10954.     IF km%<>0
  10955.       ' --- Gestion souris ---
  10956.       REPEAT                                    ! Quand on appuie, la selection des boutons suit
  10957.         MOUSE xm%,ym%,km%                       ! la souris jusqu'au relachement
  10958.         xm2%=SHR(xm%,3)
  10959.         a%=DIV(SUB(xm2%,ox2%),ADD(tmax2%,2))
  10960.         b%=SUB(xm2%,ox2%) MOD ADD(tmax2%,2)
  10961.         IF a%>=0 AND a%<nbut% AND b%<tmax2% AND ym%>=oy2% AND ym%<ADD(oy2%,10)  ! On est bien sur un bouton, a% en est son numero
  10962.           IF a%<>bouton%                    ! Si on a change de bouton depuis la derniere fois,
  10963.             IF bouton%>=0                   ! Deselectionne le precedent bouton
  10964.               GOSUB cadre_texte2_b(MID$(but$,CARD{ADD(V:pbut$,SHL(bouton%,2))},CARD{ADD(V:pbut$,ADD(SHL(bouton%,2),2))}),ADD(ox2%,MUL(ADD(tmax2%,2),bouton%)),oy2%,PRED(tmax2%),0)
  10965.             ENDIF
  10966.             bouton%=a%
  10967.             GOSUB cadre_texte2_b(MID$(but$,CARD{ADD(V:pbut$,SHL(bouton%,2))},CARD{ADD(V:pbut$,ADD(SHL(bouton%,2),2))}),ADD(ox2%,MUL(ADD(tmax2%,2),bouton%)),oy2%,PRED(tmax2%),1)
  10968.             ok!=TRUE
  10969.           ENDIF
  10970.         ELSE                                ! On n'est plus sur un bouton
  10971.           IF bouton%>=0                     ! Deselectionne le precedent bouton
  10972.             GOSUB cadre_texte2_b(MID$(but$,CARD{ADD(V:pbut$,SHL(bouton%,2))},CARD{ADD(V:pbut$,ADD(SHL(bouton%,2),2))}),ADD(ox2%,MUL(ADD(tmax2%,2),bouton%)),oy2%,PRED(tmax2%),0)
  10973.           ENDIF
  10974.           bouton%=-1
  10975.           ok!=FALSE
  10976.         ENDIF
  10977.         SHOWM
  10978.       UNTIL km%=0
  10979.     ELSE
  10980.       ' --- Gestion clavier ---
  10981.       a%=GEMDOS(7) AND 255                      ! Caractere ASCII
  10982.       IF a%=>48 AND a%<58                       ! <1> - <0>
  10983.         a%=SUB(a%,39) MOD 10                    ! "1" > 0, ... "9" > 8, "0" > 9
  10984.         IF a%<nbut%                             ! a% numero du bouton selectionne
  10985.           IF bouton%>=0                         ! Deselectionne le precedent bouton
  10986.             GOSUB cadre_texte2_b(MID$(but$,CARD{ADD(V:pbut$,SHL(bouton%,2))},CARD{ADD(V:pbut$,ADD(SHL(bouton%,2),2))}),ADD(ox2%,MUL(ADD(tmax2%,2),bouton%)),oy2%,PRED(tmax2%),0)
  10987.           ENDIF
  10988.           bouton%=a%
  10989.           GOSUB cadre_texte2_b(MID$(but$,CARD{ADD(V:pbut$,SHL(bouton%,2))},CARD{ADD(V:pbut$,ADD(SHL(bouton%,2),2))}),ADD(ox2%,MUL(ADD(tmax2%,2),bouton%)),oy2%,PRED(tmax2%),1)
  10990.         ENDIF
  10991.         ok!=FALSE
  10992.       ELSE IF a%=13 AND bouton%>=0              ! <Return>
  10993.         ok!=TRUE
  10994.       ENDIF
  10995.       SHOWM
  10996.     ENDIF
  10997.   UNTIL bouton%>=0 AND ok!
  10998.   '
  10999.   GOSUB restore_background
  11000. RETURN
  11001. PROCEDURE wait_mouse(flag!)
  11002.   IF flag!
  11003.     REPEAT
  11004.     UNTIL MOUSEK=0
  11005.   ENDIF
  11006. RETURN
  11007. PROCEDURE bee(flag!)
  11008.   ' Souris en forme de fleche (False) ou d'abeille (True)
  11009.   HIDEM
  11010.   DEFMOUSE flag! AND 2
  11011.   SHOWM
  11012. RETURN
  11013. PROCEDURE intel_w(aaaa%)
  11014.   LOCAL bbbb%
  11015.   bbbb%=BYTE{SUCC(aaaa%)}
  11016.   BYTE{SUCC(aaaa%)}=BYTE{aaaa%}
  11017.   BYTE{aaaa%}=bbbb%
  11018. RETURN
  11019. PROCEDURE intel_3(aaaa%)
  11020.   LOCAL bbbb%
  11021.   bbbb%=BYTE{ADD(aaaa%,2)}
  11022.   BYTE{ADD(aaaa%,2)}=BYTE{aaaa%}
  11023.   BYTE{aaaa%}=bbbb%
  11024. RETURN
  11025. PROCEDURE intel_l(aaaa%)
  11026.   LOCAL bbbb%
  11027.   bbbb%=BYTE{ADD(aaaa%,3)}
  11028.   BYTE{ADD(aaaa%,3)}=BYTE{aaaa%}
  11029.   BYTE{aaaa%}=bbbb%
  11030.   bbbb%=BYTE{SUCC(aaaa%)}
  11031.   BYTE{SUCC(aaaa%)}=BYTE{ADD(aaaa%,2)}
  11032.   BYTE{ADD(aaaa%,2)}=bbbb%
  11033. RETURN
  11034. PROCEDURE mem_rotation(aaaa%,llll%,dddd%)
  11035.   ' Rotation de memoire :
  11036.   ' adresse aaaa%, longueur llll%, deplacement dddd%
  11037.   LOCAL bbbb%,tttt%,adr_t%
  11038.   IF llll%>0
  11039.     tttt%=MAX(16384,SUB(FRE(0),16384)) AND -4   ! Laisse toujours 16 Ko de libre mais min 16 Ko.
  11040.     DIM mem_rotation%(PRED(SHR(tttt%,2)))       ! Deplacement par pas de tttt% bytes
  11041.     adr_t%=V:mem_rotation%(0)
  11042.     dddd%=dddd% MOD llll%                       ! Meilleure direction de deplacement
  11043.     IF ABS(dddd%)>SHR(llll%,2)
  11044.       SUB dddd%,MUL(llll%,SGN(dddd%))
  11045.     ENDIF
  11046.     IF dddd%=>0
  11047.       WHILE dddd%>0                             ! Deplacement positif (vers la droite)
  11048.         bbbb%=MIN(dddd%,tttt%)
  11049.         ~C:g_bmove%(L:ADD(aaaa%,SUB(llll%,bbbb%)),L:adr_t%,L:bbbb%)
  11050.         ~C:g_bmove%(L:aaaa%,L:ADD(aaaa%,bbbb%),L:SUB(llll%,bbbb%))
  11051.         ~C:g_bmove%(L:adr_t%,L:aaaa%,L:bbbb%)
  11052.         SUB dddd%,bbbb%
  11053.       WEND
  11054.     ELSE
  11055.       WHILE dddd%<0                             ! Deplacement negatif (vers la gauche)
  11056.         bbbb%=MIN(-dddd%,tttt%)
  11057.         ~C:g_bmove%(L:aaaa%,L:adr_t%,L:bbbb%)
  11058.         ~C:g_bmove%(L:ADD(aaaa%,bbbb%),L:aaaa%,L:SUB(llll%,bbbb%))
  11059.         ~C:g_bmove%(L:adr_t%,L:ADD(aaaa%,SUB(llll%,bbbb%)),L:bbbb%)
  11060.         ADD dddd%,bbbb%
  11061.       WEND
  11062.     ENDIF
  11063.     ERASE mem_rotation%()
  11064.   ENDIF
  11065. RETURN
  11066. PROCEDURE help(page%)
  11067.   LOCAL i%,j%,k%,xp%,yp%,xm%,ym%,km%,flag_fin!,a$
  11068.   HIDEM
  11069.   flag_fin!=FALSE
  11070.   xp%=SUB(SHR(scr_ncol%,1),36)
  11071.   yp%=SUB(SHR(scr_haut%,1),81)
  11072.   GOSUB cadre_texte("PREVIOUS PAGE",xp%,ADD(yp%,152),32)
  11073.   GOSUB cadre_texte("EXIT",ADD(xp%,33),ADD(yp%,152),5)
  11074.   GOSUB cadre_texte("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32)
  11075.   pmax%=&H7FFFFFFF
  11076.   GOSUB aff_helppage(page%,xp%,yp%)
  11077.   REPEAT
  11078.     SHOWM
  11079.     MOUSE xm%,ym%,km%
  11080.     IF ym%>ADD(yp%,162) OR ym%<ADD(yp%,151)
  11081.       km%=0
  11082.     ENDIF
  11083.     DIV xm%,8
  11084.     IF km%<>0
  11085.       IF xm%>PRED(xp%) AND xm%<ADD(xp%,33) AND page%>0
  11086.         GOSUB cadre_texte2("PREVIOUS PAGE",xp%,ADD(yp%,152),32,1)
  11087.         GOSUB wait_mouse(TRUE)
  11088.         DEC page%
  11089.         GOSUB aff_helppage(page%,xp%,yp%)
  11090.         GOSUB cadre_texte("PREVIOUS PAGE",xp%,ADD(yp%,152),32)
  11091.       ELSE IF xm%>ADD(xp%,38) AND xm%<ADD(xp%,72) AND page%<help_pmax%
  11092.         GOSUB cadre_texte2("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32,1)
  11093.         GOSUB wait_mouse(TRUE)
  11094.         INC page%
  11095.         GOSUB aff_helppage(page%,xp%,yp%)
  11096.         GOSUB cadre_texte("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32)
  11097.       ELSE IF xm%>ADD(xp%,32) AND xm%<ADD(xp%,39)
  11098.         flag_fin!=TRUE
  11099.       ENDIF
  11100.     ENDIF
  11101.     IF GEMDOS(11)<>0
  11102.       k%=SHR(GEMDOS(7),16) AND 255
  11103.       GOSUB vide_buffer_clavier
  11104.       SELECT k%
  11105.       CASE 1,28,114
  11106.         flag_fin!=TRUE
  11107.       CASE 75
  11108.         IF page%>0
  11109.           GOSUB cadre_texte2("PREVIOUS PAGE",xp%,ADD(yp%,152),32,1)
  11110.           DEC page%
  11111.           GOSUB aff_helppage(page%,xp%,yp%)
  11112.           GOSUB cadre_texte("PREVIOUS PAGE",xp%,ADD(yp%,152),32)
  11113.         ENDIF
  11114.       CASE 77
  11115.         IF page%<help_pmax%
  11116.           GOSUB cadre_texte2("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32,1)
  11117.           INC page%
  11118.           GOSUB aff_helppage(page%,xp%,yp%)
  11119.           GOSUB cadre_texte("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32)
  11120.         ENDIF
  11121.       ENDSELECT
  11122.     ENDIF
  11123.   UNTIL flag_fin!
  11124.   GOSUB cadre_texte2("EXIT",ADD(xp%,33),ADD(yp%,152),5,1)
  11125.   GOSUB wait_mouse(TRUE)
  11126.   GOSUB cadre_texte("EXIT",ADD(xp%,33),ADD(yp%,152),5)
  11127.   GOSUB affiche_panneau_principal
  11128.   GOSUB aff_message("GRAOUMF TRACKER v"+STR$(gtk_version%/10000)+mes_registred$)
  11129. RETURN
  11130. PROCEDURE aff_helppage(page%,xp%,yp%)
  11131.   LOCAL j%
  11132.   GOSUB cadre_int(xp%,yp%,71,151,8,8,9,8)
  11133.   GOSUB affiche_one_graoumf_logo(ADD(SHL(xp%,3),128),ADD(yp%,16))
  11134.   FOR j%=0 TO 23
  11135.     GOSUB affchaine_trans(help$(j%,page%),SHL(SUCC(xp%),1),ADD(ADD(yp%,4),MUL(j%,6)),10)
  11136.   NEXT j%
  11137. RETURN
  11138. PROCEDURE prefs                         !!!
  11139.   GOSUB cadre_int(2,16,75,167,9,9,10,8)
  11140.   ~GEMDOS(7)
  11141.   GOSUB affiche_panneau_principal
  11142. RETURN
  11143. PROCEDURE clear_mem(aaaa%,llll%)
  11144.   ' Vide une partie de la memoire (methode rapide en GfA)
  11145.   ' aaaa% = adresse, llll% = longueur
  11146.   ' Ne fait rien si longueur <= 0
  11147.   LOCAL l_clr%
  11148.   ~FRE(0)
  11149.   IF llll%>0
  11150.     l_clr%=1
  11151.     BYTE{aaaa%}=0                               ! Efface le premier octet
  11152.     WHILE l_clr%<=SHR(llll%,1)                  ! Efface au moins la moitie du
  11153.       BMOVE aaaa%,ADD(aaaa%,l_clr%),l_clr%      ! buffer par doublages successifs
  11154.       ADD l_clr%,l_clr%                         ! de la surface effacee
  11155.     WEND
  11156.     BMOVE aaaa%,ADD(aaaa%,l_clr%),SUB(llll%,l_clr%)     ! Le reste
  11157.   ENDIF
  11158. RETURN
  11159. PROCEDURE snapshot
  11160.   ' Effectue un snapshot de l'ecran au format TGA
  11161.   LOCAL a%,c1%,c2%,c3%,i%,j%,x1%,x2%,y1%,y2%
  11162.   LOCAL km%,xm%,ym%
  11163.   LOCAL a$,b$,c1$,c2$,c3$,header$,n$
  11164.   '
  11165.   ' Prend le morceau de l'ecran a capturer
  11166.   '
  11167.   SHOWM
  11168.   REPEAT
  11169.     MOUSE xm%,ym%,km%
  11170.   UNTIL km%<>0
  11171.   x1%=xm%
  11172.   y1%=ym%
  11173.   GOSUB wait_mouse(TRUE)
  11174.   REPEAT
  11175.     MOUSE xm%,ym%,km%
  11176.   UNTIL km%<>0
  11177.   a%=MIN(x1%,xm%)
  11178.   x2%=MAX(x1%,xm%)
  11179.   x1%=a%
  11180.   a%=MIN(y1%,ym%)
  11181.   y2%=MAX(y1%,ym%)
  11182.   y1%=a%
  11183.   INC snapshot_number%                          ! Nouveau snapshot
  11184.   '
  11185.   ' Le nom
  11186.   '
  11187.   a%=snapshot_number%
  11188.   n$=""
  11189.   FOR i%=1 TO 4
  11190.     n$=RIGHT$(STR$(a%),1)+n$
  11191.     DIV a%,10
  11192.   NEXT i%
  11193.   n$=npath_div$+"SNAP"+n$+".TGA"
  11194.   OPEN "o",#1,n$
  11195.   IF snapshot_format%=0
  11196.     '
  11197.     ' Format TGA 16 couleurs avec palette
  11198.     '
  11199.     ' --- Le header ---
  11200.     header$=CHR$(0)+CHR$(1)+CHR$(1)
  11201.     header$=header$+MKI$(0)+MKI$(16)+CHR$(24)
  11202.     header$=header$+MKI$(0)+MKI$(0)
  11203.     header$=header$+MKI$(SUCC(SUB(x2%,x1%)))+MKI$(SUCC(SUB(y2%,y1%)))
  11204.     header$=header$+CHR$(4)+CHR$(&X100000)
  11205.     GOSUB intel_w(ADD(V:header$,3))
  11206.     GOSUB intel_w(ADD(V:header$,5))
  11207.     GOSUB intel_w(ADD(V:header$,8))
  11208.     GOSUB intel_w(ADD(V:header$,10))
  11209.     GOSUB intel_w(ADD(V:header$,12))
  11210.     GOSUB intel_w(ADD(V:header$,14))
  11211.     BPUT #1,V:header$,LEN(header$)
  11212.     ' --- La palette ---
  11213.     a$=""
  11214.     FOR i%=0 TO 15
  11215.       a$=a$+CHR$(PEEK(ADD(&HFFFF9803,SHL(i%,2))))
  11216.       a$=a$+CHR$(PEEK(ADD(&HFFFF9801,SHL(i%,2))))
  11217.       a$=a$+CHR$(PEEK(ADD(&HFFFF9800,SHL(i%,2))))
  11218.     NEXT i%
  11219.     BPUT #1,V:a$,LEN(a$)
  11220.     ' --- L'image ---
  11221.     a$=STRING$(SHR(ADD(SUB(x2%,x1%),2),1),0)
  11222.     FOR j%=y1% TO y2%
  11223.       a%=V:a$
  11224.       FOR i%=x1% TO x2% STEP 2
  11225.         BYTE{a%}=ADD(SHL(PTST(i%,j%),4),PTST(SUCC(i%),j%))
  11226.         INC a%
  11227.       NEXT i%
  11228.       BPUT #1,V:a$,LEN(a$)
  11229.     NEXT j%
  11230.   ELSE
  11231.     '
  11232.     ' Format TGA 24 bits
  11233.     '
  11234.     ' --- Le header ---
  11235.     header$=CHR$(0)+CHR$(0)+CHR$(2)
  11236.     header$=header$+MKI$(0)+MKI$(0)+CHR$(0)
  11237.     header$=header$+MKI$(0)+MKI$(0)
  11238.     header$=header$+MKI$(SUCC(SUB(x2%,x1%)))+MKI$(SUCC(SUB(y2%,y1%)))
  11239.     header$=header$+CHR$(24)+CHR$(&X100000)
  11240.     GOSUB intel_w(ADD(V:header$,3))
  11241.     GOSUB intel_w(ADD(V:header$,5))
  11242.     GOSUB intel_w(ADD(V:header$,8))
  11243.     GOSUB intel_w(ADD(V:header$,10))
  11244.     GOSUB intel_w(ADD(V:header$,12))
  11245.     GOSUB intel_w(ADD(V:header$,14))
  11246.     BPUT #1,V:header$,LEN(header$)
  11247.     ' --- L'image ---
  11248.     c1$=""
  11249.     c2$=""
  11250.     c3$=""
  11251.     FOR i%=0 TO 15
  11252.       c1$=c1$+CHR$(PEEK(ADD(&HFFFF9803,SHL(i%,2))))
  11253.       c2$=c2$+CHR$(PEEK(ADD(&HFFFF9801,SHL(i%,2))))
  11254.       c3$=c3$+CHR$(PEEK(ADD(&HFFFF9800,SHL(i%,2))))
  11255.     NEXT i%
  11256.     a$=STRING$(MUL(SUCC(SUB(x2%,x1%)),3),0)
  11257.     b$=""
  11258.     FOR j%=y1% TO y2%
  11259.       a%=V:a$
  11260.       c1%=V:c1$
  11261.       c2%=V:c2$
  11262.       c3%=V:c3$
  11263.       FOR i%=x1% TO x2%
  11264.         b%=PTST(i%,j%)
  11265.         BYTE{a%}=BYTE{ADD(c1%,b%)}
  11266.         INC a%
  11267.         BYTE{a%}=BYTE{ADD(c2%,b%)}
  11268.         INC a%
  11269.         BYTE{a%}=BYTE{ADD(c3%,b%)}
  11270.         INC a%
  11271.       NEXT i%
  11272.       b$=b$+a$
  11273.       IF LEN(b$)>SUB(32700,LEN(a$)) OR j%=y2%
  11274.         BPUT #1,V:b$,LEN(b$)
  11275.         b$=""
  11276.       ENDIF
  11277.     NEXT j%
  11278.   ENDIF
  11279.   CLOSE #1
  11280. RETURN
  11281. PROCEDURE rec_result(a$,crlf!)
  11282.   ' Enregistre une chaine dans le fichier resultat.
  11283.   ' Ecran pour l'instant.
  11284.   IF NOT flag_autoload!
  11285.     PRINT a$;
  11286.     IF crlf!
  11287.       PRINT
  11288.     ENDIF
  11289.   ENDIF
  11290. RETURN
  11291. PROCEDURE decale_sample(i%,nbs%,adi%)
  11292.   ' adi$ commence au sample 1 et contient des adresses
  11293.   LOCAL a%,b%,c%,d%,j%,pt%
  11294.   a%=FN length(i%)
  11295.   d%=FN adresse(i%)
  11296.   b%=ADD(a%,d%)
  11297.   pt%=LONG{ADD(adi%,SHL(PRED(i%),2))}
  11298.   IF a%>0
  11299.     j%=i%                       ! Scanne les samples suivants
  11300.     WHILE j%<nbs%
  11301.       c%=LONG{ADD(adi%,SHL(j%,2))}
  11302.       EXIT IF c%<b% AND c%>d%
  11303.       INC j%
  11304.     WEND
  11305.     IF j%<nbs% OR flag_keep_buffer!     ! On a trouve un sample qui va se faire ecraser alors on tourne
  11306.       GOSUB mem_rotation(d%,SUB(ADD(pt%,a%),d%),a%)
  11307.       IF i%<nbs%                        ! Repositionne les samples qui etaient avant celui-la
  11308.         FOR j%=SHL(i%,2) TO SHL(PRED(nbs%),2) STEP 4
  11309.           IF LONG{ADD(adi%,j%)}<pt%
  11310.             LONG{ADD(adi%,j%)}=ADD(LONG{ADD(adi%,j%)},a%)
  11311.           ENDIF
  11312.         NEXT j%
  11313.       ENDIF
  11314.       ADD translate%,a%
  11315.     ELSE                        ! Pas de probleme, on effectue une simple copie et un deplacement du reste
  11316.       IF i%<255
  11317.         ~C:g_bmove%(L:d%,L:b%,L:SUB(FN adr_buffer,d%))
  11318.       ENDIF
  11319.       ~C:g_bmove%(L:pt%,L:d%,L:a%)
  11320.     ENDIF
  11321.     IF i%<255                   ! Reajuste les adresses des samples suivants
  11322.       FOR j%=SHL(SUCC(i%),2) TO &H3FC STEP 4
  11323.         LONG{ADD(r_adr_sample%,j%)}=ADD(LONG{ADD(r_adr_sample%,j%)},a%)
  11324.       NEXT j%
  11325.     ENDIF
  11326.   ENDIF
  11327. RETURN
  11328. PROCEDURE next_line
  11329.   SELECT line_step%
  11330.   CASE -255 TO 255
  11331.     ADD posligne%,line_step%
  11332.   CASE 256
  11333.     GOSUB cherche_next_line(&HFFFFFFFF,&HFF)
  11334.   CASE 257
  11335.     GOSUB cherche_next_line(&HFF000000,&H0)
  11336.   CASE 258
  11337.     GOSUB cherche_next_line(&HFFFF,&H0)
  11338.   CASE 259
  11339.     GOSUB cherche_next_line(&H0,&HFF)
  11340.   ENDSELECT
  11341.   WHILE posligne%=>FN nbr_lines3
  11342.     SUB posligne%,FN nbr_lines3
  11343.   WEND
  11344.   WHILE posligne%<0
  11345.     ADD posligne%,FN nbr_lines3
  11346.   WEND
  11347.   GOSUB affiche_c_pattern
  11348. RETURN
  11349. PROCEDURE cherche_next_line(mask1%,mask2%)
  11350.   LOCAL a%,b%,adr%,start%,ligne%
  11351.   start%=posligne%
  11352.   ligne%=start%
  11353.   REPEAT
  11354.     ligne%=SUCC(ligne%) MOD FN nbr_lines3
  11355.     adr%=FN adr_strk(songpos%,ligne%,preset&(curs_col%,n_preset%))
  11356.     a%=LONG{adr%} AND mask1%
  11357.     b%=BYTE{ADD(adr%,4)} AND mask2%
  11358.   UNTIL a%<>0 OR b%<>0 OR ligne%=start%
  11359.   posligne%=ligne%
  11360. RETURN
  11361. PROCEDURE curseur_a_gauche
  11362.   DEC curs_x%
  11363.   IF curs_x%<0
  11364.     curs_x%=VAL(MID$("268",SUCC(type_affpiste%),1))
  11365.     DEC curs_col%
  11366.     IF curs_col%<0
  11367.       curs_col%=PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  11368.     ENDIF
  11369.   ENDIF
  11370.   GOSUB affiche_c_pattern
  11371. RETURN
  11372. PROCEDURE curseur_a_droite
  11373.   INC curs_x%
  11374.   IF curs_x%>VAL(MID$("268",SUCC(type_affpiste%),1))
  11375.     curs_x%=0
  11376.     INC curs_col%
  11377.     IF curs_col%>PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  11378.       curs_col%=0
  11379.     ENDIF
  11380.   ENDIF
  11381.   GOSUB affiche_c_pattern
  11382. RETURN
  11383. PROCEDURE edit_mode_on
  11384.   edit%=1
  11385.   CARD{r_current_edit_mode%}=1
  11386. RETURN
  11387. PROCEDURE edit_mode_off
  11388.   edit%=0
  11389.   CARD{r_current_edit_mode%}=0
  11390. RETURN
  11391. PROCEDURE play_pattern_bidon
  11392.   DPOKE r_mod_songrep%,1
  11393.   DPOKE r_mod_songlen%,2
  11394.   DPOKE r_mod_songpos%,0
  11395.   DPOKE r_mod_numpat%,256
  11396.   DPOKE r_mod_patrep%,0
  11397.   LPOKE r_adr_module%,V:module_bidon%(0)
  11398.   LPOKE r_adr_song%,V:song_bidon%(0)
  11399.   DPOKE r_mod_linepos%,0
  11400.   DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  11401. RETURN
  11402. PROCEDURE play_song(a!)
  11403.   GOSUB play_song2(a!)
  11404.   GOSUB aff_ps_pp_e
  11405.   GOSUB aff_message("Playing song...")
  11406. RETURN
  11407. PROCEDURE play_song2(a!)
  11408.   LOCAL old_play_mode%
  11409.   old_play_mode%=play%
  11410.   IF old_play_mode%=0 OR (NOT a!)
  11411.     GOSUB stop_voices
  11412.     play%=1
  11413.     CARD{r_current_play_mode%}=1
  11414.     LPOKE r_adr_module%,V:module&(0)
  11415.     LPOKE r_adr_song%,V:song&(0)
  11416.     DPOKE r_mod_songrep%,module&(102)
  11417.     DPOKE r_mod_songlen%,module&(101)
  11418.     DPOKE r_mod_songpos%,songpos%
  11419.     DPOKE r_mod_numpat%,song&(songpos%)
  11420.     IF a!
  11421.       DPOKE r_mod_linepos%,posligne%
  11422.     ELSE
  11423.       DPOKE r_mod_linepos%,0
  11424.     ENDIF
  11425.     DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  11426.     debut_temps%=TIMER
  11427.   ELSE
  11428.     play%=1
  11429.     CARD{r_current_play_mode%}=1
  11430.     LPOKE r_adr_module%,V:module&(0)
  11431.     LPOKE r_adr_song%,V:song&(0)
  11432.     DPOKE r_mod_songrep%,module&(102)
  11433.     DPOKE r_mod_songlen%,module&(101)
  11434.   ENDIF
  11435.   IF edit%=0
  11436.     SLPOKE &HFFFF983C,&HE00000  ! Vert
  11437.   ENDIF
  11438. RETURN
  11439. PROCEDURE play_pattern(a!)
  11440.   LOCAL old_play_mode%
  11441.   old_play_mode%=play%
  11442.   IF old_play_mode%=0 OR (NOT a!)
  11443.     GOSUB stop_voices
  11444.     play%=2
  11445.     CARD{r_current_play_mode%}=2
  11446.     LPOKE r_adr_module%,V:module&(0)
  11447.     LPOKE r_adr_song%,V:song&(0)
  11448.     DPOKE r_mod_songrep%,songpos%
  11449.     DPOKE r_mod_songlen%,SUCC(songpos%)
  11450.     DPOKE r_mod_songpos%,songpos%
  11451.     DPOKE r_mod_numpat%,song&(songpos%)
  11452.     IF a!
  11453.       DPOKE r_mod_linepos%,posligne%
  11454.     ELSE
  11455.       DPOKE r_mod_linepos%,0
  11456.     ENDIF
  11457.     DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  11458.     debut_temps%=TIMER
  11459.   ELSE
  11460.     play%=2
  11461.     CARD{r_current_play_mode%}=2
  11462.     LPOKE r_adr_module%,V:module&(0)
  11463.     LPOKE r_adr_song%,V:song&(0)
  11464.     DPOKE r_mod_songrep%,songpos%
  11465.     DPOKE r_mod_songlen%,SUCC(songpos%)
  11466.   ENDIF
  11467.   GOSUB aff_ps_pp_e
  11468.   GOSUB aff_message("Playing pattern...")
  11469.   IF edit%=0
  11470.     SLPOKE &HFFFF983C,&HFF800000  ! Jaune
  11471.   ENDIF
  11472. RETURN
  11473. PROCEDURE stop_voices
  11474.   LOCAL i%
  11475.   FOR i%=0 TO PRED(nbr_track%)
  11476.     LONG{ADD(V:pattern_bidon%(8),MUL(i%,5))}=0
  11477.   NEXT i%
  11478.   CARD{r_current_play_mode%}=0
  11479.   GOSUB play_pattern_bidon
  11480.   DPOKE r_flag_stop_voices%,1
  11481.   play%=0
  11482.   IF edit%=0
  11483.     SLPOKE &HFFFF983C,&HFFFF00FF  ! Blanc
  11484.   ELSE
  11485.     SLPOKE &HFFFF983C,&HFF        ! Bleu
  11486.   ENDIF
  11487.   REPEAT
  11488.   UNTIL DPEEK(r_flag_stop_voices%)=0
  11489. RETURN
  11490. PROCEDURE stop_edit
  11491.   IF play%<>0
  11492.     IF play%=1
  11493.       GOSUB aff_message("Song stopped.")
  11494.     ELSE
  11495.       GOSUB aff_message("Pattern stopped.")
  11496.     ENDIF
  11497.     GOSUB stop_voices
  11498.     GOSUB edit_mode_off
  11499.     SLPOKE &HFFFF983C,&HFFFF00FF                ! Blanc
  11500.     IF NOT flag_cpu_display!
  11501.       GOSUB cadre_int(75,140,3,7,9,9,9,9)       ! Efface le temps machine si on ne le demande pas en mode Stop
  11502.     ENDIF
  11503.   ELSE
  11504.     GOSUB stop_voices
  11505.     IF edit%=0
  11506.       GOSUB edit_mode_on
  11507.       SLPOKE &HFFFF983C,&HFF                    ! Bleu
  11508.       GOSUB aff_message("Edit mode activated.")
  11509.     ELSE
  11510.       GOSUB edit_mode_off
  11511.       SLPOKE &HFFFF983C,&HFFFF00FF              ! Blanc
  11512.       GOSUB aff_message("Edit mode deactivated.")
  11513.     ENDIF
  11514.   ENDIF
  11515.   GOSUB aff_ps_pp_e
  11516. RETURN
  11517. PROCEDURE kill_sample(s%)
  11518.   GOSUB stop_voices
  11519.   GOSUB chg_taille_sample(s%,0)
  11520.   a$="SAMP"+MKL$(64)+MKI$(s%)+SPACE$(28)+MKI$(0)+MKI$(&HFFFF)+MKI$(8)+MKI$(8363)+MKL$(0)+MKL$(0)+MKL$(2)+MKI$(0)+MKI$(0)+MKI$(0)
  11521.   BMOVE V:a$,FN adrsamchk(s%),64
  11522. RETURN
  11523. PROCEDURE clear_patterns2
  11524.   ' Se contente de reduire les patterns a leur taille minimum
  11525.   LOCAL a%,b%,c%,i%,a$
  11526.   c%=1                                          ! 1 seule ligne pour tous les patterns vides
  11527.   b%=FN zone_start
  11528.   a%=ADD(MUL(MUL(c%,nbr_track%),5),32)
  11529.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(c%)+MKI$(nbr_track%)
  11530.   FOR i%=0 TO 255
  11531.     CARD{ADD(V:a$,8)}=i%
  11532.     BMOVE V:a$,b%,LEN(a$)
  11533.     GOSUB chg_pat_chunkadr(i%,b%)
  11534.     ADD b%,a%
  11535.   NEXT i%
  11536.   bl_start&=0
  11537.   bl_end&=0
  11538.   bl_pat&=0
  11539. RETURN
  11540. PROCEDURE clear_patterns
  11541.   LOCAL i%
  11542.   GOSUB clear_patterns2
  11543.   FOR i%=0 TO 255
  11544.     GOSUB clear_mem(FN adr_pat(i%),MUL(MUL(FN nbr_track(i%),FN nbr_lines(i%)),5))
  11545.   NEXT i%
  11546.   GOSUB garbage_collection
  11547. RETURN
  11548. PROCEDURE clear_song(flag!)
  11549.   ' Efface la song et les patterns
  11550.   ' Si flag! est faux, songname n'est pas efface
  11551.   LOCAL a%,b%,i%
  11552.   GOSUB stop_voices
  11553.   ARRAYFILL song&(),0
  11554.   GOSUB clear_patterns
  11555.   IF flag!
  11556.     FOR i%=2 TO 97
  11557.       module&(i%)=&H2020
  11558.     NEXT i%
  11559.   ENDIF
  11560.   module&(101)=1
  11561.   module&(102)=0
  11562.   songpos%=0
  11563. RETURN
  11564. PROCEDURE clear_samples
  11565.   ' Efface les samples
  11566.   GOSUB stop_voices
  11567.   GOSUB clear_samples2
  11568.   sample%=1
  11569. RETURN
  11570. PROCEDURE clear_samples2
  11571.   LOCAL i%,j%,a$
  11572.   j%=ADD(FN env_chunkadr(63,2),FN env_chunklen(63,2))
  11573.   a$="SAMP"+MKL$(64)+MKI$(0)+SPACE$(28)+MKI$(0)+MKI$(&HFFFF)+MKI$(8)+MKI$(8363)+MKL$(0)+MKL$(0)+MKL$(2)+MKI$(0)+MKI$(0)+MKI$(0)
  11574.   FOR i%=0 TO 255
  11575.     LONG{ADD(r_adr_sample%,SHL(i%,2))}=ADD(j%,MUL(i%,64))
  11576.     BMOVE V:a$,LONG{ADD(r_adr_sample%,SHL(i%,2))},64
  11577.     CARD{ADD(LONG{ADD(r_adr_sample%,SHL(i%,2))},8)}=i%
  11578.   NEXT i%
  11579.   GOSUB garbage_collection
  11580. RETURN
  11581. PROCEDURE clear_instr
  11582.   ' Efface les instruments (seulement les instr+env, pas les samples)
  11583.   LOCAL a%,b%,i%,j%
  11584.   FOR i%=0 TO 255
  11585.     instrset%(0,i%)=&H494E5354                  ! 'INST'
  11586.     instrset%(1,i%)=316                         ! Taille du chunk
  11587.     instrset%(2,i%)=ADD(SHL(i%,16),&H2020)      ! Numero + Nom
  11588.     FOR j%=3 TO 8
  11589.       instrset%(j%,i%)=&H20202020               ! Nom
  11590.     NEXT j%
  11591.     instrset%(9,i%)=&H20200000                  ! Nom + Type (sample)
  11592.     instrset%(10,i%)=&H100FFFF                  ! Volume + Autobalance
  11593.     instrset%(11,i%)=0                          ! Enveloppe volume + tonalite
  11594.     instrset%(12,i%)=0                          ! Enveloppe panning + reserve
  11595.     instrset%(13,i%)=0                          ! Reserve
  11596.     instrset%(14,i%)=0                          ! Reserve
  11597.     instrset%(15,i%)=SHL(i%,8)
  11598.     a%=ADD(SHL(i%,24),SHL(i%,8))
  11599.     b%=V:instrset%(16,i%)
  11600.     LONG{b%}=a%
  11601.     BMOVE b%,ADD(b%,4),4                        ! Remplit 252 octets avec le meme mot
  11602.     BMOVE b%,ADD(b%,8),8
  11603.     BMOVE b%,ADD(b%,16),16
  11604.     BMOVE b%,ADD(b%,32),32
  11605.     BMOVE b%,ADD(b%,64),64
  11606.     BMOVE b%,ADD(b%,128),124
  11607.   NEXT i%
  11608.   GOSUB clear_enveloppes
  11609. RETURN
  11610. PROCEDURE clear_enveloppes
  11611.   ' Efface les enveloppes de volume, tonalite et panning
  11612.   ' Dans la mem, les env sont rangees dans cet ordre : V T P  V T P  V T P...
  11613.   LOCAL i%,a%,deb%
  11614.   deb%=ADD(FN adr_patchunk(255),FN lon_patchunk(255))
  11615.   FOR i%=0 TO 63
  11616.     a%=ADD(deb%,MUL(i%,102))
  11617.     LONG{a%}=&H56454E56         ! 'VENV'
  11618.     LONG{ADD(a%,4)}=34
  11619.     CARD{ADD(a%,8)}=i%
  11620.     LONG{ADD(a%,10)}=&H20202020
  11621.     LONG{ADD(a%,14)}=&H20202020
  11622.     LONG{ADD(a%,18)}=&H20202020
  11623.     LONG{ADD(a%,22)}=&H20202020
  11624.     LONG{ADD(a%,26)}=&H20202020
  11625.     LONG{ADD(a%,30)}=&H10000
  11626.     GOSUB chg_env_chunkadr(i%,0,a%)
  11627.     a%=ADD(ADD(deb%,34),MUL(i%,102))
  11628.     LONG{a%}=&H54454E56         ! 'TENV'
  11629.     LONG{ADD(a%,4)}=34
  11630.     CARD{ADD(a%,8)}=i%
  11631.     LONG{ADD(a%,10)}=&H20202020
  11632.     LONG{ADD(a%,14)}=&H20202020
  11633.     LONG{ADD(a%,18)}=&H20202020
  11634.     LONG{ADD(a%,22)}=&H20202020
  11635.     LONG{ADD(a%,26)}=&H20202020
  11636.     LONG{ADD(a%,30)}=&H10000
  11637.     GOSUB chg_env_chunkadr(i%,1,a%)
  11638.     a%=ADD(ADD(deb%,68),MUL(i%,102))
  11639.     LONG{a%}=&H50454E56         ! 'PENV'
  11640.     LONG{ADD(a%,4)}=34
  11641.     CARD{ADD(a%,8)}=i%
  11642.     LONG{ADD(a%,10)}=&H20202020
  11643.     LONG{ADD(a%,14)}=&H20202020
  11644.     LONG{ADD(a%,18)}=&H20202020
  11645.     LONG{ADD(a%,22)}=&H20202020
  11646.     LONG{ADD(a%,26)}=&H20202020
  11647.     LONG{ADD(a%,30)}=&H10000
  11648.     GOSUB chg_env_chunkadr(i%,2,a%)
  11649.   NEXT i%
  11650.   env_poscurs&=0
  11651.   env_posaff&=0
  11652.   GOSUB garbage_collection
  11653. RETURN
  11654. PROCEDURE garbage_collection
  11655.   ' Regroupe les patterns, enveloppes et samples
  11656.   ' dans cet ordre, en bas de la memoire.
  11657.   ' garbage% aurorise la manipulation de chaque type de chunk
  11658.   LOCAL i%,j%,na%,oa%,l%
  11659.   ' Les patterns
  11660.   IF garbage%>0
  11661.     FOR i%=0 TO 255
  11662.       oa%=FN adr_patchunk(i%)
  11663.       IF i%>0
  11664.         na%=ADD(FN adr_patchunk(PRED(i%)),FN lon_patchunk(PRED(i%)))
  11665.       ELSE
  11666.         na%=FN zone_start
  11667.       ENDIF
  11668.       IF oa%<>na%
  11669.         l%=FN lon_patchunk(i%)
  11670.         GOSUB chg_pat_chunkadr(i%,na%)
  11671.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  11672.       ENDIF
  11673.     NEXT i%
  11674.   ENDIF
  11675.   ' Les enveloppes
  11676.   IF garbage%>1
  11677.     FOR i%=0 TO 191
  11678.       oa%=FN env_chunkadr(DIV(i%,3),i% MOD 3)
  11679.       IF i%>0
  11680.         na%=ADD(FN env_chunkadr(DIV(PRED(i%),3),PRED(i%) MOD 3),FN env_chunklen(DIV(PRED(i%),3),PRED(i%) MOD 3))
  11681.       ELSE
  11682.         na%=ADD(FN adr_patchunk(255),FN lon_patchunk(255))
  11683.       ENDIF
  11684.       IF oa%<>na%
  11685.         l%=FN env_chunklen(DIV(i%,3),i% MOD 3)
  11686.         GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,na%)
  11687.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  11688.       ENDIF
  11689.     NEXT i%
  11690.   ENDIF
  11691.   ' Les samples
  11692.   IF garbage%>2
  11693.     FOR i%=0 TO 255
  11694.       oa%=FN adrsamchk(i%)
  11695.       IF i%>0
  11696.         na%=ADD(FN adrsamchk(PRED(i%)),FN lonsamchk(PRED(i%)))
  11697.       ELSE
  11698.         na%=ADD(FN env_chunkadr(63,2),FN env_chunklen(63,2))
  11699.       ENDIF
  11700.       IF oa%<>na%
  11701.         l%=FN lonsamchk(i%)
  11702.         GOSUB chg_sam_chunkadr(i%,na%)
  11703.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  11704.       ENDIF
  11705.     NEXT i%
  11706.   ENDIF
  11707. RETURN
  11708. PROCEDURE create_space_patchunk(p%,t%,l%,flag!)
  11709.   ' Demenage la memoire pour obtenir un pattern de t% tracks, l% lignes
  11710.   ' Le header du chunk est modifie mais pas les donnees du pattern
  11711.   ' Si flag! n'est pas mis, seulement les patterns seront deplaces (on devra
  11712.   ' avoir verifie que la place pour cette operation a bien ete inseree entre
  11713.   ' les patterns et les enveloppes).
  11714.   LOCAL a%,b%,c%,i%,oldlen%,newlen%,dif%
  11715.   IF p%<255
  11716.     oldlen%=SUB(FN adr_patchunk(SUCC(p%)),FN adr_patchunk(p%))
  11717.   ELSE
  11718.     oldlen%=SUB(FN env_chunkadr(0,0),FN adr_patchunk(p%))
  11719.   ENDIF
  11720.   newlen%=ADD(MUL(MUL(t%,l%),5),32)
  11721.   dif%=SUB(newlen%,oldlen%)
  11722.   IF dif%<>0
  11723.     a%=ADD(FN adr_patchunk(p%),oldlen%)
  11724.     b%=ADD(FN adr_patchunk(p%),newlen%)
  11725.     c%=SUB(FN adr_buffer,a%)
  11726.     IF p%<255
  11727.       FOR i%=SUCC(p%) TO 255                      ! Change les adresses des patterns
  11728.         GOSUB chg_pat_chunkadr(i%,ADD(FN adr_patchunk(i%),dif%))
  11729.       NEXT i%
  11730.     ENDIF
  11731.     IF flag!
  11732.       FOR i%=0 TO 191                             ! Change les adresses des enveloppes
  11733.         GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),dif%))
  11734.       NEXT i%
  11735.       FOR i%=0 TO 255                             ! Change les adresses des samples
  11736.         GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  11737.       NEXT i%
  11738.     ENDIF
  11739.     IF flag!
  11740.       ~C:g_bmove%(L:a%,L:b%,L:c%)
  11741.     ELSE IF p%<255
  11742.       ~C:g_bmove%(L:a%,L:b%,L:SUB(FN env_chunkadr(0,0),MAX(a%,b%)))
  11743.     ENDIF
  11744.   ENDIF
  11745.   GOSUB chg_pat_chunklen(p%,newlen%)
  11746.   GOSUB chg_pat_nbr_lines(p%,l%)
  11747.   GOSUB chg_pat_nbr_track(p%,t%)
  11748. RETURN
  11749. PROCEDURE create_space_multipatchunk(map$,nbp%,flag!)
  11750.   ' Comme ci-dessus mais pour plusieurs patterns (0...nbp%-1)
  11751.   ' map$ contient (NbTi.w,NbLi.w), i de 0 a nbp%-1
  11752.   ' Tous les chunks sont bien deplaces
  11753.   ' Si flag! est mis, les nouveaux patterns crees sont nettoyes
  11754.   LOCAL a%,b%,c%,d%,i%,dif%
  11755.   LOCAL a$
  11756.   ' Calcul de la place occupee par ces nouveaux patterns
  11757.   a%=0
  11758.   FOR i%=0 TO PRED(nbp%)
  11759.     ADD a%,ADD(MUL(MUL(CARD{ADD(V:map$,SHL(i%,2))},CARD{ADD(V:map$,ADD(SHL(i%,2),2))}),5),32)
  11760.   NEXT i%
  11761.   IF nbp%<256
  11762.     dif%=SUB(ADD(FN zone_start,a%),FN adr_patchunk(nbp%))
  11763.     ~C:g_bmove%(L:FN adr_patchunk(nbp%),L:ADD(FN zone_start,a%),L:SUB(FN adr_buffer,FN adr_patchunk(nbp%)))
  11764.     FOR i%=nbp% TO 255                            ! Change les adresses des patterns suivants
  11765.       GOSUB chg_pat_chunkadr(i%,ADD(FN adr_patchunk(i%),dif%))
  11766.     NEXT i%
  11767.     FOR i%=0 TO 191                               ! Change les adresses des enveloppes
  11768.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),dif%))
  11769.     NEXT i%
  11770.     FOR i%=0 TO 255                               ! Change les adresses des samples
  11771.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  11772.     NEXT i%
  11773.   ELSE
  11774.     GOSUB create_space_for_patterns(SUB(a%,SUB(FN env_chunkadr(0,0),FN zone_start)))
  11775.   ENDIF
  11776.   ' Creation des nouveaux chunks a la bonne taille
  11777.   b%=FN zone_start
  11778.   FOR i%=0 TO PRED(nbp%)
  11779.     c%=CARD{ADD(V:map$,SHL(i%,2))}
  11780.     d%=CARD{ADD(V:map$,ADD(SHL(i%,2),2))}
  11781.     a%=ADD(MUL(MUL(c%,d%),5),32)
  11782.     a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(d%)+MKI$(c%)
  11783.     CARD{ADD(V:a$,8)}=i%
  11784.     BMOVE V:a$,b%,LEN(a$)
  11785.     GOSUB chg_pat_chunkadr(i%,b%)
  11786.     IF flag!
  11787.       GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  11788.     ENDIF
  11789.     ADD b%,a%
  11790.   NEXT i%
  11791. RETURN
  11792. PROCEDURE create_space_for_patterns(l%)
  11793.   ' Deplace les chunks des enveloppes et des samples de facon a laisser
  11794.   ' l% octets en plus pour les patterns.
  11795.   LOCAL a%,b%,c%,i%
  11796.   IF l%>0
  11797.     a%=FN env_chunkadr(0,0)
  11798.     b%=ADD(a%,l%)
  11799.     c%=SUB(FN adr_buffer,a%)
  11800.     FOR i%=0 TO 191                               ! Change les adresses des enveloppes
  11801.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),l%))
  11802.     NEXT i%
  11803.     FOR i%=0 TO 255                               ! Change les adresses des samples
  11804.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),l%))
  11805.     NEXT i%
  11806.     ~C:g_bmove%(L:a%,L:b%,L:c%)
  11807.   ENDIF
  11808. RETURN
  11809. PROCEDURE change_pattern_high(p%,l%)
  11810.   LOCAL ol%
  11811.   ol%=FN nbr_lines(p%)
  11812.   GOSUB create_space_patchunk(p%,nbr_track%,l%,TRUE)
  11813.   IF l%>ol%
  11814.     GOSUB clear_mem(FN adr_line(p%,ol%),MUL(MUL(nbr_track%,SUB(l%,ol%)),5))
  11815.   ENDIF
  11816.   IF p%=bl_pat&
  11817.     bl_end&=MIN(bl_end&,PRED(l%))
  11818.     bl_start&=MIN(bl_start&,bl_end&)
  11819.   ENDIF
  11820. RETURN
  11821. PROCEDURE change_format(t%)
  11822.   LOCAL bouton%,a$,a%
  11823.   a$="DO YOU REALLY WANT TO CHANGE THE|PATTERN SIZE TO "+STR$(t%)+" TRACKS ?"
  11824.   IF t%<nbr_track%
  11825.     a$=a$+"|"+STR$(SUB(nbr_track%,t%))+" TRACK(S) WILL BE LOST"
  11826.     a$=a$+"||1. New song|2. Try to keep the song|3. Abort the operation"
  11827.   ENDIF
  11828.   GOSUB dialog("CHANGE NUMBER OF TRACKS",a$,"NEW|KEEP|CANCEL",xm%,ym%)
  11829.   IF bouton%=0
  11830.     GOSUB aff_message("WAITING : CONVERTING...")
  11831.     GOSUB bee(TRUE)
  11832.     GOSUB new_pattern_format(t%)
  11833.   ELSE IF bouton%=1
  11834.     GOSUB aff_message("WAITING : CONVERTING...")
  11835.     GOSUB bee(TRUE)
  11836.     GOSUB chg_pattern_format(t%)
  11837.   ENDIF
  11838.   GOSUB bee(FALSE)
  11839.   GOSUB affiche_info_song
  11840.   GOSUB affiche_info_preset
  11841. RETURN
  11842. PROCEDURE new_pattern_format(t%)
  11843.   ' Change le nbr de voies t%, de lignes 1 et efface la chanson
  11844.   LOCAL a%,b%,i%,j%
  11845.   LOCAL a$
  11846.   GOSUB stop_voices
  11847.   GOSUB clear_patterns2
  11848.   sample%=1
  11849.   instr%=1
  11850.   songpos%=0
  11851.   posligne%=0
  11852.   curs_col%=0
  11853.   curs_x%=0
  11854.   a%=nbr_track%
  11855.   nbr_track%=t%
  11856.   module&(100)=t%
  11857.   module&(101)=1        ! Longueur song
  11858.   module&(102)=0        ! Pt de bouclage
  11859.   FOR j%=0 TO 31
  11860.     FOR i%=0 TO 31
  11861.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  11862.     NEXT i%
  11863.   NEXT j%
  11864.   GOSUB create_space_for_patterns(MUL(MUL(MAX(SUB(nbr_track%,a%),0),5),256))
  11865.   GOSUB clear_song(FALSE)
  11866.   ARRAYFILL nbr_colonnes%(),nbr_track%
  11867.   para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  11868.   module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  11869.   module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  11870.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  11871.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  11872.   b%=V:pattern_bidon%(0)
  11873.   FOR i%=256 TO 257
  11874.     CARD{ADD(V:a$,8)}=i%
  11875.     BMOVE V:a$,b%,LEN(a$)
  11876.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  11877.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  11878.     ADD b%,a%
  11879.   NEXT i%
  11880.   DPOKE r_master_vol%,DIV(&H3000,ADD(nbr_track%,3))
  11881.   DPOKE r_mod_songpos%,songpos%
  11882.   DPOKE r_mod_numpat%,song&(songpos%)
  11883.   DPOKE r_mod_speed%,6
  11884.   DPOKE r_mod_linepos%,0
  11885.   DPOKE r_mod_nbrtrack%,nbr_track%
  11886.   bl_start&=0
  11887.   bl_end&=0
  11888.   bl_trk&=0
  11889.   bl_pat&=0
  11890.   GOSUB stop_voices
  11891.   GOSUB all_track_on(FALSE)
  11892.   GOSUB balance_reset
  11893. RETURN
  11894. PROCEDURE chg_pattern_format(t%)
  11895.   ' Change le nbr de voies t% et essaie de garder la chanson
  11896.   ' Attention au format 32 piste/256 lignes, car utilisation d'une chaine de
  11897.   ' 32768 octets. Normalement pas de bug car GfA gere les chaines au mot pres
  11898.   LOCAL a%,b%,c%,d%,i%,j%,otp%
  11899.   LOCAL a$,b$
  11900.   GOSUB stop_voices
  11901.   IF t%>nbr_track%
  11902.     a%=0
  11903.     FOR i%=0 TO 255
  11904.       ADD a%,FN nbr_lines(i%)
  11905.     NEXT i%
  11906.     MUL a%,MUL(SUB(t%,nbr_track%),5)
  11907.     GOSUB create_space_for_patterns(a%)
  11908.     FOR i%=0 TO 255
  11909.       otp%=MUL(nbr_track%,FN nbr_lines(i%))
  11910.       a$=STRING$(MUL(otp%,5),0)
  11911.       BMOVE FN adr_pat(i%),V:a$,MUL(otp%,5)
  11912.       GOSUB create_space_patchunk(i%,t%,FN nbr_lines(i%),FALSE)
  11913.       GOSUB clear_mem(FN adr_pat(i%),MUL(MUL(t%,FN nbr_lines(i%)),5))
  11914.       a%=V:a$
  11915.       b%=FN adr_pat(i%)
  11916.       c%=MUL(nbr_track%,5)
  11917.       d%=MUL(t%,5)
  11918.       FOR j%=0 TO PRED(FN nbr_lines(i%))
  11919.         BMOVE a%,b%,c%
  11920.         ADD a%,c%
  11921.         ADD b%,d%
  11922.       NEXT j%
  11923.     NEXT i%
  11924.   ELSE
  11925.     FOR i%=0 TO 255
  11926.       otp%=MUL(nbr_track%,FN nbr_lines(i%))
  11927.       a$=STRING$(MUL(otp%,5),0)
  11928.       BMOVE FN adr_pat(i%),V:a$,MUL(otp%,5)
  11929.       GOSUB create_space_patchunk(i%,t%,FN nbr_lines(i%),FALSE)
  11930.       a%=V:a$
  11931.       b%=FN adr_pat(i%)
  11932.       c%=MUL(nbr_track%,5)
  11933.       d%=MUL(t%,5)
  11934.       FOR j%=0 TO PRED(FN nbr_lines(i%))
  11935.         BMOVE a%,b%,d%
  11936.         ADD a%,c%
  11937.         ADD b%,d%
  11938.       NEXT j%
  11939.     NEXT i%
  11940.   ENDIF
  11941.   GOSUB garbage_collection
  11942.   nbr_track%=t%
  11943.   module&(100)=t%
  11944.   FOR j%=0 TO 31
  11945.     FOR i%=0 TO 31
  11946.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  11947.     NEXT i%
  11948.   NEXT j%
  11949.   ARRAYFILL nbr_colonnes%(),nbr_track%
  11950.   para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  11951.   module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  11952.   module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  11953.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  11954.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  11955.   b%=V:pattern_bidon%(0)
  11956.   FOR i%=256 TO 257
  11957.     CARD{ADD(V:a$,8)}=i%
  11958.     BMOVE V:a$,b%,LEN(a$)
  11959.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  11960.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  11961.     ADD b%,a%
  11962.   NEXT i%
  11963.   curs_col%=0
  11964.   curs_x%=0
  11965.   bl_trk&=0
  11966.   bl_pat&=0
  11967.   DPOKE r_master_vol%,DIV(&H3000,ADD(nbr_track%,3))
  11968.   DPOKE r_mod_linepos%,0
  11969.   DPOKE r_mod_nbrtrack%,nbr_track%
  11970.   GOSUB stop_voices
  11971.   GOSUB all_track_on(FALSE)
  11972. RETURN
  11973. PROCEDURE chg_taille_sample(ns%,ls%)
  11974.   ' Ne teste pas s'il y a assez de place pour agrandir un sample
  11975.   ' N'utilise que les adresses des samples
  11976.   ' Ne change absolument rien aux chunks
  11977.   LOCAL olda%,newa%,lon%,i%,dif%
  11978.   ls%=ls% AND -2
  11979.   IF ns%<255
  11980.     olda%=FN adrsamchk(SUCC(ns%))
  11981.     newa%=ADD(ADD(FN adrsamchk(ns%),64),ls%)
  11982.     lon%=SUB(FN adr_buffer,olda%)
  11983.     ~C:g_bmove%(L:olda%,L:newa%,L:lon%)
  11984.     dif%=SUB(newa%,olda%)
  11985.     FOR i%=SUCC(ns%) TO 255
  11986.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  11987.     NEXT i%
  11988.     GOSUB clear_mem(ADD(newa%,lon%),-dif%)    ! Vide la fin du buffer de sample si on agrandit son espace
  11989.   ENDIF
  11990. RETURN
  11991. PROCEDURE chg_type_affpiste(n%)
  11992.   IF n%=0
  11993.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),6),32)    ! Nombre de pistes affichables sans volume ni effet
  11994.   ELSE IF n%=2
  11995.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),12),32)   ! Nombre de pistes affichables avec volume
  11996.   ELSE
  11997.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),10),32)   ! Nombre de pistes affichables sans volume
  11998.   ENDIF
  11999.   type_affpiste%=n%
  12000. RETURN
  12001. PROCEDURE chg_tempo(tempo%)
  12002.   CARD{r_mod_tempo%}=tempo%
  12003.   GOSUB chg_tempo2(tempo%)
  12004. RETURN
  12005. PROCEDURE chg_tempo2(tempo%)
  12006.   ' Change simplement la duree d'un tick, mais pas la valeur du tempo
  12007.   LOCAL vblpf%,spf%
  12008.   vblpf%=0
  12009.   REPEAT
  12010.     INC vblpf%
  12011.     spf%=ROUND(CARD{r_adr_replay_frequency%}*163840/(tempo%*vblpf%))    ! $10000 * replfreq*60/6/4 / tempo
  12012.   UNTIL spf%<7.86432E+07                           ! 1200 * $10000
  12013.   LONG{r_vblsize%}=spf%
  12014.   CARD{r_vblnumber%}=vblpf%
  12015. RETURN
  12016. PROCEDURE chg_speed(speed%)
  12017.   CARD{r_mod_speed%}=speed%
  12018. RETURN
  12019. PROCEDURE chg_songpos
  12020.   IF d%=0
  12021.     GOSUB edite_chaine(HEX$(songpos%,2),ADD(divbi&(0,0,16),12),ADD(divbi&(1,0,16),2),2,1)
  12022.     songpos%=VAL("$"+bbbb$)
  12023.   ELSE
  12024.     ADD songpos%,MUL(d%,MAX(PRED(km%),1))
  12025.   ENDIF
  12026.   songpos%=MIN(MAX(songpos%,0),PRED(module&(101)))
  12027.   GOSUB affiche_info_song
  12028.   GOSUB affiche_c_pattern
  12029.   IF ss_menu%=2 AND ss_menut%=3
  12030.     GOSUB affiche_icones_toolsb3
  12031.   ENDIF
  12032.   IF play%>0
  12033.     posligne%=MIN(DPEEK(r_mod_linepos%),PRED(FN nbr_lines2(songpos%)))
  12034.     DPOKE r_mod_linepos%,posligne%
  12035.     DPOKE r_mod_songpos%,songpos%
  12036.     DPOKE r_mod_numpat%,song&(songpos%)
  12037.   ENDIF
  12038.   IF km%>0 AND km%<3 AND d%<>0
  12039.     PAUSE SUB(13,MUL(km%,5))
  12040.   ENDIF
  12041. RETURN
  12042. PROCEDURE chg_pattern
  12043.   LOCAL a%
  12044.   IF d%=0
  12045.     GOSUB edite_chaine(HEX$(song&(songpos%),2),ADD(divbi&(0,3,16),12),ADD(divbi&(1,3,16),2),2,1)
  12046.     a%=VAL("$"+bbbb$)
  12047.   ELSE
  12048.     a%=ADD(song&(songpos%),MUL(d%,MAX(PRED(km%),1)))
  12049.   ENDIF
  12050.   song&(songpos%)=MIN(MAX(a%,0),255)
  12051.   GOSUB affiche_info_song
  12052.   GOSUB affiche_c_pattern
  12053.   IF ss_menu%=2 AND ss_menut%=3
  12054.     GOSUB affiche_icones_toolsb3
  12055.   ENDIF
  12056.   IF play%>0
  12057.     posligne%=MIN(DPEEK(r_mod_linepos%),PRED(FN nbr_lines2(songpos%)))
  12058.     DPOKE r_mod_linepos%,posligne%
  12059.     DPOKE r_mod_numpat%,song&(songpos%)
  12060.   ENDIF
  12061.   IF km%<3 AND d%<>0
  12062.     PAUSE SUB(13,MUL(km%,5))
  12063.   ENDIF
  12064. RETURN
  12065. PROCEDURE chg_songlen
  12066.   LOCAL a%
  12067.   IF d%=0
  12068.     GOSUB edite_chaine(HEX$(module&(101),2),ADD(divbi&(0,6,16),12),ADD(divbi&(1,6,16),2),2,1)
  12069.     a%=VAL("$"+bbbb$)
  12070.   ELSE
  12071.     a%=ADD(module&(101),MUL(d%,MAX(PRED(km%),1)))
  12072.   ENDIF
  12073.   module&(101)=MIN(MAX(a%,SUCC(songpos%)),256)
  12074.   DPOKE r_mod_songlen%,module&(101)
  12075.   module&(102)=MIN(module&(102),PRED(module&(101)))
  12076.   DPOKE r_mod_songrep%,module&(102)
  12077.   GOSUB affiche_info_song
  12078.   IF ss_menu%=2 AND ss_menut%=3
  12079.     GOSUB affiche_icones_toolsb3
  12080.   ENDIF
  12081.   IF km%<3 AND d%<>0
  12082.     PAUSE SUB(13,MUL(km%,5))
  12083.   ENDIF
  12084. RETURN
  12085. PROCEDURE chg_songrep
  12086.   LOCAL a%
  12087.   IF d%=0
  12088.     GOSUB edite_chaine(HEX$(module&(102),2),ADD(divbi&(0,9,16),12),ADD(divbi&(1,9,16),2),2,1)
  12089.     a%=VAL("$"+bbbb$)
  12090.   ELSE
  12091.     a%=ADD(module&(102),MUL(d%,MAX(PRED(km%),1)))
  12092.   ENDIF
  12093.   module&(102)=MIN(MAX(a%,0),PRED(module&(101)))
  12094.   DPOKE r_mod_songrep%,module&(102)
  12095.   GOSUB affiche_info_song
  12096.   IF ss_menu%=2 AND ss_menut%=3
  12097.     GOSUB affiche_icones_toolsb3
  12098.   ENDIF
  12099.   IF km%<3 AND d%<>0
  12100.     PAUSE SUB(13,MUL(km%,5))
  12101.   ENDIF
  12102. RETURN
  12103. PROCEDURE chg_instrument
  12104.   IF d%=0
  12105.     GOSUB edite_chaine(HEX$(instr%,2),ADD(divbi&(0,12,16),12),ADD(divbi&(1,12,16),2),2,1)
  12106.     instr%=VAL("$"+bbbb$)
  12107.   ELSE
  12108.     ADD instr%,MUL(d%,MAX(PRED(km%),1))
  12109.   ENDIF
  12110.   instr%=MAX(MIN(instr%,255),1)
  12111.   GOSUB affiche_info_sample
  12112.   IF ss_menu%=1
  12113.     GOSUB affiche_icones_diskb
  12114.   ENDIF
  12115.   IF km%<3 AND d%<>0
  12116.     PAUSE SUB(13,MUL(km%,5))
  12117.   ENDIF
  12118. RETURN
  12119. PROCEDURE chg_sample
  12120.   IF d%=0
  12121.     GOSUB edite_chaine(HEX$(sample%,2),ADD(divbi&(0,15,16),12),ADD(divbi&(1,15,16),2),2,1)
  12122.     sample%=VAL("$"+bbbb$)
  12123.   ELSE
  12124.     ADD sample%,MUL(d%,MAX(PRED(km%),1))
  12125.   ENDIF
  12126.   sample%=MAX(MIN(sample%,255),1)
  12127.   GOSUB affiche_info_sample
  12128.   IF ss_menu%=1
  12129.     GOSUB affiche_icones_diskb
  12130.   ENDIF
  12131.   IF km%<3 AND d%<>0
  12132.     PAUSE SUB(13,MUL(km%,5))
  12133.   ENDIF
  12134. RETURN
  12135. PROCEDURE chg_linestep
  12136.   LOCAL a%
  12137.   IF d%=0
  12138.     a%=FN popup(3,4,MOUSEX,MOUSEY)
  12139.     IF a%>=0
  12140.       line_step%=a% AND &HFFFF
  12141.     ENDIF
  12142.   ELSE
  12143.     IF line_step%>-256 AND line_step%<256
  12144.       ADD line_step%,MUL(d%,MAX(PRED(km%),1))
  12145.     ELSE
  12146.       line_step%=1
  12147.     ENDIF
  12148.   ENDIF
  12149.   IF line_step%>-256 AND line_step%<256
  12150.     line_step%=MAX(MIN(line_step%,PRED(FN nbr_lines3)),-PRED(FN nbr_lines3),-15)
  12151.   ENDIF
  12152.   GOSUB affiche_info_song
  12153.   IF km%<3 AND d%<>0
  12154.     PAUSE SUB(13,MUL(km%,5))
  12155.   ENDIF
  12156. RETURN
  12157. PROCEDURE chg_s_sample
  12158.   IF flag_nvl_boucle_sample%<=0
  12159.     IF d%=0
  12160.       GOSUB edite_chaine(HEX$(sample%,2),ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),2,1)
  12161.       sample%=VAL("$"+bbbb$)
  12162.     ELSE
  12163.       ADD sample%,MUL(d%,MAX(PRED(km%),1))
  12164.     ENDIF
  12165.     sample%=MAX(MIN(sample%,255),1)
  12166.     GOSUB affiche_icones_sampleb
  12167.     GOSUB affiche_info_sample
  12168.     IF km%<3 AND d%<>0
  12169.       PAUSE SUB(13,MUL(km%,5))
  12170.     ENDIF
  12171.   ENDIF
  12172. RETURN
  12173. PROCEDURE chg_s_volume
  12174.   LOCAL a%
  12175.   IF d%=0
  12176.     GOSUB edite_chaine(HEX$(FN volume(sample%),3),ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),3,1)
  12177.     a%=VAL("$"+bbbb$)
  12178.   ELSE
  12179.     a%=ADD(FN volume(sample%),MUL(d%,MAX(PRED(km%),1)))
  12180.   ENDIF
  12181.   GOSUB chg_sam_volume(sample%,MIN(MAX(a%,0),&HFFF))
  12182.   GOSUB affiche_icones_sampleb
  12183.   IF km%<3 AND d%<>0
  12184.     PAUSE SUB(13,MUL(km%,5))
  12185.   ENDIF
  12186. RETURN
  12187. PROCEDURE chg_s_length                  !!!
  12188. RETURN
  12189. PROCEDURE chg_s_reppos
  12190.   LOCAL a%
  12191.   IF d%=0
  12192.     GOSUB edite_chaine(HEX$(FN repeat(sample%),6),ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),6,1)
  12193.     a%=VAL("$"+bbbb$)
  12194.   ELSE
  12195.     a%=ADD(FN repeat(sample%),SHL(d%,SUB(MUL(km%,4),3)))
  12196.   ENDIF
  12197.   GOSUB chg_sam_repeat(sample%,MAX(MIN(a% AND -2,SUB(FN length(sample%),FN replen(sample%))),0))
  12198.   GOSUB affiche_icones_sampleb
  12199.   num_nvl_boucle_sample%=sample%
  12200.   flag_nvl_boucle_sample%=4
  12201.   IF km%<3 AND d%<>0
  12202.     PAUSE SUB(13,MUL(km%,5))
  12203.   ENDIF
  12204. RETURN
  12205. PROCEDURE chg_s_replen
  12206.   LOCAL a%
  12207.   IF d%=0
  12208.     GOSUB edite_chaine(HEX$(FN replen(sample%),6),ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),6,1)
  12209.     a%=VAL("$"+bbbb$)
  12210.   ELSE
  12211.     a%=ADD(FN replen(sample%),SHL(d%,SUB(MUL(km%,4),3)))
  12212.   ENDIF
  12213.   GOSUB chg_sam_replen(sample%,MAX(MIN(a% AND -2,SUB(FN length(sample%),FN repeat(sample%))),2))
  12214.   GOSUB affiche_icones_sampleb
  12215.   flag_nvl_boucle_sample%=4
  12216.   num_nvl_boucle_sample%=sample%
  12217.   IF km%<3 AND d%<>0
  12218.     PAUSE SUB(13,MUL(km%,5))
  12219.   ENDIF
  12220. RETURN
  12221. PROCEDURE chg_s_finetune
  12222.   LOCAL a%,b%
  12223.   IF d%=0
  12224.   ELSE
  12225.     a%=ADD(FN finetune(sample%),d%)
  12226.   ENDIF
  12227.   GOSUB chg_sam_finetune(sample%,MIN(MAX(a%,-8),7))
  12228.   GOSUB affiche_icones_sampleb
  12229.   IF km%<3 AND d%<>0
  12230.     PAUSE SUB(13,MUL(km%,5))
  12231.   ENDIF
  12232. RETURN
  12233. PROCEDURE chg_s_balance
  12234.   LOCAL a%,a$
  12235.   a%=FN autobal(sample%)
  12236.   IF d%=0
  12237.     IF a%<=&HFFF
  12238.       a$=HEX$(FN autobal(sample%),3)
  12239.     ELSE
  12240.       a$="???"
  12241.     ENDIF
  12242.     GOSUB edite_chaine(a$,ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),3,0)
  12243.     IF INSTR(bbbb$,"?")>0
  12244.       a%=-1
  12245.     ELSE
  12246.       a%=VAL("$"+bbbb$)
  12247.     ENDIF
  12248.   ELSE
  12249.     IF a%>&HFFF
  12250.       a%=-1
  12251.     ENDIF
  12252.     a%=ADD(a%,SHL(d%,SUB(MUL(km%,4),3))) AND -2
  12253.   ENDIF
  12254.   GOSUB chg_sam_balance(sample%,MAX(MIN(a%,&HFFF),-1) AND &HFFFF)
  12255.   GOSUB affiche_icones_sampleb
  12256.   IF km%<3 AND d%<>0
  12257.     PAUSE SUB(13,MUL(km%,5))
  12258.   ENDIF
  12259. RETURN
  12260. PROCEDURE chg_s_freqech
  12261.   LOCAL a%
  12262.   IF d%=0
  12263.     GOSUB edite_chaine(STR$(FN freqech(sample%),5),ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),5,2)
  12264.     a%=VAL(bbbb$)
  12265.   ELSE
  12266.     a%=ADD(FN freqech(sample%),MUL(d%,20^PRED(km%)))
  12267.   ENDIF
  12268.   GOSUB chg_sam_freq(sample%,MAX(MIN(a%,65000),2000))
  12269.   GOSUB affiche_icones_sampleb
  12270.   IF km%<3 AND d%<>0
  12271.     PAUSE 3
  12272.   ENDIF
  12273. RETURN
  12274. PROCEDURE chg_songname(nnnn$)
  12275.   LOCAL iiii%
  12276.   FOR iiii%=2 TO 17
  12277.     module&(iiii%)=&H2020
  12278.   NEXT iiii%
  12279.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),32))
  12280.     BYTE{ADD(V:module&(2),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12281.   NEXT iiii%
  12282. RETURN
  12283. PROCEDURE chg_songname2(aaaa%,llll%)
  12284.   LOCAL iiii%
  12285.   FOR iiii%=0 TO 31
  12286.     IF iiii%<llll%
  12287.       BYTE{ADD(V:module&(2),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12288.     ELSE
  12289.       BYTE{ADD(V:module&(2),iiii%)}=32
  12290.     ENDIF
  12291.   NEXT iiii%
  12292. RETURN
  12293. PROCEDURE chg_songcomment(nnnn$)
  12294.   LOCAL iiii%
  12295.   FOR iiii%=18 TO 97
  12296.     module&(iiii%)=&H2020
  12297.   NEXT iiii%
  12298.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),160))
  12299.     BYTE{ADD(V:module&(18),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12300.   NEXT iiii%
  12301. RETURN
  12302. PROCEDURE chg_songcomment2(aaaa%,llll%)
  12303.   LOCAL iiii%
  12304.   FOR iiii%=0 TO 159
  12305.     IF iiii%<llll%
  12306.       BYTE{ADD(V:module&(18),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12307.     ELSE
  12308.       BYTE{ADD(V:module&(18),iiii%)}=32
  12309.     ENDIF
  12310.   NEXT iiii%
  12311. RETURN
  12312. PROCEDURE chg_preset(p%)
  12313.   GOSUB cadre_texte(STR$(SUCC(n_preset%)),ADD(8,SHL(n_preset%,1)),130,1)
  12314.   n_preset%=p%
  12315.   GOSUB affiche_info_preset
  12316. RETURN
  12317. ' Piste
  12318. PROCEDURE chg_track_onoff(t%,state%)
  12319.   ' Ne change pas l'affichage
  12320.   ' state% = 0 ou 1
  12321.   DPOKE ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,t%)),state%
  12322. RETURN
  12323. PROCEDURE chg_a_track_onoff(t%,state%)
  12324.   ' Change l'affichage
  12325.   ' state% = 0 ou 1
  12326.   GOSUB chg_track_onoff(t%,state%)
  12327.   GOSUB cadre_texte2(STR$(SUCC(t%)),ADD(8,SHL(t%,1)),120,1,FN track_onoff(t%) XOR 1)
  12328.   GOSUB affiche_info_preset
  12329. RETURN
  12330. PROCEDURE all_track_on(flag!)
  12331.   LOCAL i%
  12332.   FOR i%=0 TO 31
  12333.     GOSUB chg_track_onoff(i%,1)
  12334.     IF flag!
  12335.       GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  12336.     ENDIF
  12337.   NEXT i%
  12338. RETURN
  12339. PROCEDURE balance_reset
  12340.   LOCAL i%
  12341.   FOR i%=0 TO 31
  12342.     GOSUB chg_t_balance(i%,MUL(SHR(SUCC(i%),1) AND 1,&HFFF))
  12343.   NEXT i%
  12344. RETURN
  12345. PROCEDURE set_balance(a$)
  12346.   LOCAL i%
  12347.   FOR i%=0 TO 31
  12348.     GOSUB chg_t_balance(i%,CARD{ADD(V:a$,SHL(i%,1))})
  12349.   NEXT i%
  12350. RETURN
  12351. PROCEDURE chg_t_balance(t%,b%)
  12352.   CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,t%))}=b%
  12353. RETURN
  12354. PROCEDURE track_volume_reset
  12355.   LOCAL i%
  12356.   FOR i%=0 TO 31
  12357.     GOSUB chg_t_mix_volume(i%,&H1000)
  12358.   NEXT i%
  12359. RETURN
  12360. PROCEDURE chg_t_mix_volume(t%,b%)
  12361.   CARD{ADD(ADD(r_info_track%,r_mix_volume_t%),MUL(r_itl%,t%))}=b%
  12362.   CARD{ADD(ADD(r_info_track%,r_mix_volume_e_t%),MUL(r_itl%,t%))}=FN vol_lin_2_exp(b%)
  12363. RETURN
  12364. PROCEDURE chg_t_mix_volume_e(t%,b%)
  12365.   CARD{ADD(ADD(r_info_track%,r_mix_volume_t%),MUL(r_itl%,t%))}=FN vol_exp_2_lin(b%)
  12366.   CARD{ADD(ADD(r_info_track%,r_mix_volume_e_t%),MUL(r_itl%,t%))}=b%
  12367. RETURN
  12368. PROCEDURE set_track_volume(a$)
  12369.   LOCAL i%
  12370.   FOR i%=0 TO 31
  12371.     GOSUB chg_t_mix_volume(i%,CARD{ADD(V:a$,SHL(i%,1))})
  12372.   NEXT i%
  12373. RETURN
  12374. ' Pattern
  12375. PROCEDURE chg_pat_chunkadr(pppp%,aaaa%)
  12376.   LONG{ADD(r_adr_pattern%,SHL(pppp%,2))}=aaaa%
  12377. RETURN
  12378. PROCEDURE chg_pat_chunklen(pppp%,aaaa%)
  12379.   LONG{ADD(FN adr_patchunk(pppp%),4)}=aaaa%
  12380. RETURN
  12381. PROCEDURE chg_pat_nbr_track(pppp%,aaaa%)
  12382.   CARD{ADD(FN adr_patchunk(pppp%),30)}=aaaa%
  12383. RETURN
  12384. PROCEDURE chg_pat_nbr_lines(pppp%,aaaa%)
  12385.   CARD{ADD(FN adr_patchunk(pppp%),28)}=aaaa%
  12386. RETURN
  12387. PROCEDURE chg_patternname(nnnn$,pppp%)
  12388.   IF LEN(nnnn$)<16
  12389.     nnnn$=nnnn$+SPACE$(SUB(16,LEN(nnnn$)))
  12390.   ENDIF
  12391.   nnnn$=LEFT$(nnnn$,16)
  12392.   BMOVE V:nnnn$,ADD(FN adr_patchunk(pppp%),10),16
  12393. RETURN
  12394. PROCEDURE chg_patternname2(aaaa%,llll%,pppp%)
  12395.   LOCAL iiii%
  12396.   FOR iiii%=0 TO 15
  12397.     IF iiii%<llll%
  12398.       BYTE{ADD(ADD(FN adr_patchunk(pppp%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12399.     ELSE
  12400.       BYTE{ADD(ADD(FN adr_patchunk(pppp%),10),iiii%)}=32
  12401.     ENDIF
  12402.   NEXT iiii%
  12403. RETURN
  12404. ' Sample
  12405. PROCEDURE chg_sam_chunkadr(ssss%,ffff%)
  12406.   LONG{ADD(r_adr_sample%,SHL(ssss%,2))}=ffff%
  12407. RETURN
  12408. PROCEDURE chg_sam_freq(ssss%,ffff%)
  12409.   CARD{ADD(FN adrsamchk(ssss%),44)}=ffff%
  12410. RETURN
  12411. PROCEDURE chg_sam_balance(ssss%,ffff%)
  12412.   CARD{ADD(FN adrsamchk(ssss%),40)}=ffff%
  12413. RETURN
  12414. PROCEDURE chg_sam_volume(ssss%,ffff%)
  12415.   CARD{ADD(FN adrsamchk(ssss%),58)}=ffff%
  12416. RETURN
  12417. PROCEDURE chg_sam_nbits(ssss%,ffff%)
  12418.   CARD{ADD(FN adrsamchk(ssss%),42)}=SHL(ffff%,3)
  12419. RETURN
  12420. PROCEDURE chg_sam_length(ssss%,ffff%)
  12421.   LONG{ADD(FN adrsamchk(ssss%),46)}=ffff%
  12422.   LONG{ADD(FN adrsamchk(ssss%),4)}=ADD(ffff%,64)
  12423. RETURN
  12424. PROCEDURE chg_sam_repeat(ssss%,ffff%)
  12425.   LONG{ADD(FN adrsamchk(ssss%),50)}=ffff%
  12426. RETURN
  12427. PROCEDURE chg_sam_replen(ssss%,ffff%)
  12428.   LONG{ADD(FN adrsamchk(ssss%),54)}=MAX(ffff%,2)
  12429. RETURN
  12430. PROCEDURE chg_sam_finetune(ssss%,ffff%)
  12431.   INT{ADD(FN adrsamchk(ssss%),60)}=ffff%
  12432. RETURN
  12433. PROCEDURE chg_samplename(nnnn$,ssss%)
  12434.   LOCAL iiii%
  12435.   FOR iiii%=10 TO 34 STEP 4
  12436.     LONG{ADD(FN adrsamchk(ssss%),iiii%)}=&H20202020
  12437.   NEXT iiii%
  12438.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),28))
  12439.     BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12440.   NEXT iiii%
  12441. RETURN
  12442. PROCEDURE chg_samplename2(aaaa%,llll%,ssss%)
  12443.   LOCAL iiii%
  12444.   FOR iiii%=0 TO 27
  12445.     IF iiii%<llll%
  12446.       BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12447.     ELSE
  12448.       BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=32
  12449.     ENDIF
  12450.   NEXT iiii%
  12451. RETURN
  12452. ' Instrument
  12453. PROCEDURE chg_ins_balance(ssss%,ffff%)
  12454.   CARD{ADD(V:instrset%(0,ssss%),42)}=ffff%
  12455. RETURN
  12456. PROCEDURE chg_ins_volume(ssss%,ffff%)
  12457.   CARD{ADD(V:instrset%(0,ssss%),40)}=ffff%
  12458. RETURN
  12459. PROCEDURE chg_ins_evol(ssss%,ffff%)
  12460.   CARD{ADD(V:instrset%(0,ssss%),44)}=ffff%
  12461. RETURN
  12462. PROCEDURE chg_ins_eton(ssss%,ffff%)
  12463.   CARD{ADD(V:instrset%(0,ssss%),46)}=ffff%
  12464. RETURN
  12465. PROCEDURE chg_ins_epan(ssss%,ffff%)
  12466.   CARD{ADD(V:instrset%(0,ssss%),48)}=ffff%
  12467. RETURN
  12468. PROCEDURE chg_ins_transp(ssss%,ffff%,gggg%)
  12469.   BYTE{ADD(V:instrset%(15,ssss%),SUCC(SHL(ffff%,1)))}=gggg%
  12470. RETURN
  12471. PROCEDURE chg_ins_sample(ssss%,ffff%,gggg%)
  12472.   BYTE{ADD(V:instrset%(15,ssss%),SHL(ffff%,1))}=gggg%
  12473. RETURN
  12474. PROCEDURE chg_instrname(nnnn$,ssss%)
  12475.   LOCAL iiii%
  12476.   FOR iiii%=10 TO 34 STEP 4
  12477.     LONG{ADD(V:instrset%(0,ssss%),iiii%)}=&H20202020
  12478.   NEXT iiii%
  12479.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),28))
  12480.     BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12481.   NEXT iiii%
  12482. RETURN
  12483. PROCEDURE chg_instrname2(aaaa%,llll%,ssss%)
  12484.   LOCAL iiii%
  12485.   FOR iiii%=0 TO 27
  12486.     IF iiii%<llll%
  12487.       BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12488.     ELSE
  12489.       BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=32
  12490.     ENDIF
  12491.   NEXT iiii%
  12492. RETURN
  12493. ' Envelopes
  12494. PROCEDURE chg_env_chunkadr(num%,type%,adr%)
  12495.   SELECT type%
  12496.   CASE 0
  12497.     LONG{ADD(r_adr_evol%,SHL(num%,2))}=adr%
  12498.   CASE 1
  12499.     LONG{ADD(r_adr_eton%,SHL(num%,2))}=adr%
  12500.   CASE 2
  12501.     LONG{ADD(r_adr_epan%,SHL(num%,2))}=adr%
  12502.   ENDSELECT
  12503. RETURN
  12504. PROCEDURE chg_env_length(num%,type%,sect%,lon%)
  12505.   ' Change la longueur d'une section d'enveloppe
  12506.   ' Les commandes sont effacees
  12507.   LOCAL a%
  12508.   a%=SUB(lon%,FN env_sectlen(num%,type%,sect%))
  12509.   GOSUB chg_env_rellength(num%,type%,sect%,0,a%)
  12510.   a%=FN env_sectadr(num%,type%,sect%)
  12511.   FOR a%=a% TO PRED(ADD(a%,FN env_sectlen(num%,type%,sect%)))
  12512.     BYTE{a%}=0
  12513.   NEXT a%
  12514. RETURN
  12515. PROCEDURE chg_env_rellength(num%,type%,sect%,pos%,rlon%)
  12516.   ' Insere un certain nombre d'octets dans une enveloppe
  12517.   ' Marche aussi pour la reduction de la taille de l'enveloppe (lon% negatif)
  12518.   ' Pos% est en numero de commande et non en octets
  12519.   ' Le chunk est mis a jour
  12520.   LOCAL d%,i%,j%,l%,s%
  12521.   ' Calcul des adresses source et destination, et de la longueur du bloc a deplacer
  12522.   IF rlon%>=0                                   ! Deplacement positif
  12523.     s%=ADD(FN env_sectadr(num%,type%,sect%),FN pos_enveloppe(num%,type%,sect%,pos%))
  12524.     d%=ADD(s%,rlon%)
  12525.   ELSE                                          ! Deplacement negatif
  12526.     d%=ADD(FN env_sectadr(num%,type%,sect%),FN pos_enveloppe(num%,type%,sect%,pos%))
  12527.     s%=SUB(d%,rlon%)
  12528.   ENDIF
  12529.   l%=SUB(FN adr_buffer,s%)
  12530.   ' Deplacement des adresses des chunks d'enveloppes suivants
  12531.   IF num%<63 OR type%<2
  12532.     FOR i%=SUCC(ADD(MUL(num%,3),type%)) TO 191
  12533.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),rlon%))
  12534.     NEXT i%
  12535.   ENDIF
  12536.   ' Deplacement des adresses des chunks de samples suivants
  12537.   FOR i%=0 TO 255
  12538.     GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),rlon%))
  12539.   NEXT i%
  12540.   ' Deplacement du bloc en memoire
  12541.   ~C:g_bmove%(L:s%,L:d%,L:l%)
  12542.   LONG{ADD(FN env_chunkadr(num%,type%),4)}=ADD(FN env_chunklen(num%,type%),rlon%)
  12543.   IF sect%=0
  12544.     CARD{ADD(FN env_chunkadr(num%,type%),30)}=ADD(CARD{ADD(FN env_chunkadr(num%,type%),30)},rlon%)
  12545.   ENDIF
  12546. RETURN
  12547. PROCEDURE chg_env_adrjump(num%,type%,sect%,pos%,lon%)
  12548.   ' Change les adresses de saut apres une insertion ou destruction de commande
  12549.   ' Pos% en octets
  12550.   LOCAL a%,b%,c%,i%,l%
  12551.   a%=FN env_sectadr(num%,type%,sect%)
  12552.   l%=FN env_sectlen(num%,type%,sect%)
  12553.   WHILE i%<l%
  12554.     c%=BYTE{ADD(a%,i%)}
  12555.     IF c%=&H1 OR c%=&H4
  12556.       b%=CARD{SUCC(ADD(a%,i%))}
  12557.       IF b%>pos%
  12558.         CARD{SUCC(ADD(a%,i%))}=ADD(b%,lon%)
  12559.       ENDIF
  12560.     ENDIF
  12561.     ADD i%,FN env_comlen(c%)
  12562.   WEND
  12563. RETURN
  12564. PROCEDURE chg_envelopename(nnnn$,eeee%,tttt%)
  12565.   LOCAL a%,b%,i%
  12566.   a%=FN env_chunkadr(eeee%,tttt%)
  12567.   FOR i%=ADD(a%,10) TO ADD(a%,26) STEP 4
  12568.     LONG{i%}=&H20202020
  12569.   NEXT i%
  12570.   IF nnnn$<>""
  12571.     b%=V:nnnn$
  12572.     FOR i%=ADD(a%,10) TO ADD(a%,ADD(MIN(LEN(nnnn$),20),9))
  12573.       BYTE{i%}=MAX(BYTE{b%},32)
  12574.       INC b%
  12575.     NEXT i%
  12576.   ENDIF
  12577. RETURN
  12578. PROCEDURE chg_envelopename2(aaaa%,llll%,eeee%,tttt%)
  12579.   LOCAL a%,b%,i%
  12580.   a%=FN env_chunkadr(eeee%,tttt%)
  12581.   FOR i%=ADD(a%,10) TO ADD(a%,26) STEP 4
  12582.     LONG{i%}=&H20202020
  12583.   NEXT i%
  12584.   IF llll%>0
  12585.     FOR i%=ADD(a%,10) TO ADD(a%,ADD(MIN(LEN(nnnn$),20),9))
  12586.       BYTE{i%}=MAX(BYTE{aaaa%},32)
  12587.       INC aaaa%
  12588.     NEXT i%
  12589.   ENDIF
  12590. RETURN
  12591. ' Midi
  12592. PROCEDURE chg_midi_monomode_channel_nbr(num%)
  12593.   midi_monomode_channel_nbr%=num%
  12594. RETURN
  12595. PROCEDURE chg_midi_monomode_instr_nbr(num%)
  12596.   midi_monomode_instr_nbr%=num%
  12597. RETURN
  12598. PROCEDURE chg_midi_in_instr(can%,ins%)
  12599.   ' can%: 0-15
  12600.   LOCAL i%
  12601.   midi_in_instr%(can%)=ins%
  12602.   FOR i%=0 TO 15
  12603.     CARD{ADD(r_midi_instr_map%,SHL(i%,1))}=midi_in_instr%(i%)
  12604.   NEXT i%
  12605. RETURN
  12606. PROCEDURE chg_midi_polymode_channel(trk%,can%)
  12607.   ' can%: 0, 1-16
  12608.   midi_in_channel%(trk%)=can%
  12609.   IF midi_polyphonic_mode!
  12610.     GOSUB reset_midi_track_state(trk%)
  12611.   ENDIF
  12612. RETURN
  12613. PROCEDURE chg_midi_flag_data_in(val!)
  12614.   midi_flag_data_in!=val!
  12615.   CARD{r_midi_in_on%}=val!
  12616. RETURN
  12617. PROCEDURE chg_midi_flag_note_off(can%,val%)
  12618.   ' can%: 1-16
  12619.   CARD{ADD(r_midi_in_noteoff_flag%,SHL(PRED(can%),1))}=val%
  12620. RETURN
  12621. PROCEDURE chg_midi_flag_velocity(can%,val!)
  12622.   ' can%: 1-16
  12623.   CARD{ADD(r_midi_in_velo_flag%,SHL(PRED(can%),1))}=val!
  12624. RETURN
  12625. PROCEDURE reset_all_midi_track_state
  12626.   ' Reinitialise toutes les pistes MIDI en mode Polyphonique
  12627.   LOCAL trk%,can%
  12628.   FOR trk%=0 TO 31
  12629.     GOSUB reset_midi_track_state(trk%)
  12630.   NEXT trk%
  12631.   FOR can%=0 TO 15
  12632.     GOSUB chg_midi_in_instr(can%,midi_in_instr%(can%))
  12633.   NEXT can%
  12634. RETURN
  12635. PROCEDURE reset_midi_track_state(trk%)
  12636.   ' Reinitialise une piste MIDI en mode Polyphonique
  12637.   LOCAL adr%
  12638.   adr%=ADD(r_midi_track_state%,MUL(trk%,r_midi_ts_next%))
  12639.   IF trk%<nbr_track%
  12640.     CARD{adr%}=midi_in_channel%(trk%)
  12641.   ELSE
  12642.     CARD{adr%}=0
  12643.   ENDIF
  12644.   CARD{ADD(adr%,2)}=0
  12645.   CARD{ADD(adr%,4)}=0
  12646.   CARD{ADD(adr%,6)}=0
  12647.   CARD{ADD(adr%,8)}=0
  12648.   LONG{ADD(adr%,10)}=0
  12649.   BYTE{ADD(adr%,14)}=0
  12650. RETURN
  12651. PROCEDURE chg_midi_flag_data_out(val!)
  12652.   midi_flag_data_out!=val!
  12653.   CARD{r_midi_out_on%}=val!
  12654. RETURN
  12655. '
  12656. ' Fonctions de bloc
  12657. ' -----------------
  12658. PROCEDURE insert_line_track(pat%,lig%,trk%,fil$)
  12659.   LOCAL i%,k%
  12660.   IF lig%<PRED(FN nbr_lines(pat%))
  12661.     k%=MUL(nbr_track%,5)
  12662.     FOR i%=FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%) TO FN adr_trk(pat%,SUCC(lig%),trk%) STEP -k%
  12663.       BMOVE SUB(i%,k%),i%,5
  12664.     NEXT i%
  12665.   ENDIF
  12666.   BMOVE V:fil$,FN adr_trk(pat%,lig%,trk%),5
  12667. RETURN
  12668. PROCEDURE insert_line_pattern(pat%,lig%)
  12669.   LOCAL j%
  12670.   FOR j%=0 TO PRED(nbr_track%)
  12671.     GOSUB insert_line_track(pat%,lig%,j%,STRING$(5,0))
  12672.   NEXT j%
  12673. RETURN
  12674. PROCEDURE insert_line_preset(pat%,lig%)
  12675.   LOCAL j%
  12676.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12677.     GOSUB insert_line_track(pat%,lig%,preset&(j%,n_preset%),STRING$(5,0))
  12678.   NEXT j%
  12679. RETURN
  12680. PROCEDURE insert_r_line_track(pat%,lig%,trk%)
  12681.   LOCAL a$
  12682.   a$=STRING$(5,0)
  12683.   BMOVE FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%),V:a$,5
  12684.   GOSUB insert_line_track(pat%,lig%,trk%,a$)
  12685. RETURN
  12686. PROCEDURE insert_r_line_pattern(pat%,lig%)
  12687.   LOCAL j%
  12688.   FOR j%=0 TO PRED(nbr_track%)
  12689.     GOSUB insert_r_line_track(pat%,lig%,j%)
  12690.   NEXT j%
  12691. RETURN
  12692. PROCEDURE insert_r_line_preset(pat%,lig%)
  12693.   LOCAL j%
  12694.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12695.     GOSUB insert_r_line_track(pat%,lig%,preset&(j%,n_preset%))
  12696.   NEXT j%
  12697. RETURN
  12698. PROCEDURE delete_line_track(pat%,lig%,trk%,fil$)
  12699.   LOCAL i%,k%
  12700.   IF lig%<PRED(FN nbr_lines(pat%))
  12701.     k%=MUL(nbr_track%,5)
  12702.     FOR i%=FN adr_trk(pat%,SUCC(lig%),trk%) TO FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%) STEP k%
  12703.       BMOVE i%,SUB(i%,k%),5
  12704.     NEXT i%
  12705.   ENDIF
  12706.   BMOVE V:fil$,FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%),5
  12707. RETURN
  12708. PROCEDURE delete_line_pattern(pat%,lig%)
  12709.   LOCAL j%
  12710.   FOR j%=0 TO PRED(nbr_track%)
  12711.     GOSUB delete_line_track(pat%,lig%,j%,STRING$(5,0))
  12712.   NEXT j%
  12713. RETURN
  12714. PROCEDURE delete_line_preset(pat%,lig%)
  12715.   LOCAL j%
  12716.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12717.     GOSUB delete_line_track(pat%,lig%,preset&(j%,n_preset%),STRING$(5,0))
  12718.   NEXT j%
  12719. RETURN
  12720. PROCEDURE delete_r_line_track(pat%,lig%,trk%)
  12721.   LOCAL a$
  12722.   a$=STRING$(5,0)
  12723.   BMOVE FN adr_trk(pat%,lig%,trk%),V:a$,5
  12724.   GOSUB delete_line_track(pat%,lig%,trk%,a$)
  12725. RETURN
  12726. PROCEDURE delete_r_line_pattern(pat%,lig%)
  12727.   LOCAL j%
  12728.   FOR j%=0 TO PRED(nbr_track%)
  12729.     GOSUB delete_r_line_track(pat%,lig%,j%)
  12730.   NEXT j%
  12731. RETURN
  12732. PROCEDURE delete_r_line_preset(pat%,lig%)
  12733.   LOCAL j%
  12734.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12735.     GOSUB delete_r_line_track(pat%,lig%,preset&(j%,n_preset%))
  12736.   NEXT j%
  12737. RETURN
  12738. PROCEDURE block_start
  12739.   bl_pat&=song&(songpos%)
  12740.   bl_start&=posligne%
  12741.   bl_end&=MIN(MAX(bl_end&,posligne%),FN nbr_lines(bl_pat&))
  12742.   bl_trk&=preset&(curs_col%,n_preset%)
  12743.   REPEAT
  12744.   UNTIL MOUSEK=0
  12745.   GOSUB affiche_barre_info
  12746. RETURN
  12747. PROCEDURE block_end
  12748.   bl_pat&=song&(songpos%)
  12749.   bl_end&=posligne%
  12750.   bl_start&=MIN(bl_start&,posligne%)
  12751.   bl_trk&=preset&(curs_col%,n_preset%)
  12752.   REPEAT
  12753.   UNTIL MOUSEK=0
  12754.   GOSUB affiche_barre_info
  12755. RETURN
  12756. PROCEDURE paste_block
  12757.   LOCAL i&,l&,s%,d%,a%,i%,j%,k%,inf$
  12758.   i&=MUL(nbr_track%,5)
  12759.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),SUB(FN nbr_lines3,posligne%))
  12760.   IF trackpat%=0
  12761.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12762.     d%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  12763.     SUB d%,s%
  12764.     IF d%>0
  12765.       ADD s%,MUL(PRED(l&),i&)
  12766.       i&=-i&
  12767.     ENDIF
  12768.     inf$=MKL$(s%)+MKL$(ADD(s%,d%))+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(0)+MKL$(V:preset&(0,n_preset%))
  12769.     a%=V:inf$
  12770.     ~C:g_paste_note_block%(L:a%)
  12771.   ELSE IF trackpat%=1
  12772.     s%=FN adr_line(bl_pat&,bl_start&)
  12773.     d%=FN adr_sline(songpos%,posligne%)
  12774.     SUB d%,s%
  12775.     e%=ADD(s%,MUL(PRED(l&),i&))
  12776.     IF d%>0
  12777.       SWAP s%,e%
  12778.       i&=-i&
  12779.     ENDIF
  12780.     inf$=MKL$(s%)+MKL$(ADD(s%,d%))+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(1)+MKL$(V:preset&(0,n_preset%))
  12781.     a%=V:inf$
  12782.     ~C:g_paste_note_block%(L:a%)
  12783.   ELSE
  12784.     s%=FN adr_line(bl_pat&,bl_start&)
  12785.     d%=FN adr_sline(songpos%,posligne%)
  12786.     SUB d%,s%
  12787.     IF d%>0
  12788.       ADD s%,MUL(PRED(l&),i&)
  12789.       i&=-i&
  12790.     ENDIF
  12791.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12792.     inf$=MKL$(s%)+MKL$(ADD(s%,d%))+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(a%)+MKI$(2)+MKL$(V:preset&(0,n_preset%))
  12793.     a%=V:inf$
  12794.     ~C:g_paste_note_block%(L:a%)
  12795.   ENDIF
  12796. RETURN
  12797. PROCEDURE insert_block
  12798.   LOCAL bls2&,ble2&,blp2&,blt2&,pl2%
  12799.   IF NOT (posligne%<=bl_end& AND bl_pat&=song&(songpos%) AND ((bl_trk&=preset&(curs_col%,n_preset%) AND trackpat%=0) OR trackpat%>0))
  12800.     IF ADD(SUB(bl_end&,bl_start&),posligne%)<PRED(FN nbr_lines3)
  12801.       bls2&=posligne%
  12802.       ble2&=ADD(posligne%,SUB(bl_end&,bl_start&))
  12803.       blp2&=song&(songpos%)
  12804.       blt2&=bl_trk&
  12805.       pl2%=SUCC(ble2&)
  12806.       SWAP bl_start&,bls2&
  12807.       SWAP bl_end&,ble2&
  12808.       SWAP bl_pat&,blp2&
  12809.       SWAP posligne%,pl2%
  12810.       bl_trk&=preset&(curs_col%,n_preset%)
  12811.       GOSUB paste_block           ! Decale le morceau de pattern si necessaire
  12812.       SWAP bl_start&,bls2&
  12813.       SWAP bl_end&,ble2&
  12814.       SWAP bl_pat&,blp2&
  12815.       SWAP posligne%,pl2%
  12816.       bl_trk&=blt2&
  12817.     ENDIF
  12818.     GOSUB paste_block
  12819.   ENDIF
  12820. RETURN
  12821. PROCEDURE clear_block
  12822.   LOCAL i&,l&,s%,a%,i%,j%,k%
  12823.   i&=MUL(nbr_track%,5)
  12824.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),SUB(FN nbr_lines(bl_pat&),posligne%))
  12825.   IF trackpat%=0
  12826.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12827.     inf$=MKL$(s%)+MKL$(0)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(0)+MKL$(V:preset&(0,n_preset%))
  12828.     a%=V:inf$
  12829.     ~C:g_clear_note_block%(L:a%)
  12830.   ELSE IF trackpat%=1
  12831.     s%=FN adr_line(bl_pat&,bl_start&)
  12832.     inf$=MKL$(s%)+MKL$(0)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(1)+MKL$(V:preset&(0,n_preset%))
  12833.     a%=V:inf$
  12834.     ~C:g_clear_note_block%(L:a%)
  12835.   ELSE
  12836.     s%=FN adr_line(bl_pat&,bl_start&)
  12837.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12838.     inf$=MKL$(s%)+MKL$(0)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(a%)+MKI$(2)+MKL$(V:preset&(0,n_preset%))
  12839.     a%=V:inf$
  12840.     ~C:g_clear_note_block%(L:a%)
  12841.   ENDIF
  12842. RETURN
  12843. PROCEDURE delete_block
  12844.   LOCAL bls2&,ble2&,pl2%
  12845.   bls2&=SUCC(bl_end&)
  12846.   ble2&=PRED(FN nbr_lines3)
  12847.   SWAP bl_start&,bls2&
  12848.   SWAP bl_end&,ble2&
  12849.   IF ble2&<PRED(FN nbr_lines3)
  12850.     pl2%=bls2&
  12851.     SWAP posligne%,pl2%
  12852.     GOSUB paste_block           ! Decale le morceau de pattern si necessaire
  12853.     SWAP posligne%,pl2%
  12854.   ENDIF
  12855.   bl_start&=SUB(FN nbr_lines3,SUCC(SUB(ble2&,bls2&)))
  12856.   GOSUB clear_block
  12857.   SWAP bl_start&,bls2&
  12858.   SWAP bl_end&,ble2&
  12859. RETURN
  12860. PROCEDURE note_up_general
  12861.   LOCAL i%,p%,oldp%
  12862.   IF bl_flagsong!               ! Scanne tous les patterns utilises par la song
  12863.     oldp%=bl_pat&
  12864.     FOR p%=0 TO FN last_pat_util
  12865.       i%=0
  12866.       REPEAT
  12867.         IF song&(i%)=p%
  12868.           bl_pat&=p%
  12869.           GOSUB note_up_block
  12870.           i%=FN song_length
  12871.         ELSE
  12872.           INC i%
  12873.         ENDIF
  12874.       UNTIL i%=>FN song_length
  12875.     NEXT p%
  12876.     bl_pat&=oldp%
  12877.   ELSE                          ! Simplement sur le bloc
  12878.     GOSUB note_up_block
  12879.   ENDIF
  12880. RETURN
  12881. PROCEDURE note_up_block
  12882.   LOCAL i&,l&,s%,a%,i%,j%,k%
  12883.   i&=MUL(nbr_track%,5)
  12884.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),FN nbr_lines(bl_pat&))
  12885.   IF trackpat%=0
  12886.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12887.     inf$=MKL$(s%)+MKL$(1)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(0)+MKL$(V:preset&(0,n_preset%))
  12888.     a%=V:inf$
  12889.     ~C:g_transpose_note_block%(L:a%)
  12890.   ELSE IF trackpat%=1
  12891.     s%=FN adr_line(bl_pat&,bl_start&)
  12892.     inf$=MKL$(s%)+MKL$(1)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(1)+MKL$(V:preset&(0,n_preset%))
  12893.     a%=V:inf$
  12894.     ~C:g_transpose_note_block%(L:a%)
  12895.   ELSE
  12896.     s%=FN adr_line(bl_pat&,bl_start&)
  12897.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12898.     inf$=MKL$(s%)+MKL$(1)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(a%)+MKI$(2)+MKL$(V:preset&(0,n_preset%))
  12899.     a%=V:inf$
  12900.     ~C:g_transpose_note_block%(L:a%)
  12901.   ENDIF
  12902. RETURN
  12903. PROCEDURE note_down_general
  12904.   LOCAL i%,p%,oldp%
  12905.   IF bl_flagsong!               ! Scanne tous les patterns utilises par la song
  12906.     oldp%=bl_pat&
  12907.     FOR p%=0 TO FN last_pat_util
  12908.       i%=0
  12909.       REPEAT
  12910.         IF song&(i%)=p%
  12911.           bl_pat&=p%
  12912.           GOSUB note_down_block
  12913.           i%=FN song_length
  12914.         ELSE
  12915.           INC i%
  12916.         ENDIF
  12917.       UNTIL i%=>FN song_length
  12918.     NEXT p%
  12919.     bl_pat&=oldp%
  12920.   ELSE                          ! Simplement sur le bloc
  12921.     GOSUB note_down_block
  12922.   ENDIF
  12923. RETURN
  12924. PROCEDURE note_down_block
  12925.   LOCAL i&,l&,s%,a%,i%,j%,k%
  12926.   i&=MUL(nbr_track%,5)
  12927.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),FN nbr_lines(bl_pat&))
  12928.   IF trackpat%=0
  12929.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12930.     inf$=MKL$(s%)+MKL$(-1)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(0)+MKL$(V:preset&(0,n_preset%))
  12931.     a%=V:inf$
  12932.     ~C:g_transpose_note_block%(L:a%)
  12933.   ELSE IF trackpat%=1
  12934.     s%=FN adr_line(bl_pat&,bl_start&)
  12935.     inf$=MKL$(s%)+MKL$(-1)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(1)+MKL$(V:preset&(0,n_preset%))
  12936.     a%=V:inf$
  12937.     ~C:g_transpose_note_block%(L:a%)
  12938.   ELSE
  12939.     s%=FN adr_line(bl_pat&,bl_start&)
  12940.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12941.     inf$=MKL$(s%)+MKL$(-1)+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(a%)+MKI$(2)+MKL$(V:preset&(0,n_preset%))
  12942.     a%=V:inf$
  12943.     ~C:g_transpose_note_block%(L:a%)
  12944.   ENDIF
  12945. RETURN
  12946. PROCEDURE swap_block
  12947.   LOCAL i&,l&,s%,d%,a%,i%,j%,k%
  12948.   i&=MUL(nbr_track%,5)
  12949.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),SUB(FN nbr_lines3,posligne%))
  12950.   IF trackpat%=0
  12951.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12952.     d%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  12953.     SUB d%,s%
  12954.     IF d%>0
  12955.       ADD s%,MUL(PRED(l&),i&)
  12956.       i&=-i&
  12957.     ENDIF
  12958.     inf$=MKL$(s%)+MKL$(ADD(s%,d%))+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(0)+MKL$(V:preset&(0,n_preset%))
  12959.     a%=V:inf$
  12960.     ~C:g_swap_note_block%(L:a%)
  12961.   ELSE IF trackpat%=1
  12962.     s%=FN adr_line(bl_pat&,bl_start&)
  12963.     d%=FN adr_sline(songpos%,posligne%)
  12964.     SUB d%,s%
  12965.     e%=ADD(s%,MUL(PRED(l&),i&))
  12966.     IF d%>0
  12967.       SWAP s%,e%
  12968.       i&=-i&
  12969.     ENDIF
  12970.     inf$=MKL$(s%)+MKL$(ADD(s%,d%))+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(nbr_colonnes%(n_preset%))+MKI$(1)+MKL$(V:preset&(0,n_preset%))
  12971.     a%=V:inf$
  12972.     ~C:g_swap_note_block%(L:a%)
  12973.   ELSE
  12974.     s%=FN adr_line(bl_pat&,bl_start&)
  12975.     d%=FN adr_sline(songpos%,posligne%)
  12976.     SUB d%,s%
  12977.     IF d%>0
  12978.       ADD s%,MUL(PRED(l&),i&)
  12979.       i&=-i&
  12980.     ENDIF
  12981.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12982.     inf$=MKL$(s%)+MKL$(ADD(s%,d%))+MKL$(i&)+MKI$(l&)+MKL$(V:bl_maska1$)+MKL$(V:bl_maska2$)+MKL$(V:bl_maskb1$)+MKL$(V:bl_maskb2$)+MKI$(maskblock%)+MKI$(replaceblock%)+MKI$(nbr_track%)+MKI$(a%)+MKI$(2)+MKL$(V:preset&(0,n_preset%))
  12983.     a%=V:inf$
  12984.     ~C:g_swap_note_block%(L:a%)
  12985.   ENDIF
  12986. RETURN
  12987. PROCEDURE echo_block                    !!!
  12988.   ' Ne fait pour l'instant que sur une piste
  12989.   LOCAL a%,b%,i%,pt%
  12990.   LOCAL buf$
  12991.   buf$=STRING$(MUL(bl_echo_lines%,5),0)
  12992.   pt%=0
  12993.   FOR i%=bl_start& TO bl_end&
  12994.     a%=FN adr_trk(bl_pat&,i%,bl_trk&)
  12995.     ' Sortie du buffer
  12996.     IF BYTE{a%}=0 AND BYTE{ADD(V:buf$,pt%)}<>0
  12997.       LONG{a%}=LONG{ADD(V:buf$,pt%)}
  12998.       BYTE{ADD(a%,4)}=BYTE{ADD(ADD(V:buf$,pt%),4)}
  12999.     ENDIF
  13000.     ' Entree dans le buffer
  13001.     IF BYTE{a%}<>0
  13002.       IF NOT bl_echo_cont!
  13003.         buf$=STRING$(MUL(bl_echo_lines%,5),0)
  13004.       ENDIF
  13005.       b%=LONG{a%}
  13006.       LONG{ADD(V:buf$,pt%)}=b%
  13007.       IF (b% AND &HF000)=&H2000
  13008.         b%=MIN(b% AND &H1FF,&H100)
  13009.         CARD{ADD(ADD(V:buf$,pt%),2)}=0
  13010.       ELSE
  13011.         b%=BYTE{ADD(a%,4)}
  13012.         IF b%=0
  13013.           IF BYTE{ADD(a%,2)}=0
  13014.             b%=&H100
  13015.           ELSE
  13016.             b%=FN volume(BYTE{SUCC(a%)})
  13017.           ENDIF
  13018.         ENDIF
  13019.       ENDIF
  13020.       IF bl_echo_fdbk!                  ! Avec feedback
  13021.         b%=DIV(MUL(b%,bl_echo_feedback%),100)
  13022.       ELSE                              ! Avec fade
  13023.         b%=MAX(SUB(b%,bl_echo_fadestep%),0)
  13024.       ENDIF
  13025.       BYTE{ADD(ADD(V:buf$,pt%),4)}=b%
  13026.       IF b%=0
  13027.         LONG{ADD(V:buf$,pt%)}=0
  13028.       ENDIF
  13029.     ENDIF
  13030.     pt%=ADD(pt%,5) MOD MUL(bl_echo_lines%,5)
  13031.   NEXT i%
  13032. RETURN
  13033. PROCEDURE volume_slide(pat%,lig%,trk%)
  13034.   LOCAL a%,b%,c%,d%,i%,v1%,v2%
  13035.   b%=-1
  13036.   c%=-1
  13037.   ' Recherche du premier effet de volume a partir du curseur en montant
  13038.   a%=lig%
  13039.   REPEAT
  13040.     d%=FN adr_trk(pat%,a%,trk%)
  13041.     IF BYTE{ADD(d%,4)}<>0 OR (BYTE{ADD(d%,2)} AND &HF0)=&H20 OR (BYTE{ADD(d%,2)} AND &HF0)=&H30
  13042.       b%=a%
  13043.     ENDIF
  13044.     DEC a%
  13045.   UNTIL a%<0 OR b%>=0
  13046.   ' Recherche du premier effet de volume a partir du curseur en descendant
  13047.   a%=lig%
  13048.   REPEAT
  13049.     d%=FN adr_trk(pat%,a%,trk%)
  13050.     IF BYTE{ADD(d%,4)}<>0 OR (BYTE{ADD(d%,2)} AND &HF0)=&H20 OR (BYTE{ADD(d%,2)} AND &HF0)=&H30
  13051.       c%=a%
  13052.     ENDIF
  13053.     INC a%
  13054.   UNTIL a%>=FN nbr_lines(pat%) OR c%>=0
  13055.   IF b%>=0 AND c%>=0 AND SUB(c%,b%)>1
  13056.     ' Volume de depart
  13057.     a%=FN adr_trk(pat%,b%,trk%)
  13058.     v1%=BYTE{ADD(a%,4)}
  13059.     IF (BYTE{ADD(a%,2)} AND &HF0)=&H20
  13060.       v1%=MIN(CARD{ADD(a%,2)} AND &HFFF,&H100)
  13061.     ELSE IF (BYTE{ADD(a%,2)} AND &HF0)=&H30
  13062.       v1%=2^(MIN(CARD{ADD(a%,2)} AND &HFFF,&H800)/256)
  13063.     ENDIF
  13064.     ' Volume d'arrivee
  13065.     a%=FN adr_trk(pat%,c%,trk%)
  13066.     v2%=BYTE{ADD(a%,4)}
  13067.     IF (BYTE{ADD(a%,2)} AND &HF0)=&H20
  13068.       v2%=MIN(CARD{ADD(a%,2)} AND &HFFF,&H100)
  13069.     ELSE IF (BYTE{ADD(a%,2)} AND &HF0)=&H30
  13070.       v2%=2^(MIN(CARD{ADD(a%,2)} AND &HFFF,&H800)/256)
  13071.     ENDIF
  13072.     ' Volume fade
  13073.     FOR i%=SUCC(b%) TO PRED(c%)
  13074.       a%=FN adr_trk(pat%,i%,trk%)
  13075.       d%=ADD(v1%,DIV(MUL(SUB(v2%,v1%),SUB(i%,b%)),SUB(c%,b%)))
  13076.       BYTE{ADD(a%,4)}=MIN(255,MAX(1,d%))
  13077.     NEXT i%
  13078.   ENDIF
  13079. RETURN
  13080. '
  13081. '
  13082. '
  13083. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  13084. ' *                                                                          *
  13085. ' *                      Procedures pour le Drum Editor                      *
  13086. ' *                                                                          *
  13087. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  13088. '
  13089. ' General
  13090. ' -------
  13091. PROCEDURE drum_editor           !!!
  13092.   LOCAL de.nbr_lines%
  13093.   de.nbr_lines%=MIN(DIV(SUB(scr_haut%,ADD(divbi&(1,34,30),5)),SUCC(divbi&(3,34,30))),nbr_track%)
  13094.   GOSUB affiche_panneau_drum
  13095.   ~GEMDOS(7)
  13096. RETURN
  13097. PROCEDURE affiche_panneau_drum  !!!
  13098.   LOCAL i%,j%
  13099.   DEFMOUSE 0
  13100.   HIDEM
  13101.   GOSUB cadre_int(0,0,PRED(scr_ncol%),39,9,9,10,8)
  13102.   GOSUB cadre_int(0,40,PRED(scr_ncol%),SUB(PRED(scr_haut%),40),9,9,10,8)
  13103.   GOSUB affiche_bloc_icones(0,23,30,0,0)
  13104.   GOSUB cadre_ext(ADD(divbi&(0,4,30),8),ADD(divbi&(1,4,30),2),2,5,0,13,12,14)
  13105.   GOSUB cadre_ext(ADD(divbi&(0,7,30),9),ADD(divbi&(1,7,30),2),1,5,0,13,12,14)
  13106.   GOSUB cadre_ext(ADD(divbi&(0,10,30),8),ADD(divbi&(1,10,30),2),2,5,0,13,12,14)
  13107.   GOSUB cadre_ext(ADD(divbi&(0,13,30),8),ADD(divbi&(1,13,30),2),2,5,0,13,12,14)
  13108.   IF de.display_type%=0
  13109.     FOR i%=0 TO PRED(de.nbr_lines%)
  13110.       GOSUB affiche_icone(34,30,0,MUL(i%,10),FALSE)
  13111.       GOSUB affiche_icone(35,30,0,MUL(i%,10),FALSE)
  13112.       GOSUB cadre_ext(ADD(divbi&(0,34,30),1),ADD(divbi&(1,34,30),ADD(MUL(i%,10),2)),SUB(divbi&(2,34,30),2),5,0,13,12,14)
  13113.     NEXT i%
  13114.     GOSUB cadre_ext(15,62,SUB(scr_ncol%,17),5,0,13,12,14)
  13115.     GOSUB cadre_ext(15,70,SUB(scr_ncol%,17),PRED(MUL(de.nbr_lines%,10)),0,13,12,14)
  13116.   ELSE
  13117.     FOR i%=0 TO PRED(de.nbr_lines%)
  13118.       FOR j%=23 TO 33
  13119.         GOSUB affiche_icone(j%,30,0,MUL(i%,10),FALSE)
  13120.       NEXT j%
  13121.       GOSUB cadre_ext(ADD(divbi&(0,23,30),1),ADD(divbi&(1,23,30),ADD(MUL(i%,10),2)),SUB(divbi&(2,23,30),2),5,0,13,12,14)
  13122.       GOSUB cadre_ext(ADD(divbi&(0,24,30),4),ADD(divbi&(1,24,30),ADD(MUL(i%,10),2)),11,5,0,13,12,14)
  13123.       GOSUB cadre_ext(ADD(divbi&(0,24,30),17),ADD(divbi&(1,24,30),ADD(MUL(i%,10),2)),2,5,0,13,12,14)
  13124.       GOSUB cadre_ext(ADD(divbi&(0,28,30),6),ADD(divbi&(1,28,30),ADD(MUL(i%,10),2)),1,5,0,13,12,14)
  13125.       GOSUB cadre_ext(ADD(divbi&(0,31,30),1),ADD(divbi&(1,31,30),ADD(MUL(i%,10),2)),SUB(divbi&(2,31,30),2),5,0,13,12,14)
  13126.     NEXT i%
  13127.     IF scr_ncol%>=86
  13128.       GOSUB cadre_ext(81,62,SUB(scr_ncol%,83),5,0,13,12,14)
  13129.       GOSUB cadre_ext(81,70,SUB(scr_ncol%,83),PRED(MUL(de.nbr_lines%,10)),0,13,12,14)
  13130.     ENDIF
  13131.   ENDIF
  13132. RETURN
  13133. '
  13134. '
  13135. '
  13136. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  13137. ' *                                                                          *
  13138. ' *                     Procedures pour le Sample Editor                     *
  13139. ' *                                                                          *
  13140. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  13141. '
  13142. ' General
  13143. ' -------
  13144. PROCEDURE sample_editor                 !!!
  13145.   ' Le buffer doit avoir une taille de 4 au minimum, et sa longueur doit etre paire
  13146.   ' La longueur de la fenetre affichee doit etre paire et avoir une taille minimum de 2
  13147.   ' Sa position aussi doit etre paire
  13148.   ' Idem pour l'espace entre les curseurs
  13149.   LOCAL a%,b%,c%,d%,i%,j%,k%,noact_delay%,orx%,ory%,orc%,hwin%,lwin%,xm%,xm2%,ym%,ym2%,km%,srt%
  13150.   LOCAL a#,temp1#,temp2#,temp3#
  13151.   LOCAL flag_exit!,flag_relachement!
  13152.   LOCAL a$,b$,info_tr$,aaaa$
  13153.   se.sample_editor_flag!=TRUE
  13154.   se.pas_sous_menu!=FALSE
  13155.   ~FRE(0)
  13156.   CLS
  13157.   GOSUB bee(TRUE)
  13158.   info_tr$=STRING$(34,0)        ! Des infos pour le replay des samples
  13159.   flag_relachement!=TRUE        ! Il faut relâcher le bouton apres avoir clique sur une icone
  13160.   ' sjx - experimentation with that godawful pause - RAINSTORM
  13161.   IF se_revbuffer!
  13162.     a%=FN adr_buffer
  13163.     b%=FN lon_buffer
  13164.     ~C:g_invert_memory%(L:a%,L:b%,W:2)                            ! Remet le buffer dans le bon sens
  13165.   ENDIF
  13166.   GOSUB mise_a_jour_sample_buffer(TRUE)
  13167.   orx%=SHR(SUB(scr_larg%,640),1) AND -8                         ! Origine X du panneau
  13168.   orc%=SHR(orx%,3)                                              ! Idem, en colonnes
  13169.   IF scr_haut%>399
  13170.     hwin%=MIN(SUB(scr_haut%,148),152) AND -4                    ! Hauteur de la fenetre du sample
  13171.   ELSE IF scr_haut%>240 OR scr_haut%<220
  13172.     hwin%=MIN(SUB(scr_haut%,148),72) AND -4
  13173.   ELSE
  13174.     hwin%=DIV(SUB(scr_haut%,156),2) AND -4
  13175.   ENDIF
  13176.   lwin%=SUB(scr_larg%,96)                                       ! Sa largeur
  13177.   ory%=ADD(hwin%,8)                                             ! Origine Y du panneau
  13178.   GOSUB affiche_panneau_sample
  13179.   '
  13180.   ' Boucle principale
  13181.   '
  13182.   flag_exit!=FALSE
  13183.   REPEAT
  13184.     SHOWM
  13185.     MOUSE xm%,ym%,km%
  13186.     ' Curseurs
  13187.     IF km%>0 AND xm%>=16 AND xm%<ADD(lwin%,16) AND ym%>3 AND ym%<ADD(4,hwin%)
  13188.       IF km%=1                  ! Curseur gauche
  13189.         HIDEM
  13190.         GOSUB efface_2_curs
  13191.         temp1#=SUB(xm%,16)
  13192.         temp2#=win_lon%-1E-07
  13193.         temp3#=PRED(lwin%)
  13194.         a%=MIN(SUB(ADD(mark_1%,mark_len%),2),ADD(INT(temp1#*temp2#/temp3#),win_pos%)) AND -2
  13195.         mark_len%=SUB(ADD(mark_1%,mark_len%),a%)
  13196.         mark_1%=a%
  13197.         GOSUB affiche_2_curs
  13198.         SHOWM
  13199.         GOSUB affchaine_notrans(HEX$(mark_1%,6),ADD(orc%,8),ADD(ory%,2),1)
  13200.         se.volume_ok!=FALSE
  13201.         noact_delay%=5
  13202.       ELSE IF km%=2             ! Curseur droit
  13203.         HIDEM
  13204.         GOSUB efface_2_curs
  13205.         temp1#=SUB(xm%,16)
  13206.         temp2#=win_lon%
  13207.         temp3#=PRED(lwin%)
  13208.         a%=INT(temp1#*temp2#/temp3#) AND -2
  13209.         mark_len%=MAX(MIN(SUB(ADD(a%,win_pos%),mark_1%),SUB(FN lon_buffer,mark_1%)),2)
  13210.         GOSUB affiche_2_curs
  13211.         SHOWM
  13212.         GOSUB affchaine_notrans(HEX$(ADD(mark_1%,mark_len%),6),ADD(orc%,66),ADD(ory%,2),1)
  13213.         se.volume_ok!=FALSE
  13214.         noact_delay%=5
  13215.       ENDIF
  13216.       GOSUB affchaine_notrans(HEX$(mark_len%,6),ADD(orc%,29),ADD(ory%,2),1)
  13217.     ENDIF
  13218.     ' Test des icones
  13219.     xm2%=SUB(xm%,orx%)
  13220.     ym2%=SUB(ym%,ory%)
  13221.     IF km%>0
  13222.       ' Bloc d'icones principal
  13223.       a%=V:divbi&(0,0,0)
  13224.       srt%=C:g_teste_icones%(L:a%,W:2,W:xm2%,W:ym2%)
  13225.       IF srt%=>0
  13226.         GOSUB sample_editor.icones_principales
  13227.       ELSE
  13228.         a%=V:divbi&(0,0,0)
  13229.         srt%=C:g_teste_icones%(L:a%,W:3,W:xm2%,W:ym2%)
  13230.         IF srt%=>0
  13231.           GOSUB sample_editor.indicateurs_principaux
  13232.         ELSE
  13233.           a%=V:divbi&(0,0,0)
  13234.           srt%=C:g_teste_icones%(L:a%,W:4,W:xm2%,W:ym2%)
  13235.           IF srt%>=0
  13236.             ss_menu2%=SUCC(srt%)
  13237.             GOSUB sample_editor.affiche_sm
  13238.           ENDIF
  13239.         ENDIF
  13240.       ENDIF
  13241.     ENDIF
  13242.     ' Test des sous-menus (souris et touches)
  13243.     SELECT ss_menu2%
  13244.     CASE 1 TO 4
  13245.       ON ss_menu2% GOSUB se.sm_gere_volume,se.sm_gere_mix,se.sm_gere_record,se.sm_gere_marks
  13246.     CASE 5 TO 8
  13247.       ON SUB(ss_menu2%,4) GOSUB se.sm_gere_freq,se.sm_gere_delay,se.sm_gere_flanger,se.sm_gere_reverb
  13248.     CASE 9 TO 12
  13249.       ON SUB(ss_menu2%,8) GOSUB se.sm_gere_song2disk,se.sm_gere_compression,se.sm_gere_distortion
  13250.     ENDSELECT
  13251.     ' Test du clavier
  13252.     GOSUB sample_editor.touches
  13253.     IF noact_delay%>0
  13254.       DEC noact_delay%
  13255.     ENDIF
  13256.   UNTIL flag_exit!
  13257.   '
  13258.   CLS
  13259.   ' sjx - experimentation with that godawful pause - RAINSTORM
  13260.   ' I don't think this is actually necessary. I certainly think it's annoyingly slow.
  13261.   IF se_revbuffer!
  13262.     b%=FN lon_buffer                              ! Inverse le buffer pour pouvoir
  13263.     a%=FN adr_buffer                              ! garder son debut si les
  13264.     ~C:g_invert_memory%(L:a%,L:b%,W:2)            ! samples grandissent
  13265.   ENDIF
  13266.   se.sample_editor_flag!=FALSE
  13267. RETURN
  13268. PROCEDURE sample_editor.icones_principales
  13269.   GOSUB affiche_icone(srt%,2,orc%,ory%,1)
  13270.   GOSUB wait_mouse(TRUE)
  13271.   SELECT srt%
  13272.   CASE 0                        ! Exit
  13273.     flag_exit!=TRUE
  13274.   CASE 1                        ! Zoom : saisit l'image entre les curseurs
  13275.     win_pos%=mark_1%
  13276.     win_lon%=mark_len%
  13277.     GOSUB affiche_sample
  13278.   CASE 2                        ! Zoom out : longueur de fenetre multipliee par 2
  13279.     win_pos%=MAX(0,SUB(win_pos%,SHR(win_lon%,1)) AND -2)
  13280.     win_lon%=MIN(SHL(win_lon%,1),SUB(FN lon_buffer,win_pos%))
  13281.     GOSUB affiche_sample
  13282.   CASE 3                        ! Copy sample => block
  13283.     GOSUB copy_sample_to_block
  13284.     se.volume_ok!=FALSE
  13285.     noact_delay%=5
  13286.   CASE 4                        ! Copy block => sample
  13287.     GOSUB copy_block_to_sample
  13288.   CASE 5                        ! Swap block <=> sample
  13289.     GOSUB swap_sample_and_block
  13290.     se.volume_ok!=FALSE
  13291.     noact_delay%=5
  13292.   CASE 6                        ! Clear
  13293.     GOSUB dialog("CLEAR","Clear block ?","Ok|Cancel",xm%,ym%)
  13294.     IF bouton%=0
  13295.       GOSUB bee(TRUE)
  13296.       GOSUB clear_mem(ADD(FN adr_buffer,mark_1%),mark_len%)
  13297.     ENDIF
  13298.     se.volume_ok!=FALSE
  13299.     noact_delay%=5
  13300.     GOSUB affiche_sample
  13301.   CASE 7                        ! Cut
  13302.     GOSUB dialog("CUT","Cut block ?","Ok|Cancel",xm%,ym%)
  13303.     IF bouton%=0
  13304.       GOSUB bee(TRUE)
  13305.       GOSUB se.sm_chg_marks(ADD(mark_1%,mark_len%),mark_1%)
  13306.       IF ADD(mark_1%,mark_len%)<FN lon_buffer
  13307.         BMOVE ADD(FN adr_buffer,ADD(mark_1%,mark_len%)),ADD(FN adr_buffer,mark_1%),SUB(FN lon_buffer,ADD(mark_1%,mark_len%))
  13308.       ENDIF
  13309.       GOSUB clear_mem(ADD(FN adr_buffer,SUB(FN lon_buffer,mark_len%)),mark_len%)
  13310.     ENDIF
  13311.     se.volume_ok!=FALSE
  13312.     noact_delay%=5
  13313.     GOSUB affiche_sample
  13314.   CASE 8                        ! Keep
  13315.     GOSUB dialog("KEEP","Keep your block|and clear the rest ?","Ok|Cancel",xm%,ym%)
  13316.     IF bouton%=0
  13317.       GOSUB bee(TRUE)
  13318.       IF mark_1%>0
  13319.         BMOVE ADD(FN adr_buffer,mark_1%),FN adr_buffer,mark_len%
  13320.         mark_1%=0
  13321.         win_pos%=0
  13322.         win_lon%=FN lon_buffer
  13323.       ENDIF
  13324.       IF mark_len%<FN lon_buffer
  13325.         GOSUB clear_mem(ADD(FN adr_buffer,ADD(mark_1%,mark_len%)),SUB(FN lon_buffer,ADD(mark_1%,mark_len%)))
  13326.       ENDIF
  13327.     ENDIF
  13328.     GOSUB affiche_sample
  13329.   CASE 9                        ! Flip
  13330.     GOSUB bee(TRUE)
  13331.     a%=ADD(FN adr_buffer,mark_1%)
  13332.     ~C:g_invert_memory%(L:a%,L:mark_len%,W:win_bits%)
  13333.     GOSUB affiche_sample
  13334.   CASE 10                       ! Gap (block)
  13335.     GOSUB dialog("GAP","Insert blank space in the buffer,|length of the block ?","Ok|Cancel",MOUSEX,MOUSEY)
  13336.     IF bouton%=0
  13337.       GOSUB bee(TRUE)
  13338.       GOSUB se.sm_chg_marks(mark_1%,ADD(mark_1%,mark_len%))
  13339.       a%=ADD(FN adr_buffer,mark_1%)
  13340.       IF ADD(mark_1%,mark_len%)<FN lon_buffer
  13341.         BMOVE a%,ADD(a%,mark_len%),SUB(FN lon_buffer,ADD(mark_1%,mark_len%))
  13342.       ENDIF
  13343.       GOSUB clear_mem(a%,mark_len%)
  13344.     ENDIF
  13345.     se.volume_ok!=FALSE
  13346.     noact_delay%=5
  13347.     GOSUB affiche_sample
  13348.   CASE 11                       ! Gap (sample)
  13349.     GOSUB dialog("GAP","Insert blank space in the buffer,|length of the sample #"+HEX$(sample%,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  13350.     IF bouton%=0
  13351.       GOSUB bee(TRUE)
  13352.       a%=ADD(FN adr_buffer,mark_1%)
  13353.       b%=MUL(DIV(FN length(sample%),FN resol(sample%)),win_bits%)
  13354.       IF ADD(mark_1%,b%)<FN lon_buffer
  13355.         GOSUB se.sm_chg_marks(mark_1%,ADD(mark_1%,b%))
  13356.         BMOVE a%,ADD(a%,b%),SUB(FN lon_buffer,ADD(mark_1%,b%))
  13357.       ENDIF
  13358.       GOSUB clear_mem(a%,MIN(b%,SUB(FN lon_buffer,mark_1%)))
  13359.     ENDIF
  13360.     se.volume_ok!=FALSE
  13361.     noact_delay%=5
  13362.     GOSUB affiche_sample
  13363.   CASE 12                       ! Play
  13364.     GOSUB play_one_sample(48)
  13365.     GOSUB affiche_sample
  13366.   CASE 13                       ! Fine
  13367.     GOSUB dialog("ADJUST FINE POSITION","What cursor do you|want to adjust?","Left|Right|Cancel",MOUSEX,MOUSEY)
  13368.     IF bouton%=0
  13369.       a%=FN sample_editor.set_fine_position(mark_1%)
  13370.       mark_len%=SUB(ADD(mark_1%,mark_len%),a%)
  13371.       mark_1%=a%
  13372.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13373.     ELSE IF bouton%=1
  13374.       a%=FN sample_editor.set_fine_position(ADD(mark_1%,mark_len%))
  13375.       mark_len%=SUB(a%,mark_1%)
  13376.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13377.     ENDIF
  13378.     GOSUB affiche_panneau_sample
  13379.   CASE 14                       ! Swap cursor
  13380.     GOSUB swap_block_cursors
  13381.     GOSUB mise_a_jour_sample_buffer(TRUE)
  13382.     GOSUB affiche_sample
  13383.   CASE 15                       ! Reset cursors
  13384.     IF win_lon%<>FN lon_buffer
  13385.       win_pos%=0                        ! 1) Fenetre maximale
  13386.       win_lon%=FN lon_buffer
  13387.     ELSE
  13388.       mark_1%=0                         ! 2) Block maximum
  13389.       mark_len%=FN lon_buffer
  13390.       se.volume_ok!=FALSE
  13391.       noact_delay%=5
  13392.     ENDIF
  13393.     GOSUB affiche_sample
  13394.   CASE 16                       ! Load sample
  13395.     se.pas_sous_menu!=TRUE
  13396.     GOSUB load_sample(TRUE)
  13397.     se.pas_sous_menu!=FALSE
  13398.   CASE 17                       ! Save sample
  13399.     se.pas_sous_menu!=TRUE
  13400.     GOSUB save_sample(TRUE)
  13401.     se.pas_sous_menu!=FALSE
  13402.   ENDSELECT
  13403.   GOSUB affiche_icone(srt%,2,orc%,ory%,0)
  13404. RETURN
  13405. PROCEDURE sample_editor.indicateurs_principaux
  13406.   SELECT srt%
  13407.     ' ------------------------------------------------------------------------
  13408.   CASE 0                        ! Left position
  13409.     GOSUB edite_chaine(HEX$(win_pos%,6),ADD(orc%,divbi&(0,0,3)),ADD(ory%,ADD(divbi&(1,0,3),2)),6,1)
  13410.     a%=VAL("$"+bbbb$) AND -2
  13411.     IF a%>=0 AND a%<=mark_1%
  13412.       win_pos%=a%
  13413.     ENDIF
  13414.     ' ------------------------------------------------------------------------
  13415.   CASE 1                        ! Left cursor
  13416.     GOSUB edite_chaine(HEX$(mark_1%,6),ADD(orc%,divbi&(0,1,3)),ADD(ory%,ADD(divbi&(1,1,3),2)),6,1)
  13417.     a%=VAL("$"+bbbb$) AND -2
  13418.     IF a%>=0 AND a%<ADD(mark_1%,mark_len%)
  13419.       mark_len%=SUB(ADD(mark_1%,mark_len%),a%)
  13420.       mark_1%=a%
  13421.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13422.     ENDIF
  13423.     ' ------------------------------------------------------------------------
  13424.   CASE 2                        ! Bits
  13425.     GOSUB dialog("CONVERT BUFFER","DO YOU REALLY WANT|TO CONVERT BUFFER|TO "+STR$(SHL(SUB(3,win_bits%),3))+" BITS ?","OK|CANCEL",MOUSEX,MOUSEY)
  13426.     IF bouton%=0
  13427.       GOSUB bee(TRUE)
  13428.       a%=FN adr_buffer
  13429.       IF win_bits%=1                      ! De 8 a 16
  13430.         MUL mark_1%,2
  13431.         MUL mark_len%,2
  13432.         MUL mark_2%,2
  13433.         MUL mark_rep%,2
  13434.         MUL win_pos%,2
  13435.         MUL win_lon%,2
  13436.         win_bits%=2
  13437.         GOSUB mise_a_jour_sample_buffer(TRUE)
  13438.         b%=SHR(FN lon_buffer,1)
  13439.         ~C:g_copy_sample_8_2_16%(L:a%,L:a%,L:b%)
  13440.       ELSE                                ! de 16 a 8
  13441.         mark_1%=SHR(mark_1%,1) AND -2
  13442.         mark_len%=SHR(mark_len%,1) AND -2
  13443.         mark_2%=SHR(mark_2%,1) AND -2
  13444.         mark_rep%=SHR(mark_rep%,1) AND -2
  13445.         win_pos%=SHR(win_pos%,1) AND -2
  13446.         win_lon%=SHR(win_lon%,1) AND -2
  13447.         win_bits%=1
  13448.         GOSUB mise_a_jour_sample_buffer(TRUE)
  13449.         b%=FN lon_buffer
  13450.         ~C:g_copy_sample_16_2_8%(L:a%,L:a%,L:b%)
  13451.         b%=SHR(b%,1)
  13452.         GOSUB clear_mem(ADD(a%,b%),b%)
  13453.       ENDIF
  13454.     ENDIF
  13455.     GOSUB affiche_sample
  13456.     ' ------------------------------------------------------------------------
  13457.   CASE 3                        ! Block length
  13458.     GOSUB edite_chaine(HEX$(mark_len%,6),ADD(orc%,divbi&(0,3,3)),ADD(ory%,ADD(divbi&(1,3,3),2)),6,1)
  13459.     a%=VAL("$"+bbbb$) AND -2
  13460.     IF a%>0 AND ADD(mark_1%,a%)<=FN lon_buffer
  13461.       mark_len%=a%
  13462.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13463.     ENDIF
  13464.     ' ------------------------------------------------------------------------
  13465.   CASE 5                        ! Repeat pos
  13466.     GOSUB edite_chaine(HEX$(mark_rep%,6),ADD(orc%,divbi&(0,5,3)),ADD(ory%,ADD(divbi&(1,5,3),2)),6,1)
  13467.     a%=VAL("$"+bbbb$) AND -2
  13468.     IF a%>=0 AND a%<FN lon_buffer
  13469.       mark_rep%=a%
  13470.     ENDIF
  13471.     ' ------------------------------------------------------------------------
  13472.   CASE 6                        ! Buffer frequency
  13473.     GOSUB edite_chaine(STR$(freq_buffer%,5),ADD(orc%,divbi&(0,6,3)),ADD(ory%,ADD(divbi&(1,6,3),2)),5,2)
  13474.     GOSUB se.change_buffer_frequency(VAL(bbbb$),TRUE)
  13475.     ' ------------------------------------------------------------------------
  13476.   CASE 7                        ! Sample number
  13477.     IF km%=1                            ! Bouton gauche : edite le numero
  13478.       GOSUB edite_chaine(HEX$(sample%,2),ADD(orc%,divbi&(0,7,3)),ADD(ory%,ADD(divbi&(1,7,3),2)),2,1)
  13479.       a%=VAL("$"+bbbb$)
  13480.       IF a%>0
  13481.         sample%=a%
  13482.       ENDIF
  13483.     ELSE                                ! Bouton droit : menu 'Samples' du panneau principal
  13484.       GOSUB wait_mouse(TRUE)
  13485.       GOSUB affiche_icones_sample
  13486.       GOSUB bee(FALSE)
  13487.       ss_menu%=4
  13488.       REPEAT
  13489.         SHOWM
  13490.         MOUSE xm%,ym%,km%
  13491.         IF km%<>0 AND ym%>34 AND ym%<105 AND xm%>159 AND xm%<640
  13492.           GOSUB gere_icones_sample
  13493.         ELSE IF km%<>0
  13494.           a%=1
  13495.         ELSE
  13496.           a%=0
  13497.         ENDIF
  13498.         IF GEMDOS(11)<>0
  13499.           a%=SHR(GEMDOS(7),16)
  13500.         ENDIF
  13501.       UNTIL (a% AND 255)=1              ! ESC pour sortir de la
  13502.       GOSUB affiche_panneau_sample
  13503.     ENDIF
  13504.     ' ------------------------------------------------------------------------
  13505.   CASE 8                        ! Right cursor
  13506.     GOSUB edite_chaine(HEX$(ADD(mark_1%,mark_len%),6),ADD(orc%,divbi&(0,8,3)),ADD(ory%,ADD(divbi&(1,8,3),2)),6,1)
  13507.     a%=VAL("$"+bbbb$) AND -2
  13508.     IF a%>mark_1% AND a%<=FN lon_buffer
  13509.       mark_len%=SUB(a%,mark_1%)
  13510.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13511.     ENDIF
  13512.     ' ------------------------------------------------------------------------
  13513.   CASE 9                        ! Right position
  13514.     GOSUB edite_chaine(HEX$(ADD(win_pos%,win_lon%),6),ADD(orc%,divbi&(0,9,3)),ADD(ory%,ADD(divbi&(1,9,3),2)),6,1)
  13515.     a%=VAL("$"+bbbb$) AND -2
  13516.     IF a%>ADD(mark_1%,mark_len%) AND a%<=FN lon_buffer
  13517.       win_lon%=SUB(a%,win_pos%)
  13518.     ENDIF
  13519.     ' ------------------------------------------------------------------------
  13520.   ENDSELECT
  13521.   GOSUB affiche_sample
  13522. RETURN
  13523. PROCEDURE sample_editor.touches
  13524.   IF GEMDOS(11)<>0            ! Une touche ?
  13525.     clavier%=GEMDOS(7)
  13526.     GOSUB vide_buffer_clavier
  13527.     touch_ascii%=clavier% AND 255
  13528.     clavier%=SHR(clavier%,16) AND 4095
  13529.     GOSUB vide_buffer_clavier
  13530.     SELECT clavier%
  13531.       ' ----------------------------------------------------------------------
  13532.     CASE 57                   ! Espace : Swap cursors
  13533.       GOSUB swap_block_cursors
  13534.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13535.       GOSUB affiche_sample
  13536.       ' ----------------------------------------------------------------------
  13537.     CASE 71                   ! Clr Home : sample + 1
  13538.       sample%=MIN(SUCC(sample%),255)
  13539.       GOSUB affiche_sample
  13540.       ' ----------------------------------------------------------------------
  13541.     CASE 82                   ! Insert : sample - 1
  13542.       sample%=MAX(PRED(sample%),1)
  13543.       GOSUB affiche_sample
  13544.       ' ----------------------------------------------------------------------
  13545.     CASE 3097                 ! Ctrl + Alt + P : SnapShot
  13546.       GOSUB snapshot
  13547.       ' ----------------------------------------------------------------------
  13548.     ENDSELECT
  13549.   ENDIF
  13550. RETURN
  13551. PROCEDURE sample_editor.affiche_sm
  13552.   LOCAL iii%
  13553.   FOR iii%=0 TO 10
  13554.     IF iii%=PRED(ss_menu2%)
  13555.       GOSUB cadre_texte2_b(divbn$(iii%,4),ADD(orc%,divbi&(0,iii%,4)),ADD(ory%,divbi&(1,iii%,4)),divbi&(2,iii%,4),-1)
  13556.     ELSE
  13557.       GOSUB cadre_texte2(divbn$(iii%,4),ADD(orc%,divbi&(0,iii%,4)),ADD(ory%,divbi&(1,iii%,4)),divbi&(2,iii%,4),0)
  13558.     ENDIF
  13559.   NEXT iii%
  13560.   GOSUB cadre_int(orc%,ADD(ory%,80),79,59,13,13,14,12)
  13561.   GOSUB wait_mouse(TRUE)
  13562.   SELECT ss_menu2%
  13563.   CASE 1 TO 4
  13564.     ON ss_menu2% GOSUB se.sm_affsm_volume,se.sm_affsm_mix,se.sm_affsm_record,se.sm_affsm_marks
  13565.   CASE 5 TO 8
  13566.     ON SUB(ss_menu2%,4) GOSUB se.sm_affsm_freq,se.sm_affsm_delay,se.sm_affsm_flanger,se.sm_affsm_reverb
  13567.   CASE 9 TO 12
  13568.     ON SUB(ss_menu2%,8) GOSUB se.sm_affsm_song2disk,se.sm_affsm_compression,se.sm_affsm_distortion
  13569.   ENDSELECT
  13570. RETURN
  13571. FUNCTION sample_editor.set_fine_position(curs%)
  13572.   LOCAL a%,b%,oldcurs%
  13573.   LOCAL clavier%,ascii_code%,scan_code%
  13574.   LOCAL exit_flag!
  13575.   ' Detourne les variables suivantes:
  13576.   LOCAL hwin%,lwin%,win_pos%,win_lon%
  13577.   LOCAL xm%,ym%,km%
  13578.   '
  13579.   ' Affichage de la fenetre Sample plein ecran
  13580.   '
  13581.   CLS
  13582.   hwin%=SUB(scr_haut%,8) AND -8
  13583.   lwin%=SUB(scr_larg%,32)
  13584.   GOSUB cadre_int(0,0,PRED(scr_ncol%),ADD(hwin%,7),9,9,10,8)
  13585.   GOSUB cadre_ext(2,4,PRED(SHR(lwin%,3)),PRED(hwin%),0,9,8,10)   ! Fenetre du sample
  13586.   win_lon%=SHL(SUB(scr_ncol%,4),3)
  13587.   GOSUB sample_editor.set_fine_position.redraw
  13588.   '
  13589.   ' Gestion du curseur
  13590.   '
  13591.   exit_flag!=FALSE
  13592.   REPEAT
  13593.     oldcurs%=curs%
  13594.     IF GEMDOS(11)<>0
  13595.       KEYGET clavier%
  13596.       GOSUB vide_buffer_clavier
  13597.       clavier%=clavier% AND &H1FFF00FF
  13598.       a%=FN key_trafique_code_clavier(clavier%)
  13599.       clavier%=LONG{a%}
  13600.       scan_code%=SHR(clavier%,16) AND 255
  13601.       ascii_code%=clavier% AND 255
  13602.       SELECT scan_code%
  13603.       CASE 1,57       ! Esc, Space bar
  13604.         exit_flag!=TRUE
  13605.       CASE 75         ! Left
  13606.         GOSUB sample_editor.set_fine_position.to_left
  13607.       CASE 77         ! Right
  13608.         GOSUB sample_editor.set_fine_position.to_right
  13609.       DEFAULT
  13610.         SELECT ascii_code%
  13611.         CASE 13       ! Return/Enter
  13612.           exit_flag!=TRUE
  13613.         ENDSELECT
  13614.       ENDSELECT
  13615.     ENDIF
  13616.     MOUSE xm%,ym%,km%
  13617.     IF km%=1
  13618.       IF xm%>=16 AND xm%<ADD(lwin%,16)
  13619.         curs%=ADD(win_pos%,SUB(xm%,16))
  13620.       ELSE
  13621.         IF xm%<16
  13622.           GOSUB sample_editor.set_fine_position.to_left
  13623.         ELSE
  13624.           GOSUB sample_editor.set_fine_position.to_right
  13625.         ENDIF
  13626.       ENDIF
  13627.     ELSE IF km%=2
  13628.       exit_flag!=TRUE
  13629.     ENDIF
  13630.     IF curs%<>oldcurs%
  13631.       HIDEM
  13632.       GOSUB efface_curseur(SUB(oldcurs%,win_pos%),1)
  13633.       GOSUB affiche_curseur(SUB(curs%,win_pos%),1)
  13634.       SHOWM
  13635.     ENDIF
  13636.   UNTIL exit_flag!
  13637.   RETURN curs%
  13638. ENDFUNC
  13639. PROCEDURE sample_editor.set_fine_position.to_left
  13640.   curs%=MIN(win_pos%,ADD(win_pos%,SUB(SHR(win_lon%,1),128)))
  13641.   oldcurs%=curs%
  13642.   GOSUB sample_editor.set_fine_position.redraw
  13643. RETURN
  13644. PROCEDURE sample_editor.set_fine_position.to_right
  13645.   curs%=MIN(MAX(ADD(win_pos%,win_lon%),ADD(win_pos%,ADD(SHR(win_lon%,1),128))),FN lon_buffer) AND -2
  13646.   oldcurs%=curs%
  13647.   GOSUB sample_editor.set_fine_position.redraw
  13648. RETURN
  13649. PROCEDURE sample_editor.set_fine_position.redraw
  13650.   win_pos%=MIN(MAX(SUB(curs%,SHR(win_lon%,1)),0),SUB(FN lon_buffer,win_lon%)) AND -2
  13651.   a%=ADD(FN adr_buffer,win_pos%)
  13652.   b%=SHR(SUB(scr_ncol%,4),1)
  13653.   HIDEM
  13654.   ~C:g_affiche_sample%(L:a%,L:win_lon%,W:win_bits%,W:4,W:b%,W:hwin%)
  13655.   GOSUB affiche_curseur(SUB(curs%,win_pos%),1)
  13656.   SHOWM
  13657. RETURN
  13658. ' Affichage
  13659. PROCEDURE affiche_sample                !!!
  13660.   ' Point de repetition a afficher
  13661.   LOCAL a%,b%,c%,d%,e%,i%,k#,l#
  13662.   GOSUB mise_a_jour_sample_buffer(FALSE)
  13663.   GOSUB bee(FALSE)
  13664.   ~FRE(0)
  13665.   IF win_lon%>0
  13666.     a%=ADD(FN adr_buffer,win_pos%)
  13667.     b%=SHR(lwin%,4)
  13668.     HIDEM
  13669.     ~C:g_affiche_sample%(L:a%,L:win_lon%,W:win_bits%,W:4,W:b%,W:hwin%)
  13670.   ENDIF
  13671.   GOSUB affchaine_notrans(HEX$(win_pos%,6),ADD(orc%,divbi&(0,0,3)),ADD(ory%,2),1)
  13672.   GOSUB affchaine_notrans(HEX$(mark_1%,6),ADD(orc%,divbi&(0,1,3)),ADD(ory%,2),1)
  13673.   GOSUB affchaine_notrans(STR$(SHL(win_bits%,3),2),ADD(orc%,divbi&(0,2,3)),ADD(ory%,2),1)
  13674.   GOSUB affchaine_notrans(HEX$(mark_len%,6),ADD(orc%,divbi&(0,3,3)),ADD(ory%,2),1)
  13675.   GOSUB affchaine_notrans(HEX$(FN lon_buffer,6),ADD(orc%,divbi&(0,4,3)),ADD(ory%,2),1)
  13676.   GOSUB affchaine_notrans(HEX$(mark_rep%,6),ADD(orc%,divbi&(0,5,3)),ADD(ory%,2),1)
  13677.   GOSUB affchaine_notrans(STR$(freq_buffer%,5),ADD(orc%,divbi&(0,6,3)),ADD(ory%,2),1)
  13678.   GOSUB affchaine_notrans(HEX$(sample%,2),ADD(orc%,divbi&(0,7,3)),ADD(ory%,2),1)
  13679.   GOSUB affchaine_notrans(HEX$(ADD(mark_1%,mark_len%),6),ADD(orc%,divbi&(0,8,3)),ADD(ory%,2),1)
  13680.   GOSUB affchaine_notrans(HEX$(ADD(win_pos%,win_lon%),6),ADD(orc%,divbi&(0,9,3)),ADD(ory%,2),1)
  13681.   GOSUB affiche_2_curs
  13682.   SHOWM
  13683. RETURN
  13684. PROCEDURE affiche_fft
  13685.   ' Affichage de la FFT
  13686.   LOCAL a%,b%,c%,d%,e%,i%,k#,l#
  13687.   IF scr_haut%>=220
  13688.     GOSUB bee(FALSE)
  13689.     e%=SUB(scr_larg%,32)
  13690.     GOSUB cadre_ext(2,ADD(ory%,144),PRED(SHR(e%,3)),SUB(scr_haut%,ADD(ory%,149)),0,9,8,10)
  13691.     IF se.freq_fftdisp%=1
  13692.       k#=SUB(scr_haut%,ADD(ory%,148))/LOG(&H7FFF)
  13693.     ELSE
  13694.       a%=1
  13695.       FOR i%=0 TO PRED(se.freq_fftlon%)
  13696.         a%=MAX(a%,fft&(i%))
  13697.       NEXT i%
  13698.       k#=SUB(scr_haut%,ADD(ory%,148))/a%
  13699.     ENDIF
  13700.     l#=se.freq_fftlon%/e%
  13701.     HIDEM
  13702.     FOR i%=0 TO PRED(e%)
  13703.       IF se.freq_fftdisp%=1
  13704.         b%=LOG(MAX(fft&(INT(i%*l#)),1))*k#
  13705.       ELSE
  13706.         b%=fft&(INT(i%*l#))*k#
  13707.       ENDIF
  13708.       IF b%>=1
  13709.         a%=SUB(scr_haut%,ADD(b%,4))
  13710.         c%=i%
  13711.         ~C:g_affiche_marqueur_sample%(L:e%,W:1,W:a%,W:e%,W:b%,L:c%,W:0)
  13712.       ENDIF
  13713.     NEXT i%
  13714.     IF se.freq_fftnoteon!
  13715.       c%=MUL(SUB(se.freq_ofn%,se.freq_fftmin%),e%)/SUB(se.freq_fftmax%,se.freq_fftmin%)
  13716.       IF c%>=0 AND c%<e%                            ! La note proposee pour le sample
  13717.         a%=ADD(ory%,144)
  13718.         b%=SUB(scr_haut%,ADD(ory%,148))
  13719.         ~C:g_affiche_marqueur_sample%(L:e%,W:1,W:a%,W:e%,W:b%,L:c%,W:1)
  13720.       ENDIF
  13721.     ENDIF
  13722.   ENDIF
  13723.   SHOWM
  13724. RETURN
  13725. PROCEDURE affiche_panneau_sample
  13726.   ' En entree : orc%, ory%, hwin%, scr_ncol% et parametres de fenetre
  13727.   LOCAL i%
  13728.   CLS
  13729.   GOSUB bee(FALSE)
  13730.   GOSUB cadre_int(0,0,PRED(scr_ncol%),ADD(hwin%,7),9,9,10,8)
  13731.   GOSUB cadre_ext(2,4,PRED(SHR(lwin%,3)),PRED(hwin%),0,9,8,10)  ! Fenetre du sample
  13732.   GOSUB cadre_ext(ADD(SHR(lwin%,3),4),4,1,PRED(hwin%),0,9,8,10) ! Vu-metre G
  13733.   GOSUB cadre_ext(ADD(SHR(lwin%,3),8),4,1,PRED(hwin%),0,9,8,10) ! Vu-metre D
  13734.   GOSUB cadre_int(orc%,ory%,79,19,13,13,14,12)                  ! Infos buffer
  13735.   GOSUB cadre_int(orc%,ADD(ory%,20),79,59,9,9,10,8)             ! Menu general
  13736.   FOR i%=0 TO 9
  13737.     GOSUB affchaine_trans(divbn$(i%,3),SUB(SHL(ADD(orc%,divbi&(0,i%,3)),1),SUB(LEN(divbn$(i%,3)),SUCC(divbi&(2,i%,3)))),ADD(ory%,ADD(divbi&(1,i%,3),12)),14)
  13738.     GOSUB cadre_ext(ADD(orc%,divbi&(0,i%,3)),ADD(ory%,ADD(divbi&(1,i%,3),2)),divbi&(2,i%,3),5,0,13,12,14)
  13739.   NEXT i%
  13740.   GOSUB affiche_bloc_icones(0,18,2,orc%,ory%)
  13741.   GOSUB grise_icone(5,2,orc%,ory%)              ! Swap Sample and Block
  13742.   GOSUB sample_editor.affiche_sm
  13743.   GOSUB affiche_sample
  13744. RETURN
  13745. PROCEDURE affiche_curseur(pos%,plan%)
  13746.   ' Affiche un curseur de sample
  13747.   ~C:g_affiche_marqueur_sample%(L:win_lon%,W:win_bits%,W:4,W:lwin%,W:hwin%,L:pos%,W:plan%)
  13748. RETURN
  13749. PROCEDURE efface_curseur(pos%,plan%)
  13750.   ' Efface un curseur de sample
  13751.   ~C:g_efface_marqueur_sample%(L:win_lon%,W:win_bits%,W:4,W:lwin%,W:hwin%,L:pos%,W:plan%)
  13752. RETURN
  13753. PROCEDURE affiche_2_curs
  13754.   HIDEM
  13755.   GOSUB affiche_curseur(SUB(mark_1%,win_pos%),1)
  13756.   GOSUB affiche_curseur(SUB(ADD(mark_1%,mark_len%),win_pos%),1)
  13757.   IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13758.     GOSUB affiche_curseur(SUB(mark_2%,win_pos%),2)
  13759.   ENDIF
  13760.   SHOWM
  13761. RETURN
  13762. PROCEDURE efface_2_curs
  13763.   HIDEM
  13764.   IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13765.     GOSUB efface_curseur(SUB(mark_2%,win_pos%),2)
  13766.   ENDIF
  13767.   GOSUB efface_curseur(SUB(ADD(mark_1%,mark_len%),win_pos%),1)
  13768.   GOSUB efface_curseur(SUB(mark_1%,win_pos%),1)
  13769.   SHOWM
  13770. RETURN
  13771. ' Divers
  13772. PROCEDURE se.change_buffer_frequency(freq%,disp!)
  13773.   ' Change proprement la frequence du buffer
  13774.   ' Pas de changement si la valeur est trop petite/trop grande
  13775.   ' Reinitialise les parametres FFT
  13776.   IF freq%>=2000 AND freq%<65536
  13777.     freq_buffer%=freq%
  13778.   ENDIF
  13779.   se.freq_fft_pend%=SHR(freq_buffer%,1)
  13780.   se.freq_fft_pstart%=0
  13781.   IF disp!
  13782.     GOSUB affiche_sample
  13783.     IF ss_menu2%=5
  13784.       GOSUB se.sm_actsm_freq
  13785.     ENDIF
  13786.   ENDIF
  13787. RETURN
  13788. PROCEDURE mise_a_jour_sample_buffer(flag!)
  13789.   ' Mise a jour de la fenetre
  13790.   mark_1%=MAX(MIN(SUB(FN lon_buffer,2),mark_1%),0) AND -2               ! Marqueur de debut de bloc dans le sample
  13791.   mark_len%=MAX(MIN(mark_len%,SUB(FN lon_buffer,mark_1%)),2) AND -2     ! Marqueur de fin de bloc
  13792.   mark_2%=MAX(MIN(mark_2%,FN lon_buffer),0) AND -2                      ! Ancien marqueur de fin (pointilles)
  13793.   mark_rep%=MIN(MAX(mark_1%,mark_rep%),ADD(mark_1%,SUB(mark_len%,2)))   ! Marqueur de repetition
  13794.   win_pos%=MAX(MIN(win_pos%,mark_1%),0) AND -2                          ! Debut de la fenetre de sample
  13795.   win_lon%=MIN(MAX(win_lon%,SUB(ADD(mark_1%,mark_len%),win_pos%)),SUB(FN lon_buffer,win_pos%)) AND -2   ! Longueur de la fenetre
  13796.   IF flag!
  13797.     se.volume_ok!=FALSE                                           ! Le bloc a pu etre modifie
  13798.   ENDIF
  13799.   noact_delay%=5
  13800. RETURN
  13801. PROCEDURE play_one_sample(note%)
  13802.   ' Joue le buffer a la note note%
  13803.   ' Sans repetition pour l'instant
  13804.   LOCAL a%,b%,adr_arret%,old_note%,old_mark_2%
  13805.   LOCAL flag_a!
  13806.   LOCAL repeatbuffer$
  13807.   repeatbuffer$=STRING$(1024,0)
  13808.   old_note%=note%                               ! Memorise la note d'entree
  13809.   old_mark_2%=mark_2%
  13810.   HIDEM
  13811.   REPEAT
  13812.     IF MOUSEK=1                                 ! Bouton gauche de la souris : rejoue la note
  13813.       note%=old_note%
  13814.     ENDIF
  13815.     IF note%<>0
  13816.       CARD{ADD(V:info_tr$,2)}=win_bits%
  13817.       CARD{ADD(V:info_tr$,4)}=freq_buffer%
  13818.       CARD{ADD(V:info_tr$,6)}=&H800
  13819.       CARD{ADD(V:info_tr$,10)}=note%
  13820.       LONG{ADD(V:info_tr$,12)}=ADD(FN adr_buffer,mark_1%)
  13821.       LONG{ADD(V:info_tr$,22)}=MAX(SUB(mark_len%,2),0)
  13822.       LONG{ADD(V:info_tr$,26)}=2
  13823.       LONG{ADD(V:info_tr$,30)}=V:repeatbuffer$
  13824.       a%=V:info_tr$
  13825.       b%=preset&(curs_col%,n_preset%)
  13826.       adr_arret%=C:rr_play_one_sample%(L:a%,W:b%)
  13827.       note%=0
  13828.       flag_a!=FALSE
  13829.       GOSUB wait_mouse(TRUE)
  13830.     ENDIF
  13831.     IF GEMDOS(11)<>0
  13832.       ~GEMDOS(7)
  13833.       flag_a!=TRUE
  13834.     ELSE IF MOUSEK=2
  13835.       flag_a!=TRUE
  13836.     ENDIF
  13837.     VSYNC
  13838.     IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13839.       GOSUB efface_curseur(SUB(mark_2%,win_pos%),2)
  13840.     ENDIF
  13841.     mark_2%=ADD(mark_1%,LONG{ADD(adr_arret%,16)}) AND -2        ! Memorise la position du sample
  13842.     IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13843.       GOSUB affiche_curseur(SUB(mark_2%,win_pos%),2)
  13844.     ENDIF
  13845.   UNTIL LONG{ADD(adr_arret%,22)}=0 OR flag_a!   ! Attend la fin naturelle du sample ou stop utilisateur
  13846.   IF NOT flag_a!                                ! Pas de stop utilisateur: ne memorise pas la nouvelle position
  13847.     mark_2%=old_mark_2%
  13848.   ENDIF
  13849.   CARD{ADD(V:info_tr$,2)}=win_bits%             ! Stop
  13850.   CARD{ADD(V:info_tr$,4)}=freq_buffer%
  13851.   CARD{ADD(V:info_tr$,6)}=0
  13852.   CARD{ADD(V:info_tr$,10)}=48
  13853.   LONG{ADD(V:info_tr$,12)}=FN adr_buffer
  13854.   LONG{ADD(V:info_tr$,22)}=0
  13855.   LONG{ADD(V:info_tr$,26)}=2
  13856.   LONG{ADD(V:info_tr$,30)}=FN adr_buffer
  13857.   a%=V:info_tr$
  13858.   b%=preset&(curs_col%,n_preset%)
  13859.   ~C:rr_play_one_sample%(L:a%,W:b%)
  13860.   GOSUB wait_mouse(TRUE)
  13861. RETURN
  13862. PROCEDURE copy_sample_to_block
  13863.   LOCAL a%,b%,c%,d%
  13864.   a%=MUL(DIV(FN length(sample%),FN resol(sample%)),win_bits%) AND -2    ! Place prise dans le buffer apres conversion
  13865.   b%=FN adresse(sample%)                ! Adresse du sample
  13866.   c%=ADD(FN adr_buffer,mark_1%)         ! Adresse destination
  13867.   IF win_bits%<>FN resol(sample%)       ! On doit faire une conversion de resolution ?
  13868.     GOSUB dialog("COPY TO BLOCK","Convert "+STR$(SHL(FN resol(sample%),3))+" bits sample|to "+STR$(SHL(win_bits%,3))+" bits buffer ?","Ok|Cancel",MOUSEX,MOUSEY)
  13869.     IF bouton%=0        ! Conversion ok
  13870.       IF a%>mark_len%
  13871.         GOSUB dialog("COPY TO BLOCK","Copy sample #"+HEX$(sample%,2)+" to block.|Sample is too large :","Clip|Overflow|Cancel",xm%,ym%)
  13872.         IF bouton%=0            ! Clip
  13873.           GOSUB bee(TRUE)
  13874.           IF win_bits%=2
  13875.             d%=SHR(mark_len%,1)
  13876.             ~C:g_copy_sample_8_2_16%(L:b%,L:c%,L:d%)
  13877.           ELSE
  13878.             d%=SHL(mark_len%,1)
  13879.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  13880.           ENDIF
  13881.           mark_2%=MIN(ADD(mark_1%,a%),FN lon_buffer)    ! Pointe sur la fin virtuelle du sample
  13882.         ELSE IF bouton%=1       ! Overflow
  13883.           mark_2%=ADD(mark_1%,mark_len%)        ! Sauve l'ancienne position
  13884.           mark_len%=MIN(a%,SUB(FN lon_buffer,mark_1%))
  13885.           GOSUB bee(TRUE)
  13886.           IF win_bits%=2
  13887.             d%=SHR(mark_len%,1)
  13888.             ~C:g_copy_sample_8_2_16%(L:b%,L:c%,L:d%)
  13889.           ELSE
  13890.             d%=SHL(mark_len%,1)
  13891.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  13892.           ENDIF
  13893.         ENDIF
  13894.       ELSE                      ! Ca tient
  13895.         GOSUB bee(TRUE)
  13896.         IF win_bits%=2
  13897.           d%=SHR(a%,1)
  13898.           ~C:g_copy_sample_8_2_16%(L:b%,L:c%,L:d%)
  13899.         ELSE
  13900.           d%=SHL(a%,1)
  13901.           ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  13902.         ENDIF
  13903.         mark_2%=ADD(mark_1%,a%)         ! Pointe sur la fin du sample
  13904.       ENDIF
  13905.       freq_buffer%=FN freqech(sample%)
  13906.     ENDIF
  13907.   ELSE                  ! C'est le meme nombre de bits pour le buffer et le sample
  13908.     IF a%>mark_len%
  13909.       GOSUB dialog("COPY TO BLOCK","Copy sample #"+HEX$(sample%,2)+" to block.|Sample is too large :","Clip|Overflow|Cancel",xm%,ym%)
  13910.       IF bouton%=0      ! Clip
  13911.         GOSUB bee(TRUE)
  13912.         BMOVE b%,c%,mark_len%
  13913.         mark_2%=MIN(ADD(mark_1%,a%),FN lon_buffer)      ! Pointe sur la fin virtuelle du sample
  13914.         freq_buffer%=FN freqech(sample%)
  13915.       ELSE IF bouton%=1 ! Overflow
  13916.         GOSUB bee(TRUE)
  13917.         mark_2%=ADD(mark_1%,mark_len%)  ! Sauve l'ancienne position
  13918.         mark_len%=MIN(a%,SUB(FN lon_buffer,mark_1%))
  13919.         BMOVE b%,c%,mark_len%
  13920.         freq_buffer%=FN freqech(sample%)
  13921.       ENDIF
  13922.     ELSE                ! Ca tient
  13923.       GOSUB bee(TRUE)
  13924.       BMOVE b%,c%,a%
  13925.       mark_2%=ADD(mark_1%,a%)   ! Pointe sur la fin du sample
  13926.       freq_buffer%=FN freqech(sample%)
  13927.     ENDIF
  13928.   ENDIF
  13929.   GOSUB mise_a_jour_sample_buffer(TRUE)
  13930.   GOSUB bee(FALSE)
  13931.   GOSUB affiche_sample
  13932. RETURN
  13933. PROCEDURE copy_block_to_sample
  13934.   LOCAL a%,b%
  13935.   GOSUB dialog("COPY TO SAMPLE","Copy block to|sample #"+HEX$(sample%,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  13936.   a%=SUB(mark_len%,FN length(sample%))  ! Difference de taille entre le nouveau et l'ancien sample
  13937.   IF bouton%=0
  13938.     GOSUB bee(TRUE)
  13939.     IF a%>0             ! On manque de place
  13940.       IF SUB(FN lon_buffer,ADD(mark_1%,mark_len%))<a%
  13941.         ' S'il n'y a pas assez de place a droite du block pour creer un nouveau sample, rotation
  13942.         b%=FN length(sample%)
  13943.         GOSUB chg_taille_sample(sample%,0)      ! Vide d'abord le sample
  13944.         GOSUB chg_sam_length(sample%,0)
  13945.         GOSUB chg_sam_repeat(sample%,0)
  13946.         GOSUB chg_sam_replen(sample%,2)
  13947.         mark_len%=MIN(mark_len%,SUB(FN lon_buffer,256))   ! Si jamais on essaie de remplacer tt le buffer (->len=0)
  13948.         BMOVE ADD(FN adr_buffer,b%),FN adr_buffer,SUB(FN lon_buffer,b%) ! Puis deplace le buffer (les FN... sont pour le nouveau buffer)
  13949.         GOSUB mem_rotation(FN adresse(sample%),SUB(ADD(FN adr_buffer,ADD(mark_1%,mark_len%)),FN adresse(sample%)),mark_len%)
  13950.         GOSUB chg_sam_length(sample%,mark_len%)
  13951.         IF sample%<255                          ! Reactualise les adresses des samples deplaces
  13952.           FOR i%=SUCC(sample%) TO 255
  13953.             LONG{ADD(r_adr_sample%,SHL(i%,2))}=ADD(LONG{ADD(r_adr_sample%,SHL(i%,2))},mark_len%)
  13954.           NEXT i%
  13955.         ENDIF
  13956.         GOSUB mise_a_jour_sample_buffer(TRUE)
  13957.       ELSE              ! Sinon on elimine la fin du buffer pour faire de la place dans les samples
  13958.         BMOVE FN adr_buffer,ADD(FN adr_buffer,a%),SUB(FN lon_buffer,a%)
  13959.         GOSUB chg_taille_sample(sample%,mark_len%)
  13960.         GOSUB chg_sam_length(sample%,mark_len%)
  13961.         GOSUB mise_a_jour_sample_buffer(FALSE)
  13962.         BMOVE ADD(FN adr_buffer,mark_1%),FN adresse(sample%),mark_len%
  13963.       ENDIF
  13964.     ELSE IF a%<0        ! On va creer de la place
  13965.       GOSUB chg_taille_sample(sample%,mark_len%)        ! Deplace d'abord les samples
  13966.       GOSUB chg_sam_length(sample%,mark_len%)
  13967.       GOSUB mise_a_jour_sample_buffer(FALSE)
  13968.       BMOVE SUB(FN adr_buffer,a%),FN adr_buffer,ADD(FN lon_buffer,a%)   ! Puis le buffer (les FN... sont pour le nouveau buffer)
  13969.       GOSUB clear_mem(ADD(FN adr_buffer,ADD(FN lon_buffer,a%)),-a%)
  13970.       BMOVE ADD(FN adr_buffer,mark_1%),FN adresse(sample%),mark_len%
  13971.     ELSE
  13972.       BMOVE ADD(FN adr_buffer,mark_1%),FN adresse(sample%),mark_len%
  13973.     ENDIF
  13974.     GOSUB chg_sam_freq(sample%,freq_buffer%)
  13975.     GOSUB chg_sam_nbits(sample%,win_bits%)
  13976.     GOSUB chg_sam_repeat(sample%,0)
  13977.     GOSUB chg_sam_replen(sample%,2)
  13978.     GOSUB chg_sam_volume(sample%,&H100)
  13979.     ~C:rr_boucle_sample%(W:sample%)
  13980.   ENDIF
  13981.   GOSUB bee(FALSE)
  13982.   GOSUB affiche_sample
  13983. RETURN
  13984. PROCEDURE swap_sample_and_block         !!!
  13985. RETURN
  13986. PROCEDURE swap_block_cursors
  13987.   LOCAL a%
  13988.   IF mark_2%>mark_1%
  13989.     a%=mark_2%
  13990.     mark_2%=ADD(mark_1%,mark_len%)
  13991.     mark_len%=SUB(a%,mark_1%)
  13992.   ENDIF
  13993. RETURN
  13994. '
  13995. ' Sous-menus du Sample Editor
  13996. ' ---------------------------
  13997. ' Volume
  13998. PROCEDURE se.sm_affsm_volume
  13999.   GOSUB cadre_int(orc%,ADD(ory%,80),29,29,13,13,14,12)          ! Cadre volume
  14000.   GOSUB cadre_int(orc%,ADD(ory%,110),29,29,13,13,14,12)         ! Cadre volume sur effets
  14001.   GOSUB cadre_int(ADD(orc%,30),ADD(ory%,80),17,59,13,13,14,12)  ! Cadre gain
  14002.   GOSUB cadre_int(ADD(orc%,48),ADD(ory%,80),31,59,13,13,14,12)  ! Cadre fade
  14003.   GOSUB affchaine_trans("GAIN",ADD(SHL(orc%,1),62),ADD(ory%,82),14)
  14004.   GOSUB affchaine_trans("FADE",ADD(SHL(orc%,1),98),ADD(ory%,82),14)
  14005.   GOSUB affchaine_trans("FADE PARAMETERS",ADD(SHL(orc%,1),98),ADD(ory%,107),14)
  14006.   GOSUB affchaine_trans("PRESETS",ADD(SHL(orc%,1),144),ADD(ory%,107),14)
  14007.   GOSUB affchaine_trans("VOLUME ON EFFECTS",ADD(SHL(orc%,1),2),ADD(ory%,117),14)
  14008.   GOSUB affiche_bloc_icones_b(0,15,5,orc%,ory%)
  14009.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),4,5,0,13,12,14)     ! Volume
  14010.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,11,5),11)),ADD(ory%,ADD(divbi&(1,11,5),2)),4,5,0,13,12,14)  ! Fade start
  14011.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,12,5),11)),ADD(ory%,ADD(divbi&(1,12,5),2)),4,5,0,13,12,14)  ! Fade end
  14012.   GOSUB se.sm_actsm_volume
  14013. RETURN
  14014. PROCEDURE se.sm_actsm_volume
  14015.   ' Var locales de Sample_Editor :
  14016.   ' Utilise aaaa$
  14017.   GOSUB affiche_icone_b(15,5,orc%,ory%,NOT se.flag_best_volume!)
  14018.   GOSUB affiche_icone_b(16,5,orc%,ory%,se.flag_best_volume!)
  14019.   IF se.volume_ok!
  14020.     aaaa$=FN pourcent$(se.volume_spl%,32768)
  14021.   ELSE
  14022.     aaaa$="     "
  14023.   ENDIF
  14024.   GOSUB affchaine_notrans(aaaa$,ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),1)
  14025.   GOSUB affchaine_notrans(FN pourcent$(se.volume_fade_start%,32768),ADD(orc%,ADD(divbi&(0,11,5),11)),ADD(ory%,ADD(divbi&(1,11,5),2)),1)
  14026.   GOSUB affchaine_notrans(FN pourcent$(se.volume_fade_end%,32768),ADD(orc%,ADD(divbi&(0,12,5),11)),ADD(ory%,ADD(divbi&(1,12,5),2)),1)
  14027.   GOSUB grise_icone(16,5,orc%,ory%)
  14028.   SHOWM
  14029. RETURN
  14030. PROCEDURE se.sm_gere_volume
  14031.   ' Var locales de Sample_Editor :
  14032.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14033.   ' Utilise srt%, a%, aaaa$
  14034.   ~FRE(0)
  14035.   IF km%>0
  14036.     a%=V:divbi&(0,0,0)
  14037.     srt%=C:g_teste_icones%(L:a%,W:5,W:xm2%,W:ym2%)
  14038.     IF srt%>=0
  14039.       SELECT srt%
  14040.         ' Radio-boutons, Flip-flops ou champs de texte
  14041.         ' --------------------------------------------------------------------
  14042.       CASE 0                    ! Set volume
  14043.         IF NOT se.volume_ok!            ! Calcule le volume actuel si ce n'est deja fait
  14044.           GOSUB bee(TRUE)
  14045.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  14046.         ENDIF
  14047.         aaaa$=FN pourcent$(se.volume_spl%,32768)
  14048.         GOSUB edite_chaine(aaaa$,ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),5,3)
  14049.         GOSUB bee(TRUE)
  14050.         a%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)                  ! Nouveau volume
  14051.         GOSUB spl_chg_volume(mark_1%,mark_len%,VAL(aaaa$)*327.68,a%,a%,win_bits%)
  14052.         se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  14053.         se.volume_ok!=TRUE
  14054.         GOSUB affiche_sample
  14055.         GOSUB se.sm_actsm_volume
  14056.         ' --------------------------------------------------------------------
  14057.       CASE 11                   ! Fade start
  14058.         GOSUB edite_chaine(FN pourcent$(se.volume_fade_start%,32768),ADD(orc%,ADD(divbi&(0,9,5),11)),ADD(ory%,ADD(divbi&(1,9,5),2)),5,3)
  14059.         se.volume_fade_start%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)       ! Nouveau volume de debut de fade
  14060.         GOSUB se.sm_actsm_volume
  14061.         ' --------------------------------------------------------------------
  14062.       CASE 12                   ! Fade end
  14063.         GOSUB edite_chaine(FN pourcent$(se.volume_fade_end%,32768),ADD(orc%,ADD(divbi&(0,10,5),11)),ADD(ory%,ADD(divbi&(1,10,5),2)),5,3)
  14064.         se.volume_fade_end%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100) ! Nouveau volume de fin de fade
  14065.         GOSUB se.sm_actsm_volume
  14066.         ' --------------------------------------------------------------------
  14067.       CASE 15                   ! Volume : No change
  14068.         se.flag_best_volume!=FALSE
  14069.         GOSUB se.sm_actsm_volume
  14070.         ' --------------------------------------------------------------------
  14071.       CASE 16                   ! Volume : Best *** Non selectionnable pour l'instant ***
  14072.         ' se.flag_best_volume!=TRUE
  14073.         ' GOSUB se.sm_actsm_volume
  14074.         ' --------------------------------------------------------------------
  14075.       DEFAULT
  14076.         ' Icones normales
  14077.         GOSUB affiche_icone_b(srt%,5,orc%,ory%,-1)
  14078.         GOSUB wait_mouse(TRUE)
  14079.         SELECT srt%
  14080.           ' ------------------------------------------------------------------
  14081.         CASE 1                  ! Volume ?
  14082.           GOSUB bee(TRUE)
  14083.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  14084.           se.volume_ok!=TRUE
  14085.           GOSUB bee(FALSE)
  14086.           GOSUB se.sm_actsm_volume
  14087.           ' ------------------------------------------------------------------
  14088.         CASE 2 TO 9             ! +1, +2, +3, +6, -1, -2, -3, -6 dB
  14089.           GOSUB bee(TRUE)
  14090.           a%=10000*(10^(VAL(MID$("+1+2+3+6-1-2-3-6",SUB(SHL(srt%,1),3),2))/10))
  14091.           GOSUB spl_chg_volume(mark_1%,mark_len%,10000,a%,a%,win_bits%)
  14092.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  14093.           se.volume_ok!=TRUE
  14094.           GOSUB affiche_sample
  14095.           GOSUB se.sm_actsm_volume
  14096.           ' ------------------------------------------------------------------
  14097.         CASE 10                 ! Fade !
  14098.           GOSUB bee(TRUE)
  14099.           GOSUB spl_chg_volume(mark_1%,mark_len%,32768,se.volume_fade_start%,se.volume_fade_end%,win_bits%)
  14100.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  14101.           se.volume_ok!=TRUE
  14102.           GOSUB affiche_sample
  14103.           GOSUB se.sm_actsm_volume
  14104.           ' ------------------------------------------------------------------
  14105.         CASE 13                 ! Fade in
  14106.           se.volume_fade_start%=0
  14107.           se.volume_fade_end%=32768
  14108.           GOSUB se.sm_actsm_volume
  14109.           ' ------------------------------------------------------------------
  14110.         CASE 14                 ! Fade out
  14111.           se.volume_fade_start%=32768
  14112.           se.volume_fade_end%=0
  14113.           GOSUB se.sm_actsm_volume
  14114.           ' ------------------------------------------------------------------
  14115.         ENDSELECT
  14116.         GOSUB affiche_icone_b(srt%,5,orc%,ory%,0)
  14117.       ENDSELECT
  14118.       GOSUB wait_mouse(TRUE)
  14119.       GOSUB vide_buffer_clavier
  14120.     ENDIF
  14121.   ENDIF
  14122.   IF noact_delay%=1 AND (NOT se.volume_ok!)     ! Si le volume n'est plus valable suite a une manip
  14123.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),1)
  14124.   ENDIF
  14125. RETURN
  14126. PROCEDURE spl_chg_volume(dddd%,llll%,vvvv1%,vvvv2%,vvvv3%,bbbb%)
  14127.   ' Change le volume du sample position dddd%, longueur llll%,
  14128.   ' ancien volume vvvv1%, nouveaux volumes vvvv2% et 3 (debut-fin)
  14129.   ' Bbbb% est la resolution du sample (1 ou 2)
  14130.   LOCAL aaaa%,iiii1%,iiii2%,vvvv4%
  14131.   IF llll%>0 AND vvvv1%<>0
  14132.     aaaa%=ADD(FN adr_buffer,dddd%)
  14133.     vvvv4%=vvvv2%*32768/vvvv1%
  14134.     iiii1%=INT(SUB(vvvv3%,vvvv2%)*32768/vvvv1%/SHR(llll%,PRED(bbbb%)))
  14135.     iiii2%=(SUB(vvvv3%,vvvv2%)*32768/vvvv1%/SHR(llll%,PRED(bbbb%))-iiii1%)*2.14748E+09
  14136.     ~C:g_change_volume_sample%(L:aaaa%,L:llll%,L:vvvv4%,L:iiii1%,L:iiii2%,W:bbbb%)
  14137.   ENDIF
  14138. RETURN
  14139. ' Mixage
  14140. PROCEDURE se.sm_affsm_mix
  14141.   ' Var locales de Sample_Editor :
  14142.   ' Utilise i%, a% et b%
  14143.   GOSUB cadre_int(orc%,ADD(ory%,80),13,19,13,13,14,12)                  ! Cadre mix!
  14144.   GOSUB cadre_int(ADD(orc%,14),ADD(ory%,80),15,19,13,13,14,12)          ! Cadre master
  14145.   GOSUB cadre_int(ADD(orc%,30),ADD(ory%,80),9,19,13,13,14,12)           ! Cadre presets
  14146.   FOR i%=1 TO 5
  14147.     a%=ADD(orc%,MUL(DIV(i%,3),40))
  14148.     b%=ADD(ory%,ADD(80,MUL(i% MOD 3,20)))
  14149.     GOSUB cadre_int(a%,b%,1,19,13,13,14,12)                             ! Cadre piste 1a
  14150.     GOSUB cadre_int(ADD(a%,38),b%,1,19,13,13,14,12)                     ! Cadre piste 1b
  14151.     GOSUB cadre_int(SUCC(a%),b%,5,19,13,13,14,12)                       ! Cadre piste 2
  14152.     GOSUB affchaine_trans(STR$(i%),ADD(SHL(a%,1),5),ADD(b%,2),14)       ! Numero de piste
  14153.   NEXT i%
  14154.   GOSUB affiche_bloc_icones_b(0,46,6,orc%,ory%)
  14155.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,1,6),7)),ADD(ory%,ADD(divbi&(1,1,6),2)),4,5,0,13,12,14) ! Master
  14156.   FOR i%=7 TO 43 STEP 8
  14157.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,i%,6),6)),ADD(ory%,ADD(divbi&(1,i%,6),2)),4,5,0,13,12,14)                     ! Start
  14158.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,SUCC(i%),6),4)),ADD(ory%,ADD(divbi&(1,SUCC(i%),6),2)),4,5,0,13,12,14)         ! End
  14159.     GOSUB cadre_ext(ADD(orc%,SUCC(divbi&(0,ADD(i%,3),6))),ADD(ory%,ADD(divbi&(1,ADD(i%,3),6),2)),1,5,0,13,12,14)        ! Numero
  14160.     GOSUB cadre_ext(ADD(orc%,SUCC(divbi&(0,ADD(i%,6),6))),ADD(ory%,ADD(divbi&(1,ADD(i%,6),6),2)),27,5,0,13,12,14)       ! Samplename
  14161.   NEXT i%
  14162.   GOSUB se.sm_actsm_mix
  14163. RETURN
  14164. PROCEDURE se.sm_actsm_mix
  14165.   ' Var locales de Sample_Editor :
  14166.   ' Utilise a%, i%, j%, aaaa$
  14167.   GOSUB affchaine_notrans(FN pourcent$(se.mix_master_volume%,32768),ADD(orc%,ADD(divbi&(0,1,6),7)),ADD(ory%,ADD(divbi&(1,1,6),2)),1)
  14168.   FOR i%=0 TO 4
  14169.     j%=ADD(MUL(i%,8),6)
  14170.     GOSUB affiche_icone_b(j%,6,orc%,ory%,se.mix_param%(0,i%) AND 1)             ! On
  14171.     GOSUB affiche_icone_b(ADD(j%,3),6,orc%,ory%,se.mix_param%(0,i%) AND 2)      ! Loop
  14172.     a%=se.mix_param%(1,i%)                              ! Numero de sample
  14173.     IF a%>0
  14174.       GOSUB affchaine_notrans(HEX$(a%,2),ADD(orc%,SUCC(divbi&(0,ADD(j%,4),6))),ADD(ory%,ADD(divbi&(1,ADD(j%,4),6),2)),1)
  14175.       aaaa$=FN samplename$(a%)
  14176.     ELSE
  14177.       GOSUB affchaine_notrans("  ",ADD(orc%,SUCC(divbi&(0,ADD(j%,4),6))),ADD(ory%,ADD(divbi&(1,ADD(j%,4),6),2)),1)
  14178.       aaaa$="Block                       "
  14179.     ENDIF
  14180.     GOSUB affchaine_notrans(aaaa$,ADD(orc%,SUCC(divbi&(0,ADD(j%,7),6))),ADD(ory%,ADD(divbi&(1,ADD(j%,7),6),2)),1)
  14181.     GOSUB affchaine_notrans(FN pourcent$(se.mix_param%(2,i%),32768),ADD(orc%,ADD(divbi&(0,ADD(j%,1),6),6)),ADD(ory%,ADD(divbi&(1,ADD(j%,1),6),2)),1)    ! Volume de debut
  14182.     GOSUB affchaine_notrans(FN pourcent$(se.mix_param%(3,i%),32768),ADD(orc%,ADD(divbi&(0,ADD(j%,2),6),4)),ADD(ory%,ADD(divbi&(1,ADD(j%,2),6),2)),1)    ! Volume de fin
  14183.   NEXT i%
  14184.   SHOWM
  14185. RETURN
  14186. PROCEDURE se.sm_gere_mix
  14187.   ' Var locales de Sample_Editor :
  14188.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14189.   ' Utilise srt%, a%, i%, flag_relachement!, aaaa$
  14190.   ~FRE(0)
  14191.   IF km%>0
  14192.     a%=V:divbi&(0,0,0)
  14193.     srt%=C:g_teste_icones%(L:a%,W:6,W:xm2%,W:ym2%)
  14194.     IF srt%>=0
  14195.       SELECT srt%
  14196.         ' Radio-boutons, Flip-flops ou champs de texte
  14197.         ' --------------------------------------------------------------------
  14198.       CASE 6,14,22,30,38        ! Sample On/Off
  14199.         se.mix_param%(0,DIV(SUB(srt%,6),8))=se.mix_param%(0,DIV(SUB(srt%,6),8)) XOR 1
  14200.         GOSUB se.sm_actsm_mix
  14201.         ' --------------------------------------------------------------------
  14202.       CASE 9,17,25,33,41        ! Loop on/off
  14203.         se.mix_param%(0,DIV(SUB(srt%,9),8))=se.mix_param%(0,DIV(SUB(srt%,9),8)) XOR 2
  14204.         GOSUB se.sm_actsm_mix
  14205.         ' --------------------------------------------------------------------
  14206.       CASE 1                    ! Master volume
  14207.         GOSUB edite_chaine(FN pourcent$(se.mix_master_volume%,32768),ADD(orc%,ADD(divbi&(0,1,6),7)),ADD(ory%,ADD(divbi&(1,1,6),2)),5,3)
  14208.         se.mix_master_volume%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  14209.         GOSUB se.sm_actsm_mix
  14210.         ' --------------------------------------------------------------------
  14211.       CASE 7,15,23,31,39        ! Volume de debut
  14212.         IF km%=2
  14213.           se.mix_param%(2,DIV(SUB(srt%,7),8))=se.mix_param%(3,DIV(SUB(srt%,7),8))
  14214.         ELSE
  14215.           GOSUB edite_chaine(FN pourcent$(se.mix_param%(2,DIV(SUB(srt%,7),8)),32768),ADD(orc%,ADD(divbi&(0,srt%,6),6)),ADD(ory%,ADD(divbi&(1,srt%,6),2)),5,3)
  14216.           se.mix_param%(2,DIV(SUB(srt%,7),8))=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  14217.         ENDIF
  14218.         GOSUB se.sm_actsm_mix
  14219.         ' --------------------------------------------------------------------
  14220.       CASE 8,16,24,32,40        ! Volume de fin
  14221.         IF km%=2
  14222.           se.mix_param%(3,DIV(SUB(srt%,8),8))=se.mix_param%(2,DIV(SUB(srt%,8),8))
  14223.         ELSE
  14224.           GOSUB edite_chaine(FN pourcent$(se.mix_param%(3,DIV(SUB(srt%,8),8)),32768),ADD(orc%,ADD(divbi&(0,srt%,6),4)),ADD(ory%,ADD(divbi&(1,srt%,6),2)),5,3)
  14225.           se.mix_param%(3,DIV(SUB(srt%,8),8))=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  14226.         ENDIF
  14227.         GOSUB se.sm_actsm_mix
  14228.         ' --------------------------------------------------------------------
  14229.       CASE 10,18,26,34,42       ! Numero de sample
  14230.         IF km%=1
  14231.           GOSUB edite_chaine(HEX$(se.mix_param%(1,DIV(SUB(srt%,10),8)),2),ADD(orc%,SUCC(divbi&(0,srt%,6))),ADD(ory%,ADD(divbi&(1,srt%,6),2)),2,1)
  14232.           se.mix_param%(1,DIV(SUB(srt%,10),8))=VAL("$"+bbbb$)
  14233.         ELSE
  14234.           se.mix_param%(1,DIV(SUB(srt%,10),8))=sample%
  14235.         ENDIF
  14236.         GOSUB se.sm_actsm_mix
  14237.         ' --------------------------------------------------------------------
  14238.       CASE 11,12,19,20,27,28,35,36,43,44        ! Sample + ou -
  14239.         se.mix_param%(1,DIV(SUB(srt%,11),8))=MAX(MIN(ADD(se.mix_param%(1,DIV(SUB(srt%,11),8)),SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,11) MOD 8,km%))),255),0)
  14240.         GOSUB se.sm_actsm_mix
  14241.         IF km%=1
  14242.           PAUSE 2
  14243.         ENDIF
  14244.         flag_relachement!=FALSE
  14245.         ' --------------------------------------------------------------------
  14246.       CASE 13,21,29,37,45       ! Simples icones non cliquables
  14247.         ' --------------------------------------------------------------------
  14248.       DEFAULT
  14249.         ' Icones normales
  14250.         GOSUB affiche_icone_b(srt%,6,orc%,ory%,-1)
  14251.         GOSUB wait_mouse(TRUE)
  14252.         SELECT srt%
  14253.           ' ------------------------------------------------------------------
  14254.         CASE 0                  ! Mix !
  14255.           GOSUB bee(TRUE)
  14256.           GOSUB spl_mixage_samples(mark_1%,mark_len%,win_bits%,se.mix_master_volume%)
  14257.           se.volume_ok!=FALSE
  14258.           noact_delay%=5
  14259.           GOSUB affiche_sample
  14260.           ' ------------------------------------------------------------------
  14261.         CASE 2 TO 5             ! Presets
  14262.           se.mix_master_volume%=DIV(32768,srt%)
  14263.           FOR i%=0 TO 4
  14264.             IF i%<srt%  ! On
  14265.               se.mix_param%(0,i%)=se.mix_param%(0,i%) OR 1
  14266.               se.mix_param%(2,i%)=32768
  14267.               se.mix_param%(3,i%)=32768
  14268.             ELSE        ! Off
  14269.               se.mix_param%(0,i%)=se.mix_param%(0,i%) AND -2
  14270.             ENDIF
  14271.           NEXT i%
  14272.           GOSUB se.sm_actsm_mix
  14273.           ' ------------------------------------------------------------------
  14274.         ENDSELECT
  14275.         GOSUB affiche_icone_b(srt%,6,orc%,ory%,0)
  14276.       ENDSELECT
  14277.       GOSUB wait_mouse(flag_relachement!)
  14278.       flag_relachement!=TRUE
  14279.       GOSUB vide_buffer_clavier
  14280.     ENDIF
  14281.   ENDIF
  14282. RETURN
  14283. PROCEDURE spl_mixage_samples(dddd%,llll%,bbbb%,mmmm%)
  14284.   ' Mixe plusieurs samples (infos dans se.mix_param%())
  14285.   ' Buffer commencant en position dddd%, de longueur llll%,
  14286.   ' de resolution bbbb% (1 ou 2)
  14287.   ' Master volume mmmm% (/32768)
  14288.   LOCAL iiii%,iiii1%,iiii2%,ssss%,aaaa$
  14289.   IF llll%>0
  14290.     aaaa$=""
  14291.     nnnn%=0
  14292.     FOR iiii%=0 TO 4
  14293.       IF BTST(se.mix_param%(0,iiii%),0)
  14294.         ssss%=se.mix_param%(1,iiii%)
  14295.         IF ssss%=0                                              ! Buffer
  14296.           aaaa$=aaaa$+MKI$(bbbb%)+MKL$(ADD(FN adr_buffer,dddd%))+MKL$(-1)+MKL$(llll%)+MKL$(0)
  14297.         ELSE                                                    ! Sample
  14298.           aaaa$=aaaa$+MKI$(FN resol(ssss%))+MKL$(FN adresse(ssss%))
  14299.           IF ADD(FN repeat(ssss%),FN replen(ssss%))>2 AND BTST(se.mix_param%(0,iiii%),1)        ! Boucle
  14300.             aaaa$=aaaa$+MKL$(FN repeat(ssss%))+MKL$(ADD(FN repeat(ssss%),FN replen(ssss%)))+MKL$(0)
  14301.           ELSE                                                  ! Pas boucle
  14302.             aaaa$=aaaa$+MKL$(-1)+MKL$(FN length(ssss%))+MKL$(0)
  14303.           ENDIF
  14304.         ENDIF
  14305.         aaaa$=aaaa$+MKL$(se.mix_param%(2,iiii%)*mmmm%/32768)+MKL$(0)
  14306.         iiii1%=INT(SUB(se.mix_param%(3,iiii%),se.mix_param%(2,iiii%))*mmmm%/SHR(llll%,PRED(bbbb%))/32768)        ! Calcul des increments de volume
  14307.         iiii2%=SHL((SUB(se.mix_param%(3,iiii%),se.mix_param%(2,iiii%))*mmmm%/SHR(llll%,PRED(bbbb%))/32768-iiii1%)*2.14748E+09,1)
  14308.         aaaa$=aaaa$+MKL$(iiii1%)+MKL$(iiii2%)
  14309.         INC nnnn%
  14310.       ENDIF
  14311.     NEXT iiii%
  14312.     IF nnnn%>0
  14313.       aaaa$=MKL$(ADD(FN adr_buffer,dddd%))+MKL$(llll%)+MKI$(bbbb%)+MKI$(nnnn%)+aaaa$
  14314.       aaaa%=V:aaaa$
  14315.       ~C:g_mixage_sample%(L:aaaa%)
  14316.     ENDIF
  14317.   ENDIF
  14318. RETURN
  14319. ' Record
  14320. PROCEDURE se.sm_affsm_record
  14321.   GOSUB cadre_int(orc%,ADD(ory%,80),23,19,13,13,14,12)          ! Cadre Sample/presample
  14322.   GOSUB cadre_int(orc%,ADD(ory%,100),23,39,13,13,14,12)         ! Cadre Trigger/frequency
  14323.   GOSUB cadre_int(ADD(orc%,24),ADD(ory%,80),13,29,13,13,14,12)  ! Cadre Channel
  14324.   GOSUB cadre_int(ADD(orc%,24),ADD(ory%,110),13,29,13,13,14,12) ! Cadre Monitor
  14325.   GOSUB cadre_int(ADD(orc%,38),ADD(ory%,80),25,59,13,13,14,12)  ! Cadre Input Device
  14326.   GOSUB cadre_int(ADD(orc%,64),ADD(ory%,80),15,59,13,13,14,12)  ! Cadre Input Level
  14327.   GOSUB affiche_bloc_icones_b(0,12,7,orc%,ory%)
  14328.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,7,7),10)),ADD(ory%,ADD(divbi&(1,7,7),2)),4,5,0,13,12,14)        ! Frequency
  14329.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,11,7),6)),ADD(ory%,ADD(divbi&(1,11,7),2)),4,5,0,13,12,14)       ! Level
  14330.   GOSUB cadre_ext(ADD(orc%,65),ADD(ory%,97),4,5,0,13,12,14)     ! Level (L)
  14331.   GOSUB cadre_ext(ADD(orc%,74),ADD(ory%,97),4,5,0,13,12,14)     ! Level (R)
  14332.   GOSUB affchaine_trans("INPUT LEVEL",ADD(SHL(orc%,1),133),ADD(ory%,117),14)
  14333.   GOSUB affchaine_trans("LEFT",ADD(SHL(orc%,1),131),ADD(ory%,87),14)
  14334.   GOSUB affchaine_trans("RIGHT",ADD(SHL(orc%,1),148),ADD(ory%,87),14)
  14335.   GOSUB affchaine_trans("dB",ADD(SHL(orc%,1),142),ADD(ory%,97),14)
  14336.   GOSUB affchaine_trans("CHANNEL",SUB(SHL(ADD(orc%,divbi&(0,14,7)),1),3),SUB(ADD(ory%,divbi&(1,14,7)),8),14)
  14337.   GOSUB affchaine_trans("INPUT DEVICE",SHL(ADD(orc%,45),1),ADD(ory%,87),14)
  14338.   GOSUB se.sm_actsm_record
  14339. RETURN
  14340. PROCEDURE se.sm_actsm_record
  14341.   ' Variable locales de Sample_Editor :
  14342.   ' Utilise aaaa$
  14343.   GOSUB affiche_icone_b(12,7,orc%,ory%,se.rec_flag_trigger!)    ! Trigger on/off
  14344.   GOSUB affiche_icone_b(13,7,orc%,ory%,se.rec_canal%=1)         ! Left
  14345.   GOSUB affiche_icone_b(14,7,orc%,ory%,se.rec_canal%=3)         ! Left+Right
  14346.   GOSUB affiche_icone_b(15,7,orc%,ory%,se.rec_canal%=2)         ! Right
  14347.   GOSUB affiche_icone_b(16,7,orc%,ory%,se.rec_input_device%=0)  ! Falcon ADC
  14348.   GOSUB affiche_icone_b(17,7,orc%,ory%,se.rec_input_device%=1)  ! ST Replay pro
  14349.   GOSUB affchaine_notrans(FN pourcent$(se.rec_trigger%,32768),ADD(orc%,ADD(divbi&(0,11,7),6)),ADD(ory%,ADD(divbi&(1,11,7),2)),1)        ! Niveau de trigger
  14350.   IF se.rec_input_device%=0             ! DAC CODEC Falcon
  14351.     aaaa$=MID$("xxxxx4917032780245851966816390xxxxx12292xxxxx 9834xxxxx 8195",SUCC(MUL(se.rec_adc_freq%,5)),5)
  14352.   ELSE
  14353.     aaaa$=STR$(se.rec_ext_freq%,5)      ! DAC exterieur
  14354.   ENDIF
  14355.   GOSUB affchaine_notrans(aaaa$,ADD(orc%,ADD(divbi&(0,7,7),10)),ADD(ory%,ADD(divbi&(1,7,7),2)),1)
  14356.   GOSUB affchaine_notrans(STR$(-(SHR(NOT PEEK(&HFFFF8939),4) AND 15)*1.5,5),ADD(orc%,65),ADD(ory%,97),1)   ! Level (L)
  14357.   GOSUB affchaine_notrans(STR$(-((NOT PEEK(&HFFFF8939)) AND 15)*1.5,5),ADD(orc%,74),ADD(ory%,97),1)        ! Level (R)
  14358.   GOSUB grise_icone(17,7,orc%,ory%)
  14359.   SHOWM
  14360. RETURN
  14361. PROCEDURE se.sm_gere_record             !!!
  14362.   ' Var locales de Sample_Editor :
  14363.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14364.   ' Utilise srt%, a%, b%, c%, i%, flag_relachement!, aaaa$
  14365.   ~FRE(0)
  14366.   IF km%>0
  14367.     a%=V:divbi&(0,0,0)
  14368.     srt%=C:g_teste_icones%(L:a%,W:7,W:xm2%,W:ym2%)
  14369.     IF srt%>=0
  14370.       SELECT srt%
  14371.         ' Radio-boutons, Flip-flops ou champs de texte
  14372.         ' --------------------------------------------------------------------
  14373.       CASE 2,3                  ! Level +/- (L)
  14374.         SPOKE &HFFFF8939,ADD(PEEK(&HFFFF8939) AND 15,MAX(0,MIN(240,ADD(PEEK(&HFFFF8939) AND 240,SUB(80,SHL(srt%,5))))))
  14375.         GOSUB se.sm_actsm_record
  14376.         IF km%=1
  14377.           PAUSE 4
  14378.         ENDIF
  14379.         flag_relachement!=FALSE
  14380.         ' --------------------------------------------------------------------
  14381.       CASE 4,5                  ! Level +/- (R)
  14382.         SPOKE &HFFFF8939,ADD(PEEK(&HFFFF8939) AND 240,MAX(0,MIN(15,ADD(PEEK(&HFFFF8939) AND 15,SUB(9,SHL(srt%,1))))))
  14383.         GOSUB se.sm_actsm_record
  14384.         IF km%=1
  14385.           PAUSE 4
  14386.         ENDIF
  14387.         flag_relachement!=FALSE
  14388.         ' --------------------------------------------------------------------
  14389.       CASE 8                    ! Frequence +
  14390.         IF se.rec_input_device%=0
  14391.           se.rec_adc_freq%=VAL("$"+MID$("11234151719",se.rec_adc_freq%,1))
  14392.           GOSUB se.sm_actsm_record
  14393.           IF km%=1
  14394.             PAUSE 4
  14395.           ENDIF
  14396.           flag_relachement!=FALSE
  14397.         ENDIF
  14398.         ' --------------------------------------------------------------------
  14399.       CASE 9                    ! Frequence -
  14400.         IF se.rec_input_device%=0
  14401.           se.rec_adc_freq%=VAL("$"+MID$("23457191B1B",se.rec_adc_freq%,1))
  14402.           GOSUB se.sm_actsm_record
  14403.           IF km%=1
  14404.             PAUSE 4
  14405.           ENDIF
  14406.           flag_relachement!=FALSE
  14407.         ENDIF
  14408.         ' --------------------------------------------------------------------
  14409.       CASE 7                    ! Frequency
  14410.         IF se.rec_input_device%<>0
  14411.           GOSUB edite_chaine(STR$(se.rec_ext_freq%,5),ADD(orc%,ADD(divbi&(0,7,7),10)),ADD(ory%,ADD(divbi&(1,7,7),2)),5,2)
  14412.           se.rec_ext_freq%=MIN(49170,MAX(2000,VAL(bbbb$)))
  14413.         ENDIF
  14414.         GOSUB se.sm_actsm_record
  14415.         ' --------------------------------------------------------------------
  14416.       CASE 11                   ! Trigger level
  14417.         GOSUB edite_chaine(FN pourcent$(se.rec_trigger%,32768),ADD(orc%,ADD(divbi&(0,11,7),6)),ADD(ory%,ADD(divbi&(1,11,7),2)),5,3)
  14418.         se.rec_trigger%=MAX(MIN(DIV(32768*VAL(bbbb$),100),32768),0)
  14419.         GOSUB se.sm_actsm_record
  14420.         ' --------------------------------------------------------------------
  14421.       CASE 12                   ! Trigger on/off
  14422.         se.rec_flag_trigger!=NOT se.rec_flag_trigger!
  14423.         GOSUB se.sm_actsm_record
  14424.         ' --------------------------------------------------------------------
  14425.       CASE 13                   ! Left
  14426.         se.rec_canal%=1
  14427.         GOSUB se.sm_actsm_record
  14428.         ' --------------------------------------------------------------------
  14429.       CASE 14                   ! Left + Right
  14430.         se.rec_canal%=3
  14431.         GOSUB se.sm_actsm_record
  14432.         ' --------------------------------------------------------------------
  14433.       CASE 15                   ! Right
  14434.         se.rec_canal%=2
  14435.         GOSUB se.sm_actsm_record
  14436.         ' --------------------------------------------------------------------
  14437.       CASE 16                   ! ADC Falcon
  14438.         se.rec_input_device%=0
  14439.         GOSUB se.sm_actsm_record
  14440.         ' --------------------------------------------------------------------
  14441.       CASE 17                   ! ADC ST Replay pro *** Non selectionnable pour l'instant ***
  14442.         '   se.rec_input_device%=1
  14443.         '   GOSUB se.sm_actsm_record
  14444.         ' --------------------------------------------------------------------
  14445.       DEFAULT
  14446.         ' Icones normales
  14447.         GOSUB affiche_icone_b(srt%,7,orc%,ory%,-1)
  14448.         GOSUB wait_mouse(TRUE)
  14449.         SELECT srt%
  14450.           ' ------------------------------------------------------------------
  14451.         CASE 0                  ! Sample
  14452.           aaaa$=MKL$(ADD(FN adr_buffer,mark_1%))+MKL$(mark_len%)+MKL$(0)+MKI$(0)+MKI$(win_bits%)+MKI$(se.rec_canal%)+MKI$(MUL(se.rec_trigger%,-se.rec_flag_trigger!))
  14453.           IF se.rec_input_device%=0             ! Utilisation de l'ADC du Falcon
  14454.             aaaa$=aaaa$+MKI$(se.rec_adc_freq%)
  14455.             BMOVE V:aaaa$,g_adr_record_inf%,22
  14456.             ~C:g_start_sample_recording%(W:0)
  14457.             REPEAT
  14458.               a%=C:g_cherche_volume_buffer_stereo%(W:0)
  14459.               GOSUB spl_affiche_vumetre(SHR(a%,16),a% AND 65535,0,0)
  14460.               IF GEMDOS(11)<>0
  14461.                 ~GEMDOS(7)
  14462.                 CARD{g_flag_sample_rec%}=0
  14463.               ELSE IF MOUSEK=2
  14464.                 CARD{g_flag_sample_rec%}=0
  14465.               ENDIF
  14466.             UNTIL CARD{g_flag_sample_rec2%}=4
  14467.             freq_buffer%=DIV(98340,SUCC(se.rec_adc_freq%))
  14468.           ELSE IF se.rec_input_device%=1        ! Utilisation de la carte ST Replay pro
  14469.             '
  14470.             '
  14471.             '
  14472.             '
  14473.             freq_buffer%=se.rec_ext_freq%
  14474.           ENDIF
  14475.           mark_2%=MIN(ADD(mark_1%,LONG{ADD(g_adr_record_inf%,8)}),ADD(mark_1%,mark_len%))
  14476.           GOSUB spl_affiche_vumetre(0,0,0,0)
  14477.           GOSUB affiche_sample
  14478.           ' ------------------------------------------------------------------
  14479.         CASE 1                  ! Presample
  14480.           aaaa$=MKL$(ADD(FN adr_buffer,mark_1%))+MKL$(mark_len%)+MKL$(0)+MKI$(1)+MKI$(win_bits%)+MKI$(se.rec_canal%)+MKI$(MUL(se.rec_trigger%,-se.rec_flag_trigger!))
  14481.           IF se.rec_input_device%=0             ! Utilisation de l'ADC du Falcon
  14482.             aaaa$=aaaa$+MKI$(se.rec_adc_freq%)
  14483.             BMOVE V:aaaa$,g_adr_record_inf%,22
  14484.             ~C:g_start_sample_recording%(W:0)
  14485.             REPEAT
  14486.               a%=C:g_cherche_volume_buffer_stereo%(W:0)
  14487.               GOSUB spl_affiche_vumetre(SHR(a%,16),a% AND 65535,0,0)
  14488.               IF GEMDOS(11)<>0
  14489.                 ~GEMDOS(7)
  14490.                 CARD{g_flag_sample_rec%}=0
  14491.               ELSE IF MOUSEK=2
  14492.                 CARD{g_flag_sample_rec%}=0
  14493.               ENDIF
  14494.             UNTIL CARD{g_flag_sample_rec2%}=4
  14495.             freq_buffer%=DIV(98340,SUCC(se.rec_adc_freq%))
  14496.           ELSE IF se.rec_input_device%=1        ! Utilisation de la carte ST Replay pro
  14497.             '
  14498.             '
  14499.             '
  14500.             '
  14501.             freq_buffer%=se.rec_ext_freq%
  14502.           ENDIF
  14503.           GOSUB spl_affiche_vumetre(0,0,0,0)
  14504.           a%=LONG{ADD(g_adr_record_inf%,8)}
  14505.           IF BTST(CARD{ADD(g_adr_record_inf%,12)},1)
  14506.             GOSUB bee(TRUE)
  14507.             GOSUB mem_rotation(ADD(FN adr_buffer,mark_1%),mark_len%,-a%)
  14508.             GOSUB bee(FALSE)
  14509.           ENDIF
  14510.           PAUSE 2
  14511.           GOSUB affiche_sample
  14512.           ' ------------------------------------------------------------------
  14513.         CASE 6                  ! Auto
  14514.           GOSUB spl_auto_set_input_level(TRUE)
  14515.           ' ------------------------------------------------------------------
  14516.         CASE 10                 ! Monitor
  14517.           GOSUB spl_auto_set_input_level(FALSE)
  14518.           ' ------------------------------------------------------------------
  14519.         ENDSELECT
  14520.         GOSUB affiche_icone_b(srt%,7,orc%,ory%,0)
  14521.       ENDSELECT
  14522.       GOSUB wait_mouse(flag_relachement!)
  14523.       flag_relachement!=TRUE
  14524.       GOSUB vide_buffer_clavier
  14525.     ENDIF
  14526.   ENDIF
  14527. RETURN
  14528. PROCEDURE spl_auto_set_input_level(flag!)
  14529.   ' Si flag!=TRUE, adapte le niveau d'entree a la source
  14530.   ' Si flag!=FALSE, simple monitoring
  14531.   LOCAL a%,a1%,a2%,b%,c%,d%,v1%,v2%,old_mat_cnx%,a$
  14532.   ~FRE(0)
  14533.   v1%=0
  14534.   v2%=0
  14535.   old_mat_cnx%=LPEEK(&HFFFF8930)                ! Sauve l'ancienne connection de la matrice
  14536.   ~XBIOS(&H8B,W:3,W:&X1001,W:0,W:1,W:1)         ! Connecte le DAC et le DMArec a l'ADC
  14537.   a$=MKL$(XBIOS(2))+MKL$(2048)+MKL$(0)+MKI$(0)+MKI$(2)+MKI$(1)+MKI$(32769)+MKI$(1)
  14538.   BMOVE V:a$,g_adr_record_inf%,22
  14539.   ~C:g_start_sample_recording%(W:0)
  14540.   REPEAT
  14541.     a%=C:g_cherche_volume_buffer_stereo%(W:0)
  14542.     a1%=SHR(a%,16)
  14543.     a2%=a% AND 65535
  14544.     ' Teste la droite
  14545.     IF a2%<v2%                                  ! Moins fort que d'habitude, le plafond descend lentement
  14546.       v2%=SHR(ADD(MUL(v2%,253),MUL(a2%,3)),8)   ! Inertie 253/256 (ancien) - 3/256 (nouveau)
  14547.     ELSE                                        ! Plus fort, le plafond s'adapte rapidement
  14548.       v2%=SHR(ADD(MUL(v2%,6),MUL(a2%,10)),4)    ! Inertie 6/16 (ancien) - 10/16 (nouveau)
  14549.     ENDIF
  14550.     IF flag!
  14551.       b%=PEEK(&HFFFF8939) AND 15
  14552.       d%=b%
  14553.       IF a2%>32700                              ! Saturation ?
  14554.         d%=MAX(SUB(b%,4),0)                     ! alors - 6 dB cash
  14555.       ELSE IF v2%>0
  14556.         c%=ROUND(10*LOG10(v2%/24576)/1.5)       ! Rapport volume / 75% de volmax en dB/1.5
  14557.         d%=MIN(MAX(SUB(b%,c%),0),15)            ! Augmente ou diminue en consequence
  14558.         v2%=v2%*(10^(SUB(d%,b%)*0.15))
  14559.       ENDIF
  14560.       SPOKE &HFFFF8939,ADD(d%,PEEK(&HFFFF8939) AND &HF0)
  14561.     ENDIF
  14562.     ' Teste la gauche
  14563.     IF a1%<v1%                                  ! Moins fort que d'habitude, le plafond descend lentement
  14564.       v1%=SHR(ADD(MUL(v1%,253),MUL(a1%,3)),8)   ! Inertie 253/256 (ancien) - 3/256 (nouveau)
  14565.     ELSE                                        ! Plus fort, le plafond s'adapte rapidement
  14566.       v1%=SHR(ADD(MUL(v1%,6),MUL(a1%,10)),4)    ! Inertie 6/16 (ancien) - 10/16 (nouveau)
  14567.     ENDIF
  14568.     IF flag!
  14569.       b%=SHR(PEEK(&HFFFF8939),4)
  14570.       d%=b%
  14571.       IF a1%>32700                              ! Saturation ?
  14572.         d%=MAX(SUB(b%,4),0)                     ! alors - 6 dB cash
  14573.       ELSE IF v1%>0
  14574.         c%=ROUND(10*LOG10(v1%/24576)/1.5)       ! Rapport volume / 75% de volmax en dB/1.5
  14575.         d%=MIN(MAX(SUB(b%,c%),0),15)            ! Augmente ou diminue en consequence
  14576.         v1%=v1%*(10^(SUB(d%,b%)*0.15))
  14577.       ENDIF
  14578.       SPOKE &HFFFF8939,ADD(SHL(d%,4),PEEK(&HFFFF8939) AND 15)
  14579.     ENDIF
  14580.     ' Affiche le resultat
  14581.     GOSUB affchaine_notrans(STR$(-(SHR(NOT PEEK(&HFFFF8939),4) AND 15)*1.5,5),ADD(orc%,65),ADD(ory%,97),1)   ! Level (L)
  14582.     GOSUB affchaine_notrans(STR$(-((NOT PEEK(&HFFFF8939)) AND 15)*1.5,5),ADD(orc%,74),ADD(ory%,97),1)        ! Level (R)
  14583.     IF GEMDOS(11)<>0
  14584.       ~GEMDOS(7)
  14585.       CARD{g_flag_sample_rec%}=0
  14586.       flag_s!=TRUE
  14587.     ELSE IF MOUSEK=2
  14588.       CARD{g_flag_sample_rec%}=0
  14589.     ELSE
  14590.       GOSUB spl_affiche_vumetre(a1%,a2%,v1%,v2%)
  14591.     ENDIF
  14592.   UNTIL CARD{g_flag_sample_rec2%}=4             ! Fini ?
  14593.   SLPOKE &HFFFF8930,old_mat_cnx%                ! Reprend l'ancienne config de la matrice
  14594.   GOSUB spl_affiche_vumetre(0,0,0,0)
  14595. RETURN
  14596. PROCEDURE spl_affiche_vumetre(vvvv1%,vvvv2%,mmmm1%,mmmm2%)
  14597.   LOCAL aaaa%
  14598.   aaaa%=SUB(SHR(scr_ncol%,1),4)         ! Gauche
  14599.   ~C:g_affiche_vumetre%(W:vvvv1%,W:mmmm1%,W:aaaa%,W:4,W:hwin%)
  14600.   aaaa%=SUB(SHR(scr_ncol%,1),2)         ! Droite
  14601.   ~C:g_affiche_vumetre%(W:vvvv2%,W:mmmm2%,W:aaaa%,W:4,W:hwin%)
  14602. RETURN
  14603. ' Marks
  14604. PROCEDURE se.sm_affsm_marks
  14605.   GOSUB cadre_int(orc%,ADD(ory%,80),39,49,13,13,14,12)
  14606.   GOSUB cadre_int(ADD(orc%,40),ADD(ory%,80),39,49,13,13,14,12)
  14607.   GOSUB affiche_bloc_icones_b(0,12,8,orc%,ory%)
  14608.   GOSUB cadre_ext(ADD(orc%,divbi&(0,23,8)),ADD(ory%,ADD(divbi&(1,23,8),2)),20,45,0,13,12,14)
  14609.   GOSUB cadre_ext(ADD(orc%,divbi&(0,24,8)),ADD(ory%,ADD(divbi&(1,24,8),2)),20,45,0,13,12,14)
  14610.   GOSUB cadre_ext(ADD(orc%,divbi&(0,25,8)),ADD(ory%,ADD(divbi&(1,25,8),2)),5,45,0,13,12,14)
  14611.   GOSUB cadre_ext(ADD(orc%,divbi&(0,26,8)),ADD(ory%,ADD(divbi&(1,26,8),2)),5,45,0,13,12,14)
  14612.   GOSUB cadre_ext(ADD(orc%,divbi&(0,27,8)),ADD(ory%,ADD(divbi&(1,27,8),2)),5,45,0,13,12,14)
  14613.   GOSUB cadre_ext(ADD(orc%,divbi&(0,28,8)),ADD(ory%,ADD(divbi&(1,28,8),2)),5,45,0,13,12,14)
  14614.   GOSUB affchaine_trans("NAME",ADD(SHL(ADD(orc%,divbi&(0,23,8)),1),17),ADD(ADD(ory%,divbi&(1,23,8)),52),14)
  14615.   GOSUB affchaine_trans("POS",ADD(SHL(ADD(orc%,divbi&(0,25,8)),1),3),ADD(ADD(ory%,divbi&(1,25,8)),52),14)
  14616.   GOSUB affchaine_trans("LENGTH",SHL(ADD(orc%,divbi&(0,27,8)),1),ADD(ADD(ory%,divbi&(1,27,8)),52),14)
  14617.   GOSUB se.sm_actsm_marks
  14618. RETURN
  14619. PROCEDURE se.sm_actsm_marks
  14620.   GOSUB se.sm_update_marks
  14621.   FOR i%=0 TO 9
  14622.     GOSUB affiche_icone_b(ADD(i%,13),8,orc%,ory%,se.mark_selected% AND SHL(1,i%))
  14623.     GOSUB affchaine_notrans(se.mark$(i%),ADD(orc%,divbi&(0,ADD(23,DIV(i%,5)),8)),ADD(ory%,ADD(ADD(divbi&(1,ADD(23,DIV(i%,5)),8),MUL(i% MOD 5,10)),2)),1)
  14624.     GOSUB affchaine_notrans(HEX$(se.mark%(0,i%),6),ADD(orc%,divbi&(0,ADD(25,DIV(i%,5)),8)),ADD(ory%,ADD(ADD(divbi&(1,ADD(25,DIV(i%,5)),8),MUL(i% MOD 5,10)),2)),1)
  14625.     GOSUB affchaine_notrans(HEX$(se.mark%(1,i%),6),ADD(orc%,divbi&(0,ADD(27,DIV(i%,5)),8)),ADD(ory%,ADD(ADD(divbi&(1,ADD(27,DIV(i%,5)),8),MUL(i% MOD 5,10)),2)),1)
  14626.   NEXT i%
  14627.   GOSUB affiche_icone_b(12,8,orc%,ory%,se.mark_set!)
  14628.   SHOWM
  14629. RETURN
  14630. PROCEDURE se.sm_gere_marks
  14631.   ' Var locales de Sample_Editor :
  14632.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14633.   ' Utilise srt%, a%, i%
  14634.   ~FRE(0)
  14635.   IF km%>0
  14636.     GOSUB se.sm_update_marks
  14637.     a%=V:divbi&(0,0,0)
  14638.     srt%=C:g_teste_icones%(L:a%,W:8,W:xm2%,W:ym2%)
  14639.     IF srt%>=0
  14640.       SELECT srt%
  14641.         ' Radio-boutons, Flip-flops ou champs de texte
  14642.         ' --------------------------------------------------------------------
  14643.       CASE 12                   ! Set
  14644.         se.mark_set!=NOT se.mark_set!
  14645.         GOSUB se.sm_actsm_marks
  14646.         ' --------------------------------------------------------------------
  14647.       CASE 13 TO 22             ! Selection d'un numero de preset
  14648.         se.mark_selected%=se.mark_selected% XOR SHL(1,SUB(srt%,13))
  14649.         GOSUB se.sm_actsm_marks
  14650.         ' --------------------------------------------------------------------
  14651.       CASE 23,24                ! Name
  14652.         a%=ADD(MUL(SUB(srt%,23),5),DIV(SUB(ym2%,divbi&(1,srt%,8)),10))
  14653.         GOSUB edite_chaine(se.mark$(a%),ADD(orc%,divbi&(0,srt%,8)),ADD(ory%,ADD(divbi&(1,srt%,8),ADD(MUL(a% MOD 5,10),2))),21,0)
  14654.         se.mark$(a%)=bbbb$
  14655.         GOSUB se.sm_actsm_marks
  14656.         ' --------------------------------------------------------------------
  14657.       CASE 25,26                ! Pos
  14658.         a%=ADD(MUL(SUB(srt%,25),5),DIV(SUB(ym2%,divbi&(1,srt%,8)),10))
  14659.         GOSUB edite_chaine(HEX$(se.mark%(0,a%),6),ADD(orc%,divbi&(0,srt%,8)),ADD(ory%,ADD(divbi&(1,srt%,8),ADD(MUL(a% MOD 5,10),2))),6,1)
  14660.         se.mark%(0,a%)=MIN(VAL("$"+bbbb$),SUB(FN lon_buffer,2)) AND -2
  14661.         se.mark%(1,a%)=MIN(se.mark%(1,a%),SUB(FN lon_buffer,se.mark%(0,a%))) AND -2
  14662.         GOSUB se.sm_actsm_marks
  14663.         ' --------------------------------------------------------------------
  14664.       CASE 27,28                ! Length
  14665.         a%=ADD(MUL(SUB(srt%,27),5),DIV(SUB(ym2%,divbi&(1,srt%,8)),10))
  14666.         GOSUB edite_chaine(HEX$(se.mark%(1,a%),6),ADD(orc%,divbi&(0,srt%,8)),ADD(ory%,ADD(divbi&(1,srt%,8),ADD(MUL(a% MOD 5,10),2))),6,1)
  14667.         se.mark%(1,a%)=MIN(VAL("$"+bbbb$),SUB(FN lon_buffer,se.mark%(0,a%))) AND -2
  14668.         GOSUB se.sm_actsm_marks
  14669.         ' --------------------------------------------------------------------
  14670.       DEFAULT
  14671.         ' Icones normales
  14672.         GOSUB affiche_icone_b(srt%,8,orc%,ory%,-1)
  14673.         GOSUB wait_mouse(TRUE)
  14674.         SELECT srt%
  14675.           ' ------------------------------------------------------------------
  14676.         CASE 0 TO 9             ! Activation ou enregistrement d'un preset
  14677.           IF se.mark_set!
  14678.             se.mark%(0,srt%)=mark_1%
  14679.             se.mark%(1,srt%)=mark_len%
  14680.             se.mark_set!=FALSE
  14681.           ELSE
  14682.             mark_1%=se.mark%(0,srt%)
  14683.             mark_len%=se.mark%(1,srt%)
  14684.           ENDIF
  14685.           IF km%=2
  14686.             win_pos%=mark_1%
  14687.             win_lon%=mark_len%
  14688.           ENDIF
  14689.           GOSUB affiche_sample
  14690.           GOSUB se.sm_actsm_marks
  14691.           ' ------------------------------------------------------------------
  14692.         CASE 10                 ! All
  14693.           se.mark_selected%=&X1111111111
  14694.           GOSUB se.sm_actsm_marks
  14695.           ' ------------------------------------------------------------------
  14696.         CASE 11                 ! Reset
  14697.           FOR i%=0 TO 9
  14698.             IF (se.mark_selected% AND SHL(1,i%))=SHL(1,i%)
  14699.               se.mark%(0,i%)=0
  14700.               se.mark%(1,i%)=FN lon_buffer
  14701.               se.mark$(i%)=SPACE$(21)
  14702.             ENDIF
  14703.           NEXT i%
  14704.           se.mark_selected%=0
  14705.           GOSUB se.sm_actsm_marks
  14706.           ' ------------------------------------------------------------------
  14707.         ENDSELECT
  14708.         GOSUB affiche_icone_b(srt%,8,orc%,ory%,0)
  14709.       ENDSELECT
  14710.       GOSUB wait_mouse(TRUE)
  14711.       GOSUB vide_buffer_clavier
  14712.     ENDIF
  14713.   ENDIF
  14714. RETURN
  14715. PROCEDURE se.sm_update_marks
  14716.   ' Corrige les marques si la longueur du buffer a ete modifiee
  14717.   LOCAL i%
  14718.   FOR i%=0 TO 9
  14719.     IF se.mark%(0,i%)>SUB(FN lon_buffer,2)
  14720.       se.mark%(0,i%)=0
  14721.       se.mark%(1,i%)=FN lon_buffer
  14722.       se.mark$(i%)=SPACE$(21)
  14723.     ELSE
  14724.       se.mark%(1,i%)=MIN(se.mark%(1,i%),SUB(FN lon_buffer,se.mark%(0,i%))) AND -2
  14725.     ENDIF
  14726.   NEXT i%
  14727. RETURN
  14728. PROCEDURE se.sm_chg_marks(oooo%,nnnn%)
  14729.   ' Reactualise les marques pour l'insertion ou la destruction d'une sequence dans le buffer
  14730.   ' oooo% = ancienne pos, nnnn% = nouvelle pos
  14731.   LOCAL i%
  14732.   IF oooo%<=nnnn%
  14733.     FOR i%=0 TO 9
  14734.       IF se.mark%(0,i%)>=oooo%
  14735.         ADD se.mark%(0,i%),SUB(nnnn%,oooo%)
  14736.       ELSE IF ADD(se.mark%(0,i%),se.mark%(1,i%))>=oooo%
  14737.         ADD se.mark%(1,i%),SUB(nnnn%,oooo%)
  14738.       ENDIF
  14739.     NEXT i%
  14740.   ELSE
  14741.     FOR i%=0 TO 9
  14742.       IF se.mark%(0,i%)>=oooo%
  14743.         ADD se.mark%(0,i%),SUB(nnnn%,oooo%)
  14744.       ELSE IF se.mark%(0,i%)>=nnnn%
  14745.         SUB se.mark%(1,i%),SUB(oooo%,se.mark%(0,i%))
  14746.         IF se.mark%(1,i%)=>2
  14747.           se.mark%(0,i%)=nnnn%
  14748.         ELSE
  14749.           se.mark%(0,i%)=0
  14750.           se.mark%(1,i%)=FN lon_buffer
  14751.           se.mark$(i%)=SPACE$(21)
  14752.         ENDIF
  14753.       ELSE IF se.mark%(0,i%)<=nnnn% AND ADD(se.mark%(0,i%),se.mark%(1,i%))>nnnn%
  14754.         IF ADD(se.mark%(0,i%),se.mark%(1,i%))>=oooo%
  14755.           SUB se.mark%(1,i%),SUB(oooo%,nnnn%)
  14756.         ELSE
  14757.           se.mark%(1,i%)=SUB(nnnn%,se.mark%(0,i%))
  14758.         ENDIF
  14759.       ENDIF
  14760.     NEXT i%
  14761.   ENDIF
  14762. RETURN
  14763. ' Frequency
  14764. PROCEDURE se.sm_affsm_freq
  14765.   GOSUB cadre_int(orc%,ADD(ory%,80),13,59,13,13,14,12)
  14766.   GOSUB cadre_int(ADD(orc%,14),ADD(ory%,80),20,59,13,13,14,12)
  14767.   GOSUB cadre_int(ADD(orc%,35),ADD(ory%,80),13,59,13,13,14,12)
  14768.   GOSUB cadre_int(ADD(orc%,49),ADD(ory%,80),30,59,13,13,14,12)
  14769.   GOSUB affiche_bloc_icones_b(0,11,9,orc%,ory%)
  14770.   GOSUB affiche_bloc_icones_b(14,3,9,orc%,ory%)
  14771.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,8,9),5)),ADD(ory%,ADD(divbi&(1,8,9),2)),4,5,0,13,12,14)
  14772.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,8,9),13)),ADD(ory%,ADD(divbi&(1,8,9),2)),4,5,0,13,12,14)
  14773.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,9,9),5)),ADD(ory%,ADD(divbi&(1,9,9),2)),4,5,0,13,12,14)
  14774.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,9,9),13)),ADD(ory%,ADD(divbi&(1,9,9),2)),4,5,0,13,12,14)
  14775.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,10,9),5)),ADD(ory%,ADD(divbi&(1,10,9),2)),4,5,0,13,12,14)
  14776.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,10,9),13)),ADD(ory%,ADD(divbi&(1,10,9),2)),4,5,0,13,12,14)
  14777.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,14,9),6)),ADD(ory%,ADD(divbi&(1,14,9),2)),4,5,0,13,12,14)
  14778.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,15,9),6)),ADD(ory%,ADD(divbi&(1,15,9),2)),4,5,0,13,12,14)
  14779.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,16,9),9)),ADD(ory%,ADD(divbi&(1,16,9),2)),3,5,0,13,12,14)
  14780.   GOSUB affchaine_trans("RESAMPLE",ADD(SHL(orc%,1),2),ADD(ory%,82),14)
  14781.   GOSUB affchaine_trans("SHRINK/EXPND",ADD(SHL(orc%,1),2),ADD(ory%,107),14)
  14782.   GOSUB affchaine_trans("SAMPLE FREQUENCY",ADD(SHL(orc%,1),30),ADD(ory%,82),14)
  14783.   GOSUB affchaine_trans("SAMPLE NOTE  DISP:",ADD(SHL(orc%,1),30),ADD(ory%,107),14)
  14784.   GOSUB affchaine_trans("INTERPOLATION",ADD(SHL(orc%,1),71),ADD(ory%,82),14)
  14785.   GOSUB affchaine_trans("FFT     NOTE:",ADD(SHL(orc%,1),100),ADD(ory%,82),14)
  14786.   GOSUB affchaine_trans("DISPLAY",ADD(SHL(orc%,1),132),ADD(ory%,82),14)
  14787.   GOSUB affchaine_trans("WINDOW",ADD(SHL(orc%,1),132),ADD(ory%,107),14)
  14788.   GOSUB se.sm_actsm_freq
  14789.   GOSUB affiche_fft
  14790. RETURN
  14791. PROCEDURE se.sm_actsm_freq
  14792.   LOCAL a%,a$
  14793.   se.freq_fft_pend%=MIN(se.freq_fft_pend%,SHR(freq_buffer%,1))
  14794.   se.freq_fft_pstart%=MIN(se.freq_fft_pstart%,se.freq_fft_pend%)
  14795.   GOSUB affchaine_notrans(STR$(freq_buffer%,5),ADD(orc%,ADD(divbi&(0,8,9),5)),ADD(ory%,ADD(divbi&(1,8,9),2)),1)
  14796.   GOSUB affchaine_notrans(STR$(se.freq_nfe%,5),ADD(orc%,ADD(divbi&(0,8,9),13)),ADD(ory%,ADD(divbi&(1,8,9),2)),1)
  14797.   GOSUB affchaine_notrans(STR$(se.freq_ofn%,5),ADD(orc%,ADD(divbi&(0,10,9),5)),ADD(ory%,ADD(divbi&(1,10,9),2)),1)
  14798.   GOSUB affchaine_notrans(STR$(se.freq_nfn%,5),ADD(orc%,ADD(divbi&(0,10,9),13)),ADD(ory%,ADD(divbi&(1,10,9),2)),1)
  14799.   GOSUB affchaine_notrans(STR$(se.freq_fft_pstart%,5),ADD(orc%,ADD(divbi&(0,14,9),6)),ADD(ory%,ADD(divbi&(1,14,9),2)),1)
  14800.   GOSUB affchaine_notrans(STR$(se.freq_fft_pend%,5),ADD(orc%,ADD(divbi&(0,15,9),6)),ADD(ory%,ADD(divbi&(1,15,9),2)),1)
  14801.   GOSUB affchaine_notrans(STR$(se.freq_fft_pnbr%,4),ADD(orc%,ADD(divbi&(0,16,9),9)),ADD(ory%,ADD(divbi&(1,16,9),2)),1)
  14802.   a%=FN freq2note(se.freq_ofn%)
  14803.   a$=TRIM$(MID$(gamme2$,SUCC(SHL(ADD(a%,120) MOD 12,1)),2))+" "+STR$(SUB(DIV(a%,12),2))
  14804.   a$=SPACE$(SUB(5,LEN(a$)))+a$
  14805.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,9,9),5)),ADD(ory%,ADD(divbi&(1,9,9),2)),1)
  14806.   a%=FN freq2note(se.freq_nfn%)
  14807.   a$=TRIM$(MID$(gamme2$,SUCC(SHL(ADD(a%,120) MOD 12,1)),2))+" "+STR$(SUB(DIV(a%,12),2))
  14808.   a$=SPACE$(SUB(5,LEN(a$)))+a$
  14809.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,9,9),13)),ADD(ory%,ADD(divbi&(1,9,9),2)),1)
  14810.   GOSUB affiche_icone_b(11,9,orc%,ory%,se.freq_iptype%=0)       ! None
  14811.   GOSUB affiche_icone_b(12,9,orc%,ory%,se.freq_iptype%=1)       ! Linear
  14812.   GOSUB affiche_icone_b(13,9,orc%,ory%,se.freq_iptype%=2)       ! 3rd degree
  14813.   GOSUB affiche_icone_b(17,9,orc%,ory%,se.freq_fftdisp%=0)      ! Linear FFT disp
  14814.   GOSUB affiche_icone_b(18,9,orc%,ory%,se.freq_fftdisp%=1)      ! dB FFT disp
  14815.   GOSUB affiche_icone_b(19,9,orc%,ory%,se.freq_fftwin%=0)       ! Window : none
  14816.   GOSUB affiche_icone_b(20,9,orc%,ory%,se.freq_fftwin%=1)       ! Window : Blackman
  14817.   GOSUB affiche_icone_b(21,9,orc%,ory%,se.freq_fftnoteon!)      ! Voyant pour la visibilite de la note sur la FFT
  14818.   GOSUB affiche_icone_b(22,9,orc%,ory%,se.freq_fft_cflag!)      ! Voyant pour le calcul de la note lors de la FFT
  14819.   GOSUB grise_icone(13,9,orc%,ory%)
  14820.   SHOWM
  14821. RETURN
  14822. PROCEDURE se.sm_gere_freq               !!!
  14823.   ' Var locales de Sample_Editor :
  14824.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14825.   ' Utilise srt%, a%, b%, c%, d%, i%, a, flag_relachement!, aaaa$
  14826.   ~FRE(0)
  14827.   IF km%>0
  14828.     a%=V:divbi&(0,0,0)
  14829.     srt%=C:g_teste_icones%(L:a%,W:9,W:xm2%,W:ym2%)
  14830.     IF srt%>=0
  14831.       SELECT srt%
  14832.         ' Radio-boutons, Flip-flops ou champs de texte
  14833.         ' --------------------------------------------------------------------
  14834.       CASE 8                    ! Freq -> Freq
  14835.         IF SUB(SHR(xm2%,3),divbi&(0,8,9))<11
  14836.           GOSUB edite_chaine(STR$(freq_buffer%,5),ADD(orc%,ADD(divbi&(0,8,9),5)),ADD(ory%,ADD(divbi&(1,8,9),2)),5,2)
  14837.           IF VAL(bbbb$)>=2000 AND VAL(bbbb$)<=65535
  14838.             freq_buffer%=VAL(bbbb$)
  14839.             GOSUB affiche_sample
  14840.           ENDIF
  14841.         ELSE
  14842.           GOSUB edite_chaine(STR$(se.freq_nfe%,5),ADD(orc%,ADD(divbi&(0,8,9),13)),ADD(ory%,ADD(divbi&(1,8,9),2)),5,2)
  14843.           IF VAL(bbbb$)>=2000 AND VAL(bbbb$)<=65535
  14844.             se.freq_nfe%=VAL(bbbb$)
  14845.           ENDIF
  14846.         ENDIF
  14847.         GOSUB se.sm_actsm_freq
  14848.         ' --------------------------------------------------------------------
  14849.       CASE 9                    ! Note -> Note
  14850.         IF SUB(SHR(xm2%,3),divbi&(0,9,9))<11
  14851.           a%=FN freq2note(se.freq_ofn%)
  14852.           b%=5
  14853.         ELSE
  14854.           a%=FN freq2note(se.freq_nfn%)
  14855.           b%=13
  14856.         ENDIF
  14857.         a$=TRIM$(MID$(gamme2$,SUCC(SHL(ADD(a%,120) MOD 12,1)),2))+" "+STR$(SUB(DIV(a%,12),2))
  14858.         a$=SPACE$(SUB(5,LEN(a$)))+a$
  14859.         GOSUB edite_chaine(a$,ADD(orc%,ADD(divbi&(0,9,9),b%)),ADD(ory%,ADD(divbi&(1,9,9),2)),5,0)
  14860.         a%=1
  14861.         WHILE a%<=7
  14862.           EXIT IF INSTR(UPPER$(bbbb$),MID$("CDEFGAB",a%,1))<>0
  14863.           INC a%
  14864.         WEND
  14865.         IF a%<=7
  14866.           b%=SUB(VAL("$"+MID$("024579B",a%,1)),INSTR(bbbb$,"#")<>0)     ! Numero de la note
  14867.           a%=-2
  14868.           WHILE a%<=9
  14869.             EXIT IF INSTR(bbbb$,STR$(a%))<>0
  14870.             INC a%
  14871.           WEND
  14872.           IF a%<=9
  14873.             ADD b%,MUL(ADD(a%,2),12)
  14874.             a%=FN note2freq(b%)
  14875.             IF SUB(SHR(xm2%,3),divbi&(0,9,9))<11
  14876.               se.freq_ofn%=a%
  14877.             ELSE
  14878.               se.freq_nfn%=a%
  14879.             ENDIF
  14880.           ENDIF
  14881.         ENDIF
  14882.         GOSUB se.sm_actsm_freq
  14883.         ' --------------------------------------------------------------------
  14884.       CASE 10                   ! Freq note -> Freq note
  14885.         IF SUB(SHR(xm2%,3),divbi&(0,10,9))<11
  14886.           GOSUB edite_chaine(STR$(se.freq_ofn%,5),ADD(orc%,ADD(divbi&(0,10,9),5)),ADD(ory%,ADD(divbi&(1,10,9),2)),5,2)
  14887.           IF VAL(bbbb$)>8 AND VAL(bbbb$)<65535
  14888.             se.freq_ofn%=VAL(bbbb$)
  14889.           ENDIF
  14890.         ELSE
  14891.           GOSUB edite_chaine(STR$(se.freq_nfn%,5),ADD(orc%,ADD(divbi&(0,10,9),13)),ADD(ory%,ADD(divbi&(1,10,9),2)),5,2)
  14892.           IF VAL(bbbb$)>8 AND VAL(bbbb$)<65535
  14893.             se.freq_nfn%=VAL(bbbb$)
  14894.           ENDIF
  14895.         ENDIF
  14896.         GOSUB affiche_fft
  14897.         GOSUB se.sm_actsm_freq
  14898.         ' --------------------------------------------------------------------
  14899.       CASE 11 TO 13             ! Type d'interpolation
  14900.         se.freq_iptype%=MIN(SUB(srt%,11),1)     ! *** 3eme degre non encore disponible
  14901.         GOSUB se.sm_actsm_freq
  14902.         ' --------------------------------------------------------------------
  14903.       CASE 14                   ! FFT : Start
  14904.         GOSUB edite_chaine(STR$(se.freq_fft_pstart%,5),ADD(orc%,ADD(divbi&(0,14,9),6)),ADD(ory%,ADD(divbi&(1,14,9),2)),5,2)
  14905.         se.freq_fft_pstart%=MIN(se.freq_fft_pend%,MAX(0,VAL(bbbb$)))
  14906.         GOSUB se.sm_actsm_freq
  14907.         ' --------------------------------------------------------------------
  14908.       CASE 15                   ! FFT : End
  14909.         GOSUB edite_chaine(STR$(se.freq_fft_pend%,5),ADD(orc%,ADD(divbi&(0,15,9),6)),ADD(ory%,ADD(divbi&(1,15,9),2)),5,2)
  14910.         se.freq_fft_pend%=MAX(se.freq_fft_pstart%,MIN(SHR(freq_buffer%,1),VAL(bbbb$)))
  14911.         GOSUB se.sm_actsm_freq
  14912.         ' --------------------------------------------------------------------
  14913.       CASE 16                   ! FFT : Nbr of points
  14914.         GOSUB edite_chaine(STR$(se.freq_fft_pnbr%,5),ADD(orc%,ADD(divbi&(0,16,9),9)),ADD(ory%,ADD(divbi&(1,16,9),2)),4,2)
  14915.         se.freq_fft_pnbr%=MIN(1024,MAX(1,VAL(bbbb$)))
  14916.         GOSUB se.sm_actsm_freq
  14917.         ' --------------------------------------------------------------------
  14918.       CASE 17                   ! Affichage FFT lineaire
  14919.         se.freq_fftdisp%=0
  14920.         GOSUB affiche_fft
  14921.         GOSUB se.sm_actsm_freq
  14922.         ' --------------------------------------------------------------------
  14923.       CASE 18                   ! Affichage FFT logarithmique
  14924.         se.freq_fftdisp%=1
  14925.         GOSUB affiche_fft
  14926.         GOSUB se.sm_actsm_freq
  14927.         ' --------------------------------------------------------------------
  14928.       CASE 19                   ! Fenetrage FFT rectangulaire
  14929.         se.freq_fftwin%=0
  14930.         GOSUB se.sm_actsm_freq
  14931.         ' --------------------------------------------------------------------
  14932.       CASE 20                   ! Fenetrage FFT Blackman
  14933.         se.freq_fftwin%=1
  14934.         GOSUB se.sm_actsm_freq
  14935.         ' --------------------------------------------------------------------
  14936.       CASE 21                   ! Voyant pour la note sur la FFT
  14937.         se.freq_fftnoteon!=NOT se.freq_fftnoteon!
  14938.         GOSUB affiche_fft
  14939.         GOSUB se.sm_actsm_freq
  14940.         ' --------------------------------------------------------------------
  14941.       CASE 22                   ! Calcul note on/off
  14942.         se.freq_fft_cflag!=NOT se.freq_fft_cflag!
  14943.         GOSUB se.sm_actsm_freq
  14944.         ' --------------------------------------------------------------------
  14945.       DEFAULT
  14946.         ' Icones normales
  14947.         GOSUB affiche_icone_b(srt%,9,orc%,ory%,-1)
  14948.         GOSUB wait_mouse(TRUE)
  14949.         SELECT srt%
  14950.           ' ------------------------------------------------------------------
  14951.         CASE 0                  ! Convert
  14952.           IF km%=2      ! Si c'est le bouton droit, on change simplement la freq d'ech
  14953.             a%=DIV(MUL(freq_buffer%,se.freq_nfn%),se.freq_ofn%)
  14954.             IF a%<=65535 AND a%>=2000
  14955.               se.freq_nfe%=a%
  14956.               se.freq_ofn%=se.freq_nfn%
  14957.               GOSUB se.change_buffer_frequency(a%,TRUE)
  14958.             ENDIF
  14959.           ELSE
  14960.             a#=(se.freq_nfe%*se.freq_ofn%)/(freq_buffer%*se.freq_nfn%)     ! Rapport d'agrandissement
  14961.             a%=mark_len%
  14962.             b%=(a%*a#) AND -2
  14963.             IF a#>1
  14964.               GOSUB dialog("RESAMPLE","NEW SAMPLE TOO LONG","CLIP|OVERFLOW",xm%,ym%)
  14965.               IF bouton%=0      ! Clip
  14966.                 b%=mark_len%
  14967.               ELSE              ! Overflow
  14968.                 b%=MIN(b%,SUB(FN lon_buffer,mark_1%))
  14969.               ENDIF
  14970.               a%=(b%/a#) AND -2
  14971.             ENDIF
  14972.             GOSUB bee(TRUE)
  14973.             c%=ADD(FN adr_buffer,mark_1%)
  14974.             ~C:g_change_sample_frequency%(L:c%,L:c%,L:a%,L:b%,W:win_bits%,W:se.freq_iptype%)
  14975.             se.freq_ofn%=se.freq_nfn%
  14976.             mark_2%=ADD(mark_1%,mark_len%)
  14977.             mark_len%=b%
  14978.             GOSUB se.change_buffer_frequency(se.freq_nfe%,FALSE)
  14979.             GOSUB affiche_panneau_sample
  14980.           ENDIF
  14981.           ' ------------------------------------------------------------------
  14982.         CASE 1 TO 3             ! /2 /3 /4
  14983.           IF DIV(freq_buffer%,SUCC(srt%))>=2000
  14984.             se.freq_nfe%=DIV(freq_buffer%,SUCC(srt%))
  14985.             se.freq_nfn%=se.freq_ofn%
  14986.             GOSUB se.sm_actsm_freq
  14987.           ENDIF
  14988.           ' ------------------------------------------------------------------
  14989.         CASE 4 TO 6             ! x2 x3 x4
  14990.           IF MUL(freq_buffer%,SUB(srt%,2))<=65535
  14991.             se.freq_nfe%=MUL(freq_buffer%,SUB(srt%,2))
  14992.             se.freq_nfn%=se.freq_ofn%
  14993.             GOSUB se.sm_actsm_freq
  14994.           ENDIF
  14995.           ' ------------------------------------------------------------------
  14996.         CASE 7                  ! Do FFT
  14997.           IF km%=2                      ! Bouton droit : on reinitialise la gamme
  14998.             se.freq_fft_pstart%=0
  14999.             se.freq_fft_pend%=SHR(freq_buffer%,1)
  15000.           ENDIF
  15001.           GOSUB se.sm_actsm_freq
  15002.           GOSUB bee(TRUE)
  15003.           b%=ADD(FN adr_buffer,mark_1%)
  15004.           ' Fenetrage Blackman
  15005.           IF se.freq_fftwin%=1
  15006.             c%=FRE(0)
  15007.             IF mark_len%<SUB(c%,32768)
  15008.               c%=1
  15009.               DIM blackman%(SHR(mark_len%,2))
  15010.               a%=V:blackman%(0)
  15011.               IF win_bits%=2            ! 16 bits
  15012.                 a#=PI*4/SUB(mark_len%,2)
  15013.                 FOR i%=0 TO PRED(SHR(mark_len%,1))
  15014.                   INT{a%}=INT{b%}*(0.42-COS(i%*a#)*0.5+0.08*COS(SHL(i%,1)*a#))
  15015.                   ADD a%,2
  15016.                   ADD b%,2
  15017.                 NEXT i%
  15018.               ELSE                      ! 8 bits
  15019.                 a#=PI*2/PRED(mark_len%)
  15020.                 FOR i%=0 TO PRED(mark_len%)
  15021.                   d%=BYTE{b%}
  15022.                   IF d%>127
  15023.                     SUB d%,256
  15024.                   ENDIF
  15025.                   BYTE{a%}=d%*(0.42-COS(i%*a#)*0.5+0.08*COS(SHL(i%,1)*a#))
  15026.                   INC a%
  15027.                   INC b%
  15028.                 NEXT i%
  15029.               ENDIF
  15030.               b%=V:blackman%(0)
  15031.             ELSE
  15032.               c%=0
  15033.             ENDIF
  15034.           ELSE
  15035.             c%=0
  15036.           ENDIF
  15037.           ' Calcul proprement dit
  15038.           a%=FN se.sm_fft_tot(se.freq_fft_pstart%,se.freq_fft_pend%,freq_buffer%,se.freq_fft_pnbr%,b%,mark_len%,win_bits%,se.freq_fft_cflag!,TRUE)
  15039.           IF c%=1
  15040.             FOR i%=0 TO PRED(se.freq_fftlon%)
  15041.               fft&(i%)=MAX(MIN(fft&(i%)/0.42,&H7FFF),0)
  15042.             NEXT i%
  15043.             ERASE blackman%()
  15044.           ENDIF
  15045.           IF a%>0
  15046.             se.freq_ofn%=a%
  15047.           ENDIF
  15048.           GOSUB affiche_panneau_sample
  15049.           ' ------------------------------------------------------------------
  15050.         ENDSELECT
  15051.         GOSUB affiche_icone_b(srt%,9,orc%,ory%,0)
  15052.       ENDSELECT
  15053.       GOSUB wait_mouse(flag_relachement!)
  15054.       flag_relachement!=TRUE
  15055.       GOSUB vide_buffer_clavier
  15056.     ENDIF
  15057.   ENDIF
  15058. RETURN
  15059. ' Delay
  15060. PROCEDURE se.sm_affsm_delay
  15061.   ' Utilise i%
  15062.   GOSUB cadre_int(orc%,ADD(ory%,80),40,29,13,13,14,12)
  15063.   GOSUB cadre_int(ADD(orc%,41),ADD(ory%,80),38,49,13,13,14,12)
  15064.   GOSUB cadre_int(orc%,ADD(ory%,110),20,29,13,13,14,12)
  15065.   GOSUB cadre_int(ADD(orc%,21),ADD(ory%,110),7,29,13,13,14,12)
  15066.   GOSUB affiche_bloc_icones_b(0,30,10,orc%,ory%)
  15067.   FOR i%=0 TO 3
  15068.     GOSUB affchaine_trans(STR$(SUCC(i%)),ADD(SHL(orc%,1),84),ADD(ADD(ory%,87),MUL(i%,10)),14)
  15069.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,ADD(MUL(i%,3),1),10),11)),ADD(ory%,ADD(divbi&(1,ADD(MUL(i%,3),1),10),2)),4,5,0,13,12,14)
  15070.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,ADD(MUL(i%,3),2),10),6)),ADD(ory%,ADD(divbi&(1,ADD(MUL(i%,3),2),10),2)),4,5,0,13,12,14)
  15071.   NEXT i%
  15072.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,12,10),14)),ADD(ory%,ADD(divbi&(1,12,10),2)),1,5,0,13,12,14)
  15073.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,15,10),1)),ADD(ory%,ADD(divbi&(1,15,10),2)),27,5,0,13,12,14)
  15074.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,17,10),10)),ADD(ory%,ADD(divbi&(1,17,10),2)),4,5,0,13,12,14)
  15075.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,18,10),10)),ADD(ory%,ADD(divbi&(1,18,10),2)),4,5,0,13,12,14)
  15076.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,19,10),12)),ADD(ory%,ADD(divbi&(1,19,10),2)),4,5,0,13,12,14)
  15077.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,20,10),12)),ADD(ory%,ADD(divbi&(1,20,10),2)),4,5,0,13,12,14)
  15078.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,23,10),1)),ADD(ory%,ADD(divbi&(1,23,10),2)),4,5,0,13,12,14)
  15079.   GOSUB se.sm_actsm_delay
  15080. RETURN
  15081. PROCEDURE se.sm_actsm_delay
  15082.   ' Utilise aaaa$, i%
  15083.   se.delay_timefeed%=MIN(se.delay_timefeed%,SUB(FRE(0),16384)*1000/MUL(freq_buffer%,win_bits%))
  15084.   FOR i%=0 TO 3
  15085.     se.delaytime%(i%)=MIN(se.delaytime%(i%),SUB(FRE(0),16384)*1000/MUL(freq_buffer%,win_bits%))
  15086.     GOSUB affiche_icone_b(MUL(i%,3),10,orc%,ory%,BTST(se.delay_flags%,i%))
  15087.     GOSUB affchaine_notrans(STR$(se.delaytime%(i%),5),ADD(orc%,ADD(divbi&(0,ADD(MUL(i%,3),1),10),11)),ADD(ory%,ADD(divbi&(1,ADD(MUL(i%,3),1),10),2)),1)
  15088.     GOSUB affchaine_notrans(FN pourcent$(se.delaylevel%(i%),32768),ADD(orc%,ADD(divbi&(0,ADD(MUL(i%,3),2),10),6)),ADD(ory%,ADD(divbi&(1,ADD(MUL(i%,3),2),10),2)),1)
  15089.   NEXT i%
  15090.   GOSUB affchaine_notrans(FN pourcent$(se.delay_feedback%,32768),ADD(orc%,ADD(divbi&(0,17,10),10)),ADD(ory%,ADD(divbi&(1,17,10),2)),1)
  15091.   GOSUB affchaine_notrans(STR$(se.delay_timefeed%,5),ADD(orc%,ADD(divbi&(0,18,10),10)),ADD(ory%,ADD(divbi&(1,18,10),2)),1)
  15092.   GOSUB affchaine_notrans(FN pourcent$(se.delay_dry%,32768),ADD(orc%,ADD(divbi&(0,19,10),12)),ADD(ory%,ADD(divbi&(1,19,10),2)),1)
  15093.   GOSUB affchaine_notrans(FN pourcent$(se.delay_wet%,32768),ADD(orc%,ADD(divbi&(0,20,10),12)),ADD(ory%,ADD(divbi&(1,20,10),2)),1)
  15094.   GOSUB affchaine_notrans(STR$(se.delay_mutein%,5),ADD(orc%,ADD(divbi&(0,23,10),1)),ADD(ory%,ADD(divbi&(1,23,10),2)),1)
  15095.   IF se.delay_source%=0
  15096.     GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,12,10),14)),ADD(ory%,ADD(divbi&(1,12,10),2)),1)
  15097.     aaaa$="Block                       "
  15098.   ELSE
  15099.     GOSUB affchaine_notrans(HEX$(se.delay_source%,2),ADD(orc%,ADD(divbi&(0,12,10),14)),ADD(ory%,ADD(divbi&(1,12,10),2)),1)
  15100.     aaaa$=FN samplename$(se.delay_source%)
  15101.   ENDIF
  15102.   GOSUB affchaine_notrans(aaaa$,ADD(orc%,ADD(divbi&(0,15,10),1)),ADD(ory%,ADD(divbi&(1,15,10),2)),1)
  15103.   GOSUB affiche_icone_b(21,10,orc%,ory%,se.delay_flags% AND &H10)
  15104.   GOSUB affiche_icone_b(22,10,orc%,ory%,se.delay_flags% AND &H20)
  15105.   SHOWM
  15106. RETURN
  15107. PROCEDURE se.sm_gere_delay
  15108.   ' Var locales de Sample_Editor :
  15109.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15110.   ' Utilise srt%, a%, b%, c%, aaaa$, flag_relachement!
  15111.   ~FRE(0)
  15112.   IF km%>0
  15113.     a%=V:divbi&(0,0,0)
  15114.     srt%=C:g_teste_icones%(L:a%,W:10,W:xm2%,W:ym2%)
  15115.     IF srt%>=0
  15116.       SELECT srt%
  15117.         ' Radio-boutons, Flip-flops ou champs de texte
  15118.         ' --------------------------------------------------------------------
  15119.       CASE 0,3,6,9              ! Tap On/Off
  15120.         se.delay_flags%=se.delay_flags% XOR SHL(1,DIV(srt%,3))
  15121.         GOSUB se.sm_actsm_delay
  15122.         ' --------------------------------------------------------------------
  15123.       CASE 1,4,7,10             ! Tap delay time
  15124.         a%=DIV(PRED(srt%),3)
  15125.         GOSUB edite_chaine(STR$(se.delaytime%(a%),5),ADD(orc%,ADD(divbi&(0,srt%,10),11)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,2)
  15126.         se.delaytime%(a%)=MAX(VAL(bbbb$),0)
  15127.         GOSUB se.sm_actsm_delay
  15128.         ' --------------------------------------------------------------------
  15129.       CASE 2,5,8,11             ! Tap level
  15130.         a%=DIV(SUB(srt%,2),3)
  15131.         GOSUB edite_chaine(FN pourcent$(se.delaylevel%(a%),32768),ADD(orc%,ADD(divbi&(0,srt%,10),6)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,3)
  15132.         se.delaylevel%(a%)=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  15133.         GOSUB se.sm_actsm_delay
  15134.         ' --------------------------------------------------------------------
  15135.       CASE 12                   ! Sample source
  15136.         IF km%=1
  15137.           GOSUB edite_chaine(HEX$(se.delay_source%,2),ADD(orc%,ADD(divbi&(0,srt%,10),14)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),2,0)
  15138.           se.delay_source%=VAL("$"+bbbb$)
  15139.         ELSE
  15140.           se.delay_source%=sample%
  15141.         ENDIF
  15142.         GOSUB se.sm_actsm_delay
  15143.         ' --------------------------------------------------------------------
  15144.       CASE 13,14                ! Sample source +/-
  15145.         se.delay_source%=MAX(MIN(ADD(se.delay_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,13),km%))),255),0)
  15146.         GOSUB se.sm_actsm_delay
  15147.         IF km%=1
  15148.           PAUSE 4
  15149.         ENDIF
  15150.         flag_relachement!=FALSE
  15151.         ' --------------------------------------------------------------------
  15152.       CASE 17                   ! Feedback
  15153.         GOSUB edite_chaine(FN pourcent$(se.delay_feedback%,32768),ADD(orc%,ADD(divbi&(0,srt%,10),10)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,3)
  15154.         se.delay_feedback%=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  15155.         GOSUB se.sm_actsm_delay
  15156.         ' --------------------------------------------------------------------
  15157.       CASE 18                   ! Time Feed
  15158.         GOSUB edite_chaine(STR$(se.delay_timefeed%,5),ADD(orc%,ADD(divbi&(0,srt%,10),10)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,2)
  15159.         se.delay_timefeed%=MAX(VAL(bbbb$),1)
  15160.         GOSUB se.sm_actsm_delay
  15161.         ' --------------------------------------------------------------------
  15162.       CASE 19                   ! Dry level
  15163.         GOSUB edite_chaine(FN pourcent$(se.delay_dry%,32768),ADD(orc%,ADD(divbi&(0,srt%,10),12)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,3)
  15164.         se.delay_dry%=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  15165.         GOSUB se.sm_actsm_delay
  15166.         ' --------------------------------------------------------------------
  15167.       CASE 20                   ! Wet level
  15168.         GOSUB edite_chaine(FN pourcent$(se.delay_wet%,32768),ADD(orc%,ADD(divbi&(0,srt%,10),12)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,3)
  15169.         se.delay_wet%=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  15170.         GOSUB se.sm_actsm_delay
  15171.         ' --------------------------------------------------------------------
  15172.       CASE 21                   ! Multi-tap mode
  15173.         se.delay_flags%=se.delay_flags% XOR &H10
  15174.         GOSUB se.sm_actsm_delay
  15175.         ' --------------------------------------------------------------------
  15176.       CASE 22                   ! Mute in On/Off
  15177.         se.delay_flags%=se.delay_flags% XOR &H20
  15178.         GOSUB se.sm_actsm_delay
  15179.         ' --------------------------------------------------------------------
  15180.       CASE 23                   ! Mute in : Time
  15181.         GOSUB edite_chaine(STR$(se.delay_mutein%,5),ADD(orc%,ADD(divbi&(0,srt%,10),1)),ADD(ory%,ADD(divbi&(1,srt%,10),2)),5,2)
  15182.         se.delay_mutein%=MAX(VAL(bbbb$),0)
  15183.         GOSUB se.sm_actsm_delay
  15184.         ' --------------------------------------------------------------------
  15185.       CASE 15                   ! Indicateur du nom du sample : rien...
  15186.         ' --------------------------------------------------------------------
  15187.       DEFAULT
  15188.         ' Icones normales
  15189.         GOSUB affiche_icone_b(srt%,10,orc%,ory%,-1)
  15190.         GOSUB wait_mouse(TRUE)
  15191.         SELECT srt%
  15192.           ' ------------------------------------------------------------------
  15193.         CASE 24 TO 29           ! Presets 1-6
  15194.           a%=SUCC(MUL(SUB(srt%,24),4))
  15195.           se.delay_feedback%=DIV(MUL(32768,VAL(MID$("70  50  20  50  70  95",a%,4))),100)
  15196.           se.delay_timefeed%=VAL(MID$("150 500 1000500 800 10",a%,4))
  15197.           se.delay_dry%=MUL(32768,-(srt%<>28))
  15198.           se.delay_wet%=DIV(MUL(32768,VAL(MID$("30  30  30  20  100 95",a%,4))),100)
  15199.           se.delay_flags%=&H0
  15200.           IF srt%=27
  15201.             se.delay_flags%=&H11
  15202.             se.delaytime%(0)=1200
  15203.             se.delaylevel%(0)=32768
  15204.           ELSE IF srt%=28
  15205.             se.delay_flags%=&H1F
  15206.             se.delaytime%(0)=0
  15207.             se.delaylevel%(0)=32768
  15208.             se.delaytime%(1)=200
  15209.             se.delaylevel%(1)=16384
  15210.             se.delaytime%(2)=400
  15211.             se.delaylevel%(2)=9830
  15212.             se.delaytime%(3)=600
  15213.             se.delaylevel%(3)=6553
  15214.           ENDIF
  15215.           GOSUB se.sm_actsm_delay
  15216.           ' ------------------------------------------------------------------
  15217.         CASE 16                 ! Do
  15218.           GOSUB se.sm_actsm_delay
  15219.           ' sjx - merely as a convenient symbol for debugging, may be removed after testing
  15220.         delayt:
  15221.           IF (NOT BTST(se.delay_flags%,4)) OR (se.delay_flags% AND &HF)
  15222.             GOSUB bee(TRUE)
  15223.             a%=SHL(INT(se.delay_timefeed%*freq_buffer%/1000),1)
  15224.             b%=a%
  15225.             FOR i%=0 TO 3
  15226.               IF BTST(se.delay_flags%,i%) AND BTST(se.delay_flags%,4)
  15227.                 b%=MAX(b%,SHL(INT(se.delaytime%(i%)*freq_buffer%/1000),1))
  15228.               ENDIF
  15229.             NEXT i%
  15230.             SUB b%,a%
  15231.             DIM dlybuf%(SHR(ADD(a%,MAX(b%,2)),2))
  15232.             aaaa$=STRING$(48,0)
  15233.             IF se.delay_source%=0
  15234.               LONG{V:aaaa$}=ADD(FN adr_buffer,mark_1%)
  15235.               LONG{ADD(V:aaaa$,16)}=mark_len%
  15236.               BYTE{ADD(V:aaaa$,44)}=win_bits%
  15237.             ELSE
  15238.               LONG{V:aaaa$}=FN adresse(se.delay_source%)
  15239.               LONG{ADD(V:aaaa$,16)}=FN length(se.delay_source%)
  15240.               BYTE{ADD(V:aaaa$,44)}=FN resol(se.delay_source%)
  15241.             ENDIF
  15242.             LONG{ADD(V:aaaa$,4)}=ADD(FN adr_buffer,mark_1%)
  15243.             LONG{ADD(V:aaaa$,8)}=V:dlybuf%(0)
  15244.             LONG{ADD(V:aaaa$,12)}=ADD(V:dlybuf%(0),SUCC(a%) AND -2)
  15245.             LONG{ADD(V:aaaa$,20)}=mark_len%
  15246.             LONG{ADD(V:aaaa$,24)}=SHL(se.delay_feedback%,1)
  15247.             LONG{ADD(V:aaaa$,28)}=a%
  15248.             LONG{ADD(V:aaaa$,32)}=b%
  15249.             LONG{ADD(V:aaaa$,36)}=SHL(se.delay_dry%,1)
  15250.             IF BTST(se.delay_flags%,5)
  15251.               LONG{ADD(V:aaaa$,40)}=INT(se.delay_mutein%*freq_buffer%/1000)
  15252.             ELSE
  15253.               LONG{ADD(V:aaaa$,40)}=&H7FFFFFFF
  15254.             ENDIF
  15255.             BYTE{ADD(V:aaaa$,45)}=win_bits%
  15256.             IF BTST(se.delay_flags%,4)
  15257.               c%=0
  15258.               FOR i%=0 TO 3
  15259.                 IF BTST(se.delay_flags%,i%)
  15260.                   aaaa$=aaaa$+MKL$(SHL(INT(se.delaytime%(i%)*freq_buffer%/1000),1))+MKL$(se.delaylevel%(i%)*se.delay_wet%/16384)
  15261.                   INC c%
  15262.                 ENDIF
  15263.               NEXT i%
  15264.               CARD{ADD(V:aaaa$,46)}=c%
  15265.             ELSE
  15266.               CARD{ADD(V:aaaa$,46)}=1
  15267.               aaaa$=aaaa$+MID$(aaaa$,29,4)+MKL$(SHL(se.delay_wet%,1))
  15268.             ENDIF
  15269.             GOSUB affiche_panneau_progression("Please wait...",LONG{ADD(V:aaaa$,16)},-1,-1)
  15270.             c%=V:aaaa$
  15271.             ' sjx - again, merely to aid debugging, may be got rid of afterwards (careful of residue)
  15272.           delayt2:
  15273.             ~C:g_fx_delay%(L:c%)
  15274.             WHILE LONG{g_progression_pos%}<LONG{g_progression_len%}
  15275.               GOSUB affiche_progression(LONG{g_progression_pos%})
  15276.               ~C:g_fx_delay%(L:0)
  15277.             WEND
  15278.             ERASE dlybuf%()
  15279.             GOSUB affiche_panneau_sample
  15280.           ENDIF
  15281.           ' ------------------------------------------------------------------
  15282.         ENDSELECT
  15283.         GOSUB affiche_icone_b(srt%,10,orc%,ory%,0)
  15284.       ENDSELECT
  15285.       GOSUB wait_mouse(flag_relachement!)
  15286.       flag_relachement!=TRUE
  15287.       GOSUB vide_buffer_clavier
  15288.     ENDIF
  15289.   ENDIF
  15290. RETURN
  15291. ' Flanger
  15292. PROCEDURE se.sm_affsm_flanger
  15293.   IF ss_menu2.fl%=2
  15294.     GOSUB se.sm_affsm_flanger2
  15295.   ELSE
  15296.     GOSUB cadre_int(orc%,ADD(ory%,80),15,59,13,13,14,12)
  15297.     GOSUB cadre_int(ADD(orc%,16),ADD(ory%,80),21,59,13,13,14,12)
  15298.     GOSUB cadre_int(ADD(orc%,38),ADD(ory%,80),21,59,13,13,14,12)
  15299.     GOSUB cadre_int(ADD(orc%,60),ADD(ory%,80),19,29,13,13,14,12)
  15300.     GOSUB affiche_bloc_icones_b(0,16,19,orc%,ory%)
  15301.     GOSUB affchaine_trans("FLANGER",ADD(SHL(orc%,1),2),ADD(ory%,87),14)
  15302.     GOSUB affchaine_trans("MIX",ADD(SHL(orc%,1),34),ADD(ory%,87),14)
  15303.     GOSUB affchaine_trans("PARAMETERS",ADD(SHL(orc%,1),78),ADD(ory%,87),14)
  15304.     GOSUB affchaine_trans("PRESETS",ADD(SHL(orc%,1),122),ADD(ory%,87),14)
  15305.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,4,19),13)),ADD(ory%,ADD(divbi&(1,4,19),2)),4,5,0,13,12,14)
  15306.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,5,19),13)),ADD(ory%,ADD(divbi&(1,5,19),2)),4,5,0,13,12,14)
  15307.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,6,19),12)),ADD(ory%,ADD(divbi&(1,6,19),2)),4,5,0,13,12,14)
  15308.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,7,19),12)),ADD(ory%,ADD(divbi&(1,7,19),2)),4,5,0,13,12,14)
  15309.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,8,19),13)),ADD(ory%,ADD(divbi&(1,8,19),2)),3,5,0,13,12,14)
  15310.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,9,19),12)),ADD(ory%,ADD(divbi&(1,9,19),2)),4,5,0,13,12,14)
  15311.     GOSUB se.sm_actsm_flanger
  15312.   ENDIF
  15313. RETURN
  15314. PROCEDURE se.sm_actsm_flanger
  15315.   ' Var locales de Sample_Editor utilisees:
  15316.   ' i%
  15317.   IF ss_menu2.fl%=2
  15318.     GOSUB se.sm_actsm_flanger2
  15319.   ELSE
  15320.     GOSUB affchaine_notrans(FN pourcent$(se.flanger_dry%,32768),ADD(orc%,ADD(divbi&(0,4,19),13)),ADD(ory%,ADD(divbi&(1,4,19),2)),1)
  15321.     GOSUB affchaine_notrans(FN pourcent$(se.flanger_wet%,32768),ADD(orc%,ADD(divbi&(0,5,19),13)),ADD(ory%,ADD(divbi&(1,5,19),2)),1)
  15322.     GOSUB affchaine_notrans(STR$(se.flanger_time%/1000,5),ADD(orc%,ADD(divbi&(0,6,19),12)),ADD(ory%,ADD(divbi&(1,6,19),2)),1)
  15323.     GOSUB affchaine_notrans(STR$(se.flanger_freq%/1000,5),ADD(orc%,ADD(divbi&(0,7,19),12)),ADD(ory%,ADD(divbi&(1,7,19),2)),1)
  15324.     GOSUB affchaine_notrans(STR$(se.flanger_depth%/1000,4),ADD(orc%,ADD(divbi&(0,8,19),13)),ADD(ory%,ADD(divbi&(1,8,19),2)),1)
  15325.     GOSUB affchaine_notrans(STR$(se.flanger_phase%/2048+0.000488,5),ADD(orc%,ADD(divbi&(0,9,19),12)),ADD(ory%,ADD(divbi&(1,9,19),2)),1)
  15326.     FOR i%=10 TO 15
  15327.       GOSUB grise_icone(i%,19,orc%,ory%)
  15328.     NEXT i%
  15329.   ENDIF
  15330. RETURN
  15331. PROCEDURE se.sm_gere_flanger
  15332.   ' Var locales de Sample_Editor :
  15333.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15334.   ' Utilise srt%, a%, b%, c%, i%, j%, a$, b$, aaaa$, flag_relachement!
  15335.   ~FRE(0)
  15336.   IF ss_menu2.fl%=2
  15337.     GOSUB se.sm_gere_flanger2
  15338.   ELSE
  15339.     IF km%>0
  15340.       a%=V:divbi&(0,0,0)
  15341.       srt%=C:g_teste_icones%(L:a%,W:19,W:xm2%,W:ym2%)
  15342.       IF srt%>=0
  15343.         SELECT srt%
  15344.           ' Radio-boutons, Flip-flops ou champs de texte
  15345.           ' ------------------------------------------------------------------
  15346.         CASE 4          ! Dry level
  15347.           GOSUB edite_chaine(FN pourcent$(se.flanger_dry%,32768),ADD(orc%,ADD(divbi&(0,4,19),13)),ADD(ory%,ADD(divbi&(1,4,19),2)),5,3)
  15348.           se.flanger_dry%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15349.           GOSUB se.sm_actsm_flanger
  15350.           ' ------------------------------------------------------------------
  15351.         CASE 5          ! Flange level
  15352.           GOSUB edite_chaine(FN pourcent$(se.flanger_wet%,32768),ADD(orc%,ADD(divbi&(0,5,19),13)),ADD(ory%,ADD(divbi&(1,5,19),2)),5,3)
  15353.           se.flanger_wet%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15354.           GOSUB se.sm_actsm_flanger
  15355.           ' ------------------------------------------------------------------
  15356.         CASE 6          ! Flange time
  15357.           GOSUB edite_chaine(STR$(se.flanger_time%/1000,5),ADD(orc%,ADD(divbi&(0,6,19),12)),ADD(ory%,ADD(divbi&(1,6,19),2)),5,3)
  15358.           se.flanger_time%=MIN(MAX(VAL(bbbb$)*1000,0),50000)
  15359.           GOSUB se.sm_actsm_flanger
  15360.           ' ------------------------------------------------------------------
  15361.         CASE 7          ! Flange freq
  15362.           GOSUB edite_chaine(STR$(se.flanger_freq%/1000,5),ADD(orc%,ADD(divbi&(0,7,19),12)),ADD(ory%,ADD(divbi&(1,7,19),2)),5,3)
  15363.           se.flanger_freq%=MIN(MAX(VAL(bbbb$)*1000,0),50000)
  15364.           GOSUB se.sm_actsm_flanger
  15365.           ' ------------------------------------------------------------------
  15366.         CASE 8          ! Flange depth
  15367.           GOSUB edite_chaine(STR$(se.flanger_depth%/1000,4),ADD(orc%,ADD(divbi&(0,8,19),13)),ADD(ory%,ADD(divbi&(1,8,19),2)),4,3)
  15368.           se.flanger_depth%=MIN(MAX(VAL(bbbb$)*1000,0),99999)
  15369.           GOSUB se.sm_actsm_flanger
  15370.           ' ------------------------------------------------------------------
  15371.         CASE 9          ! Init phase
  15372.           GOSUB edite_chaine(STR$(se.flanger_phase%/2048+0.000488,5),ADD(orc%,ADD(divbi&(0,9,19),12)),ADD(ory%,ADD(divbi&(1,9,19),2)),5,3)
  15373.           se.flanger_phase%=MIN(MAX(VAL(bbbb$)*2048,0),4095)
  15374.           GOSUB se.sm_actsm_flanger
  15375.           ' ------------------------------------------------------------------
  15376.         DEFAULT
  15377.           ' Icones normales
  15378.           GOSUB affiche_icone_b(srt%,19,orc%,ory%,-1)
  15379.           GOSUB wait_mouse(TRUE)
  15380.           SELECT srt%
  15381.             ' ----------------------------------------------------------------
  15382.           CASE 0        ! 2nd page
  15383.             ss_menu2.fl%=2
  15384.             ' ----------------------------------------------------------------
  15385.           CASE 1,2,3    ! Calcul
  15386.             IF se.flanger_stereo!
  15387.               GOSUB se.sm_do_flanger(srt%)
  15388.             ELSE
  15389.               GOSUB se.sm_do_flanger(0)
  15390.             ENDIF
  15391.             GOSUB affiche_panneau_sample
  15392.             ' ----------------------------------------------------------------
  15393.           CASE 10 TO 15 ! Presets
  15394.             '
  15395.             '
  15396.             '
  15397.             '
  15398.             ' ----------------------------------------------------------------
  15399.           ENDSELECT
  15400.           GOSUB affiche_icone_b(srt%,19,orc%,ory%,0)
  15401.         ENDSELECT
  15402.         GOSUB wait_mouse(flag_relachement!)
  15403.         flag_relachement!=TRUE
  15404.         GOSUB vide_buffer_clavier
  15405.         IF ss_menu2.fl%<>1
  15406.           GOSUB sample_editor.affiche_sm
  15407.         ENDIF
  15408.       ENDIF
  15409.     ENDIF
  15410.   ENDIF
  15411. RETURN
  15412. PROCEDURE se.sm_affsm_flanger2
  15413.   GOSUB cadre_int(orc%,ADD(ory%,80),51,29,13,13,14,12)
  15414.   GOSUB cadre_int(orc%,ADD(ory%,110),51,29,13,13,14,12)
  15415.   GOSUB cadre_int(ADD(orc%,52),ADD(ory%,80),13,59,13,13,14,12)
  15416.   GOSUB cadre_int(ADD(orc%,66),ADD(ory%,80),13,29,13,13,14,12)
  15417.   GOSUB affiche_bloc_icones_b(0,13,20,orc%,ory%)
  15418.   GOSUB affchaine_trans("FEEDBACK",ADD(SHL(orc%,1),3),ADD(ory%,97),14)
  15419.   GOSUB affchaine_trans("FEEDBACK",ADD(SHL(orc%,1),3),ADD(ory%,127),14)
  15420.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,1,20),13)),ADD(ory%,ADD(divbi&(1,1,20),2)),1,5,0,13,12,14)
  15421.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,4,20),1)),ADD(ory%,ADD(divbi&(1,4,20),2)),27,5,0,13,12,14)
  15422.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,5,20),13)),ADD(ory%,ADD(divbi&(1,5,20),2)),1,5,0,13,12,14)
  15423.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,8,20),1)),ADD(ory%,ADD(divbi&(1,8,20),2)),27,5,0,13,12,14)
  15424.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,9,20),14)),ADD(ory%,ADD(divbi&(1,9,20),2)),4,5,0,13,12,14)
  15425.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,10,20),13)),ADD(ory%,ADD(divbi&(1,10,20),2)),4,5,0,13,12,14)
  15426.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,11,20),14)),ADD(ory%,ADD(divbi&(1,11,20),2)),4,5,0,13,12,14)
  15427.   GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,12,20),13)),ADD(ory%,ADD(divbi&(1,12,20),2)),4,5,0,13,12,14)
  15428.   GOSUB se.sm_actsm_flanger2
  15429. RETURN
  15430. PROCEDURE se.sm_actsm_flanger2
  15431.   GOSUB affchaine_notrans(FN pourcent$(se.flanger_fdbkll%,32768),ADD(orc%,ADD(divbi&(0,9,20),14)),ADD(ory%,ADD(divbi&(1,9,20),2)),1)
  15432.   IF se.flanger_lsource%>0
  15433.     a$=HEX$(se.flanger_lsource%,2)
  15434.     b$=FN samplename$(se.flanger_lsource%)
  15435.   ELSE
  15436.     a$="  "
  15437.     b$="Block"+SPACE$(23)
  15438.   ENDIF
  15439.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,1,20),13)),ADD(ory%,ADD(divbi&(1,1,20),2)),1)
  15440.   GOSUB affchaine_notrans(b$,ADD(orc%,ADD(divbi&(0,4,20),1)),ADD(ory%,ADD(divbi&(1,4,20),2)),1)
  15441.   IF se.flanger_stereo!
  15442.     GOSUB affchaine_notrans(FN pourcent$(se.flanger_fdbklr%,32768),ADD(orc%,ADD(divbi&(0,10,20),13)),ADD(ory%,ADD(divbi&(1,10,20),2)),1)
  15443.     GOSUB affchaine_notrans(FN pourcent$(se.flanger_fdbkrr%,32768),ADD(orc%,ADD(divbi&(0,11,20),14)),ADD(ory%,ADD(divbi&(1,11,20),2)),1)
  15444.     GOSUB affchaine_notrans(FN pourcent$(se.flanger_fdbkrl%,32768),ADD(orc%,ADD(divbi&(0,12,20),13)),ADD(ory%,ADD(divbi&(1,12,20),2)),1)
  15445.     IF se.flanger_rsource%>0
  15446.       a$=HEX$(se.flanger_rsource%,2)
  15447.       b$=FN samplename$(se.flanger_rsource%)
  15448.     ELSE
  15449.       a$="  "
  15450.       b$="Block"+SPACE$(23)
  15451.     ENDIF
  15452.   ELSE
  15453.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,10,20),13)),ADD(ory%,ADD(divbi&(1,10,20),2)),1)
  15454.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,11,20),14)),ADD(ory%,ADD(divbi&(1,11,20),2)),1)
  15455.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,12,20),13)),ADD(ory%,ADD(divbi&(1,12,20),2)),1)
  15456.     a$="  "
  15457.     b$=SPACE$(28)
  15458.   ENDIF
  15459.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,5,20),13)),ADD(ory%,ADD(divbi&(1,5,20),2)),1)
  15460.   GOSUB affchaine_notrans(b$,ADD(orc%,ADD(divbi&(0,8,20),1)),ADD(ory%,ADD(divbi&(1,8,20),2)),1)
  15461.   GOSUB affiche_icone_b(13,20,orc%,ory%,NOT se.flanger_stereo!)
  15462.   GOSUB affiche_icone_b(14,20,orc%,ory%,se.flanger_stereo!)
  15463.   FOR i%=0 TO 4
  15464.     GOSUB affiche_icone_b(ADD(i%,15),20,orc%,ory%,se.flanger_wave%=i%)
  15465.   NEXT i%
  15466. RETURN
  15467. PROCEDURE se.sm_gere_flanger2
  15468.   ' Var locales de Sample_Editor :
  15469.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15470.   ' Utilise srt%, a%, b%, c%, aaaa$, flag_relachement!
  15471.   ~FRE(0)
  15472.   IF km%>0
  15473.     a%=V:divbi&(0,0,0)
  15474.     srt%=C:g_teste_icones%(L:a%,W:20,W:xm2%,W:ym2%)
  15475.     IF srt%>=0
  15476.       SELECT srt%
  15477.         ' Radio-boutons, Flip-flops ou champs de texte
  15478.         ' --------------------------------------------------------------------
  15479.       CASE 1            ! Numero du sample gauche
  15480.         IF km%=1
  15481.           GOSUB edite_chaine(HEX$(se.flanger_lsource%,2),ADD(orc%,ADD(divbi&(0,1,20),13)),ADD(ory%,ADD(divbi&(1,1,20),2)),2,1)
  15482.           se.flanger_lsource%=VAL("$"+bbbb$)
  15483.         ELSE
  15484.           se.flanger_lsource%=sample%
  15485.         ENDIF
  15486.         GOSUB se.sm_actsm_flanger2
  15487.         ' --------------------------------------------------------------------
  15488.       CASE 2,3          ! Sample gauche +/-
  15489.         se.flanger_lsource%=MAX(MIN(ADD(se.flanger_lsource%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,2),km%))),255),0)
  15490.         GOSUB se.sm_actsm_flanger2
  15491.         IF km%=1
  15492.           PAUSE 8
  15493.         ENDIF
  15494.         flag_relachement!=FALSE
  15495.         ' --------------------------------------------------------------------
  15496.       CASE 5            ! Numero du sample droit
  15497.         IF km%=1
  15498.           GOSUB edite_chaine(HEX$(se.flanger_rsource%,2),ADD(orc%,ADD(divbi&(0,5,20),13)),ADD(ory%,ADD(divbi&(1,5,20),2)),2,1)
  15499.           se.flanger_rsource%=VAL("$"+bbbb$)
  15500.         ELSE
  15501.           se.flanger_rsource%=sample%
  15502.         ENDIF
  15503.         GOSUB se.sm_actsm_flanger2
  15504.         ' --------------------------------------------------------------------
  15505.       CASE 6,7          ! Sample droit +/-
  15506.         se.flanger_rsource%=MAX(MIN(ADD(se.flanger_rsource%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,6),km%))),255),0)
  15507.         GOSUB se.sm_actsm_flanger2
  15508.         IF km%=1
  15509.           PAUSE 8
  15510.         ENDIF
  15511.         flag_relachement!=FALSE
  15512.         ' --------------------------------------------------------------------
  15513.       CASE 9            ! Feedback L -> L
  15514.         GOSUB edite_chaine(FN pourcent$(se.flanger_fdbkll%,32768),ADD(orc%,ADD(divbi&(0,9,20),14)),ADD(ory%,ADD(divbi&(1,9,20),2)),5,3)
  15515.         se.flanger_fdbkll%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15516.         GOSUB se.sm_actsm_flanger2
  15517.         ' --------------------------------------------------------------------
  15518.       CASE 10           ! Feedback L -> R
  15519.         GOSUB edite_chaine(FN pourcent$(se.flanger_fdbklr%,32768),ADD(orc%,ADD(divbi&(0,10,20),13)),ADD(ory%,ADD(divbi&(1,10,20),2)),5,3)
  15520.         se.flanger_fdbklr%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15521.         GOSUB se.sm_actsm_flanger2
  15522.         ' --------------------------------------------------------------------
  15523.       CASE 11           ! Feedback R -> R
  15524.         GOSUB edite_chaine(FN pourcent$(se.flanger_fdbkrr%,32768),ADD(orc%,ADD(divbi&(0,11,20),14)),ADD(ory%,ADD(divbi&(1,11,20),2)),5,3)
  15525.         se.flanger_fdbkrr%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15526.         GOSUB se.sm_actsm_flanger2
  15527.         ' --------------------------------------------------------------------
  15528.       CASE 12           ! Feedback R -> L
  15529.         GOSUB edite_chaine(FN pourcent$(se.flanger_fdbkrl%,32768),ADD(orc%,ADD(divbi&(0,12,20),13)),ADD(ory%,ADD(divbi&(1,12,20),2)),5,3)
  15530.         se.flanger_fdbkrl%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15531.         GOSUB se.sm_actsm_flanger2
  15532.         ' --------------------------------------------------------------------
  15533.       CASE 13           ! Mono
  15534.         se.flanger_stereo!=FALSE
  15535.         GOSUB se.sm_actsm_flanger2
  15536.         ' --------------------------------------------------------------------
  15537.       CASE 14           ! Stereo
  15538.         se.flanger_stereo!=TRUE
  15539.         GOSUB se.sm_actsm_flanger2
  15540.         ' --------------------------------------------------------------------
  15541.       CASE 15 TO 19     ! Type d'onde
  15542.         se.flanger_wave%=SUB(srt%,15)
  15543.         GOSUB se.sm_actsm_flanger2
  15544.         ' --------------------------------------------------------------------
  15545.       DEFAULT
  15546.         ' Icones normales
  15547.         GOSUB affiche_icone_b(srt%,20,orc%,ory%,-1)
  15548.         GOSUB wait_mouse(TRUE)
  15549.         SELECT srt%
  15550.           ' ------------------------------------------------------------------
  15551.         CASE 0          ! 1st page
  15552.           ss_menu2.fl%=1
  15553.           ' ------------------------------------------------------------------
  15554.         ENDSELECT
  15555.         GOSUB affiche_icone_b(srt%,20,orc%,ory%,0)
  15556.       ENDSELECT
  15557.       GOSUB wait_mouse(flag_relachement!)
  15558.       flag_relachement!=TRUE
  15559.       GOSUB vide_buffer_clavier
  15560.       IF ss_menu2.fl%<>2
  15561.         GOSUB sample_editor.affiche_sm
  15562.       ENDIF
  15563.     ENDIF
  15564.   ENDIF
  15565. RETURN
  15566. PROCEDURE se.sm_do_flanger(type%)
  15567.   LOCAL a%,amp%,i%,tbuf%,time%
  15568.   LOCAL a$,b$
  15569.   LOCAL a#
  15570.   ' Calcul de la table de sinus
  15571.   a$=STRING$(8192,0)
  15572.   SELECT se.flanger_wave%
  15573.   CASE 0                                        ! Sinus
  15574.     a#=PI/2048
  15575.     a%=V:a$
  15576.     FOR i%=0 TO 1024
  15577.       INT{a%}=ROUND(SIN(i%*a#)*4096)
  15578.       ADD a%,2
  15579.     NEXT i%
  15580.     a%=ADD(V:a$,2050)
  15581.     FOR i%=4 TO 4092 STEP 4
  15582.       INT{a%}=INT{SUB(a%,i%)}
  15583.       ADD a%,2
  15584.     NEXT i%
  15585.     a%=ADD(V:a$,4094)
  15586.     FOR i%=0 TO 2048
  15587.       INT{a%}=-INT{SUB(a%,4096)}
  15588.       ADD a%,2
  15589.     NEXT i%
  15590.   CASE 1                                        ! Carre
  15591.     FOR i%=V:a$ TO ADD(V:a$,4094) STEP 2
  15592.       CARD{i%}=4096
  15593.     NEXT i%
  15594.     FOR i%=ADD(V:a$,4096) TO ADD(V:a$,8190) STEP 2
  15595.       CARD{i%}=-4096
  15596.     NEXT i%
  15597.   CASE 2                                        ! Triangle
  15598.     a%=0
  15599.     FOR i%=V:a$ TO ADD(V:a$,2046) STEP 2
  15600.       CARD{i%}=a%
  15601.       ADD a%,4
  15602.     NEXT i%
  15603.     FOR i%=ADD(V:a$,2048) TO ADD(V:a$,6142) STEP 2
  15604.       CARD{i%}=a%
  15605.       SUB a%,4
  15606.     NEXT i%
  15607.     FOR i%=ADD(V:a$,6144) TO ADD(V:a$,8190) STEP 2
  15608.       CARD{i%}=a%
  15609.       ADD a%,4
  15610.     NEXT i%
  15611.   CASE 3                                        ! Ramp down
  15612.     a%=0
  15613.     FOR i%=V:a$ TO ADD(V:a$,4094) STEP 2
  15614.       CARD{i%}=a%
  15615.       SUB a%,2
  15616.     NEXT i%
  15617.     a%=4096
  15618.     FOR i%=ADD(V:a$,4096) TO ADD(V:a$,8190) STEP 2
  15619.       CARD{i%}=a%
  15620.       SUB a%,2
  15621.     NEXT i%
  15622.   CASE 4                                        ! Ramp up
  15623.     a%=0
  15624.     FOR i%=V:a$ TO ADD(V:a$,4094) STEP 2
  15625.       CARD{i%}=a%
  15626.       ADD a%,2
  15627.     NEXT i%
  15628.     a%=-4096
  15629.     FOR i%=ADD(V:a$,4096) TO ADD(V:a$,8190) STEP 2
  15630.       CARD{i%}=a%
  15631.       ADD a%,2
  15632.     NEXT i%
  15633.   ENDSELECT
  15634.   amp%=se.flanger_depth%*freq_buffer%/1E+06 AND -2
  15635.   time%=MAX(ADD(se.flanger_time%*freq_buffer%/500000,amp%) AND -2,4)
  15636.   tbuf%=ADD(time%,amp%)
  15637.   DIM buffer1%(SHR(tbuf%,2)),buffer2%(SHR(tbuf%,2))
  15638.   ' Bloc d'infos pour le flanger
  15639.   b$=STRING$(256,0)
  15640.   LONG{V:b$}=FN se.sm_adresse_sample(se.flanger_lsource%)
  15641.   LONG{ADD(V:b$,4)}=FN se.sm_adresse_sample(se.flanger_rsource%)
  15642.   LONG{ADD(V:b$,8)}=ADD(FN adr_buffer,mark_1%)
  15643.   LONG{ADD(V:b$,12)}=V:buffer1%(0)
  15644.   LONG{ADD(V:b$,16)}=V:buffer2%(0)
  15645.   LONG{ADD(V:b$,20)}=V:a$
  15646.   LONG{ADD(V:b$,24)}=FN se.sm_longueur_sample(se.flanger_lsource%)
  15647.   LONG{ADD(V:b$,28)}=FN se.sm_longueur_sample(se.flanger_rsource%)
  15648.   LONG{ADD(V:b$,32)}=mark_len%
  15649.   LONG{ADD(V:b$,36)}=tbuf%
  15650.   CARD{ADD(V:b$,40)}=FN se.sm_resol_sample(se.flanger_lsource%)
  15651.   CARD{ADD(V:b$,42)}=FN se.sm_resol_sample(se.flanger_rsource%)
  15652.   CARD{ADD(V:b$,44)}=win_bits%
  15653.   LONG{ADD(V:b$,48)}=SHL(se.flanger_fdbkll%,1)
  15654.   LONG{ADD(V:b$,52)}=SHL(se.flanger_fdbklr%,1)
  15655.   LONG{ADD(V:b$,56)}=SHL(se.flanger_fdbkrl%,1)
  15656.   LONG{ADD(V:b$,60)}=SHL(se.flanger_fdbkrr%,1)
  15657.   LONG{ADD(V:b$,64)}=SHL(se.flanger_dry%,1)
  15658.   LONG{ADD(V:b$,68)}=SHL(se.flanger_dry%,1)
  15659.   LONG{ADD(V:b$,72)}=SHL(se.flanger_wet%,1)
  15660.   LONG{ADD(V:b$,76)}=SHL(se.flanger_wet%,1)
  15661.   LONG{ADD(V:b$,80)}=&H10000000*se.flanger_freq%/MUL(freq_buffer%,1000)
  15662.   LONG{ADD(V:b$,84)}=amp%
  15663.   LONG{ADD(V:b$,88)}=time%
  15664.   CARD{ADD(V:b$,92)}=se.flanger_phase%
  15665.   SELECT type%
  15666.   CASE 0                        ! Mono
  15667.     CARD{ADD(V:b$,46)}=1
  15668.     LONG{ADD(V:b$,52)}=0                        ! Fdbklr = 0
  15669.     LONG{ADD(V:b$,56)}=0                        ! Fdbkrl = 0
  15670.     LONG{ADD(V:b$,68)}=0                        ! Dryr = 0
  15671.     LONG{ADD(V:b$,76)}=0                        ! Wetr = 0
  15672.   CASE 1                        ! Left
  15673.     CARD{ADD(V:b$,46)}=1
  15674.   CASE 2                        ! Right
  15675.     CARD{ADD(V:b$,46)}=2
  15676.   CASE 3                        ! Mix
  15677.     CARD{ADD(V:b$,46)}=7
  15678.   ENDSELECT
  15679.   '
  15680.   GOSUB affiche_panneau_progression("Please wait...",LONG{ADD(V:b$,32)},-1,-1)
  15681.   a%=V:b$
  15682.   ~C:g_fx_stereo_flanger%(L:a%)
  15683.   WHILE LONG{g_progression_pos%}<LONG{g_progression_len%}
  15684.     GOSUB affiche_progression(LONG{g_progression_pos%})
  15685.     ~C:g_fx_stereo_flanger%(L:0)
  15686.   WEND
  15687.   ERASE buffer1%(),buffer2%()
  15688.   ~FRE(0)
  15689. RETURN
  15690. ' Reverb
  15691. PROCEDURE se.sm_affsm_reverb
  15692.   IF ss_menu2.rev%=2
  15693.     GOSUB se.sm_affsm_reverb2
  15694.   ELSE
  15695.     GOSUB cadre_int(orc%,ADD(ory%,80),24,19,13,13,14,12)
  15696.     GOSUB cadre_int(orc%,ADD(ory%,100),24,39,13,13,14,12)
  15697.     GOSUB cadre_int(ADD(orc%,25),ADD(ory%,80),23,39,13,13,14,12)
  15698.     GOSUB cadre_int(ADD(orc%,49),ADD(ory%,80),23,39,13,13,14,12)
  15699.     GOSUB affiche_bloc_icones_b(0,16,21,orc%,ory%)
  15700.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,2,21),16)),ADD(ory%,ADD(divbi&(1,2,21),2)),4,5,0,13,12,14)
  15701.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,3,21),16)),ADD(ory%,ADD(divbi&(1,3,21),2)),4,5,0,13,12,14)
  15702.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,4,21),16)),ADD(ory%,ADD(divbi&(1,4,21),2)),4,5,0,13,12,14)
  15703.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,5,21),15)),ADD(ory%,ADD(divbi&(1,5,21),2)),1,5,0,13,12,14)
  15704.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,8,21),15)),ADD(ory%,ADD(divbi&(1,8,21),2)),1,5,0,13,12,14)
  15705.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,11,21),15)),ADD(ory%,ADD(divbi&(1,11,21),2)),4,5,0,13,12,14)
  15706.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,12,21),8)),ADD(ory%,ADD(divbi&(1,12,21),2)),1,5,0,13,12,14)
  15707.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,15,21),1)),ADD(ory%,ADD(divbi&(1,15,21),2)),27,5,0,13,12,14)
  15708.     GOSUB affchaine_trans("EARLY REFLECTION",ADD(SHL(orc%,1),52),ADD(ory%,87),14)
  15709.     GOSUB affchaine_trans("COMB FILTERS",ADD(SHL(orc%,1),100),ADD(ory%,87),14)
  15710.     GOSUB se.sm_actsm_reverb
  15711.   ENDIF
  15712. RETURN
  15713. PROCEDURE se.sm_actsm_reverb
  15714.   IF ss_menu2.rev%=2
  15715.     GOSUB se.sm_actsm_reverb2
  15716.   ELSE
  15717.     GOSUB affchaine_notrans(FN pourcent$(se.rev_drylevel%,32768),ADD(orc%,ADD(divbi&(0,2,21),16)),ADD(ory%,ADD(divbi&(1,2,21),2)),1)
  15718.     GOSUB affchaine_notrans(FN pourcent$(se.rev_revlevel%,32768),ADD(orc%,ADD(divbi&(0,3,21),16)),ADD(ory%,ADD(divbi&(1,3,21),2)),1)
  15719.     GOSUB affchaine_notrans(FN pourcent$(se.rev_ereflevel%,32768),ADD(orc%,ADD(divbi&(0,4,21),16)),ADD(ory%,ADD(divbi&(1,4,21),2)),1)
  15720.     GOSUB affchaine_notrans(STR$(se.rev_nbrtaps%,2),ADD(orc%,ADD(divbi&(0,5,21),15)),ADD(ory%,ADD(divbi&(1,5,21),2)),1)
  15721.     GOSUB affchaine_notrans(STR$(se.rev_nbrcomb%,2),ADD(orc%,ADD(divbi&(0,8,21),15)),ADD(ory%,ADD(divbi&(1,8,21),2)),1)
  15722.     GOSUB affchaine_notrans(FN pourcent$(se.rev_combgain%,32768),ADD(orc%,ADD(divbi&(0,11,21),15)),ADD(ory%,ADD(divbi&(1,11,21),2)),1)
  15723.     IF se.rev_source%>0
  15724.       GOSUB affchaine_notrans(HEX$(se.rev_source%,2),ADD(orc%,ADD(divbi&(0,12,21),8)),ADD(ory%,ADD(divbi&(1,12,21),2)),1)
  15725.       GOSUB affchaine_notrans(FN samplename$(se.rev_source%),ADD(orc%,ADD(divbi&(0,15,21),1)),ADD(ory%,ADD(divbi&(1,15,21),2)),1)
  15726.     ELSE
  15727.       GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,12,21),8)),ADD(ory%,ADD(divbi&(1,12,21),2)),1)
  15728.       GOSUB affchaine_notrans("Block"+SPACE$(23),ADD(orc%,ADD(divbi&(0,15,21),1)),ADD(ory%,ADD(divbi&(1,15,21),2)),1)
  15729.     ENDIF
  15730.   ENDIF
  15731. RETURN
  15732. PROCEDURE se.sm_gere_reverb
  15733.   ' Var locales de Sample_Editor :
  15734.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15735.   ' Utilise srt%, a%, b%, i%, j%, a$, flag_relachement!
  15736.   LOCAL freq_buf_real#
  15737.   ~FRE(0)
  15738.   IF ss_menu2.rev%=2
  15739.     GOSUB se.sm_gere_reverb2
  15740.   ELSE
  15741.     IF km%>0
  15742.       a%=V:divbi&(0,0,0)
  15743.       srt%=C:g_teste_icones%(L:a%,W:21,W:xm2%,W:ym2%)
  15744.       IF srt%>=0
  15745.         SELECT srt%
  15746.           ' Radio-boutons, Flip-flops ou champs de texte
  15747.           ' ------------------------------------------------------------------
  15748.         CASE 2                  ! Dry level
  15749.           GOSUB edite_chaine(FN pourcent$(se.rev_drylevel%,32768),ADD(orc%,ADD(divbi&(0,2,21),16)),ADD(ory%,ADD(divbi&(1,2,21),2)),5,3)
  15750.           se.rev_drylevel%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15751.           GOSUB se.sm_actsm_reverb
  15752.           ' ------------------------------------------------------------------
  15753.         CASE 3                  ! Reverb level
  15754.           GOSUB edite_chaine(FN pourcent$(se.rev_revlevel%,32768),ADD(orc%,ADD(divbi&(0,3,21),16)),ADD(ory%,ADD(divbi&(1,3,21),2)),5,3)
  15755.           se.rev_revlevel%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15756.           GOSUB se.sm_actsm_reverb
  15757.           ' ------------------------------------------------------------------
  15758.         CASE 4                  ! Early reflection level
  15759.           GOSUB edite_chaine(FN pourcent$(se.rev_ereflevel%,32768),ADD(orc%,ADD(divbi&(0,4,21),16)),ADD(ory%,ADD(divbi&(1,4,21),2)),5,3)
  15760.           se.rev_ereflevel%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15761.           GOSUB se.sm_actsm_reverb
  15762.           ' ------------------------------------------------------------------
  15763.         CASE 5                  ! Nombre de taps
  15764.           GOSUB edite_chaine(STR$(se.rev_nbrtaps%,2),ADD(orc%,ADD(divbi&(0,5,21),15)),ADD(ory%,ADD(divbi&(1,5,21),2)),2,2)
  15765.           se.rev_nbrtaps%=MIN(MAX(VAL(bbbb$),1),16)
  15766.           GOSUB se.sm_actsm_reverb
  15767.           ' ------------------------------------------------------------------
  15768.         CASE 6,7                ! Nombre de taps +/-
  15769.           se.rev_nbrtaps%=MAX(MIN(ADD(se.rev_nbrtaps%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,6),km%))),16),1)
  15770.           GOSUB se.sm_actsm_reverb
  15771.           IF km%=1
  15772.             PAUSE 8
  15773.           ENDIF
  15774.           flag_relachement!=FALSE
  15775.           ' ------------------------------------------------------------------
  15776.         CASE 8                  ! Nombre de comb filters
  15777.           GOSUB edite_chaine(STR$(se.rev_nbrcomb%,2),ADD(orc%,ADD(divbi&(0,8,21),15)),ADD(ory%,ADD(divbi&(1,8,21),2)),2,2)
  15778.           se.rev_nbrcomb%=MIN(MAX(VAL(bbbb$),1),8)
  15779.           GOSUB se.sm_actsm_reverb
  15780.           ' ------------------------------------------------------------------
  15781.         CASE 9,10               ! Nombre de comb filters +/-
  15782.           se.rev_nbrcomb%=MAX(MIN(ADD(se.rev_nbrcomb%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%))),8),1)
  15783.           GOSUB se.sm_actsm_reverb
  15784.           IF km%=1
  15785.             PAUSE 8
  15786.           ENDIF
  15787.           flag_relachement!=FALSE
  15788.           ' ------------------------------------------------------------------
  15789.         CASE 11                 ! Gain general de combs
  15790.           GOSUB edite_chaine(FN pourcent$(se.rev_combgain%,32768),ADD(orc%,ADD(divbi&(0,11,21),15)),ADD(ory%,ADD(divbi&(1,11,21),2)),5,3)
  15791.           se.rev_combgain%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15792.           GOSUB se.sm_actsm_reverb
  15793.           ' ------------------------------------------------------------------
  15794.         CASE 12                 ! Sample source
  15795.           GOSUB edite_chaine(HEX$(se.rev_source%,2),ADD(orc%,ADD(divbi&(0,12,21),8)),ADD(ory%,ADD(divbi&(1,12,21),2)),2,2)
  15796.           se.rev_source%=MIN(MAX(VAL("$"+bbbb$),0),255)
  15797.           GOSUB se.sm_actsm_reverb
  15798.           ' ------------------------------------------------------------------
  15799.         CASE 13,14              ! Source +/-
  15800.           se.rev_source%=MAX(MIN(ADD(se.rev_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,13),km%))),255),0)
  15801.           GOSUB se.sm_actsm_reverb
  15802.           IF km%=1
  15803.             PAUSE 8
  15804.           ENDIF
  15805.           flag_relachement!=FALSE
  15806.           ' ------------------------------------------------------------------
  15807.         CASE 15                 ! Nom du sample source
  15808.           ' Aucun effet
  15809.           ' ------------------------------------------------------------------
  15810.         DEFAULT
  15811.           ' Icones normales
  15812.           GOSUB affiche_icone_b(srt%,21,orc%,ory%,-1)
  15813.           GOSUB wait_mouse(TRUE)
  15814.           SELECT srt%
  15815.             ' ----------------------------------------------------------------
  15816.           CASE 0                ! 2nd page
  15817.             ss_menu2.rev%=2
  15818.             ' ----------------------------------------------------------------
  15819.           CASE 1                ! Reverberation
  15820.             GOSUB bee(TRUE)
  15821.             SHOWM
  15822.             ' Calcule la longueur totale de tous les buffers
  15823.             b%=0                                ! Longueur totale
  15824.             FOR i%=0 TO PRED(se.rev_nbrtaps%)
  15825.               b%=MAX(b%,se.rev_tapdelay%(i%))
  15826.             NEXT i%
  15827.             freq_buf_real#=freq_buffer%
  15828.             a%=ADD(ADD(INT(freq_buf_real#*b%/500000),2),1023) AND -1024
  15829.             se.rev_buffer$(0)=STRING$(a%,0)
  15830.             a%=ADD(INT(freq_buf_real#*se.rev_adlydelay%/500000),1023) AND -1024
  15831.             se.rev_buffer$(1)=STRING$(a%,0)
  15832.             a%=ADD(INT(freq_buf_real#*se.rev_aprdelay%/500000),1023) AND -1024
  15833.             se.rev_buffer$(2)=STRING$(a%,0)
  15834.             FOR i%=0 TO PRED(se.rev_nbrcomb%)
  15835.               a%=ADD(INT(freq_buf_real#*se.rev_combdelay%(i%)/500000),1023) AND -1024
  15836.               se.rev_buffer$(ADD(i%,3))=STRING$(a%,0)
  15837.             NEXT i%
  15838.             a$=STRING$(4096,0)
  15839.             ' Creation du bloc de parametres
  15840.             IF se.rev_source%>0
  15841.               LONG{V:a$}=FN adresse(se.rev_source%)
  15842.               LONG{ADD(V:a$,8)}=FN length(se.rev_source%)
  15843.               CARD{ADD(V:a$,16)}=FN resol(se.rev_source%)
  15844.             ELSE
  15845.               LONG{V:a$}=ADD(FN adr_buffer,mark_1%)
  15846.               LONG{ADD(V:a$,8)}=mark_len%
  15847.               CARD{ADD(V:a$,16)}=win_bits%
  15848.             ENDIF
  15849.             LONG{ADD(V:a$,4)}=ADD(FN adr_buffer,mark_1%)
  15850.             LONG{ADD(V:a$,12)}=mark_len%
  15851.             CARD{ADD(V:a$,18)}=win_bits%
  15852.             LONG{ADD(V:a$,20)}=SHL(se.rev_drylevel%,1)
  15853.             LONG{ADD(V:a$,24)}=SHL(se.rev_ereflevel%,1)
  15854.             LONG{ADD(V:a$,28)}=SHL(se.rev_revlevel%,1)
  15855.             LONG{ADD(V:a$,32)}=V:se.rev_buffer$(0)
  15856.             LONG{ADD(V:a$,36)}=LEN(se.rev_buffer$(0))
  15857.             LONG{ADD(V:a$,40)}=V:se.rev_buffer$(1)
  15858.             LONG{ADD(V:a$,44)}=LEN(se.rev_buffer$(1))
  15859.             LONG{ADD(V:a$,48)}=V:se.rev_buffer$(2)
  15860.             LONG{ADD(V:a$,52)}=LEN(se.rev_buffer$(2))
  15861.             LONG{ADD(V:a$,56)}=SHL(se.rev_aprg%,1)
  15862.             LONG{ADD(V:a$,60)}=-SHL(se.rev_aprg%,1)
  15863.             LONG{ADD(V:a$,64)}=SUB(65536,INT(se.rev_aprg%*se.rev_aprg%/16384))  ! 1 - g^2
  15864.             CARD{ADD(V:a$,68)}=se.rev_nbrtaps%
  15865.             FOR i%=0 TO PRED(se.rev_nbrtaps%)   ! On rajoute 1 sample au delay, c'est normal ------v
  15866.               LONG{ADD(V:a$,ADD(70,SHL(i%,3)))}=ADD(INT(freq_buf_real#*se.rev_tapdelay%(i%)/500000),3) AND -2
  15867.               LONG{ADD(V:a$,ADD(74,SHL(i%,3)))}=SHL(se.rev_taplevel%(i%),1)
  15868.             NEXT i%
  15869.             CARD{ADD(V:a$,198)}=se.rev_nbrcomb%
  15870.             FOR i%=0 TO PRED(se.rev_nbrcomb%)
  15871.               LONG{ADD(V:a$,ADD(200,MUL(i%,28)))}=V:se.rev_buffer$(ADD(i%,3))
  15872.               LONG{ADD(V:a$,ADD(204,MUL(i%,28)))}=LEN(se.rev_buffer$(ADD(i%,3)))
  15873.               a%=SUCC(INT(freq_buf_real#*se.rev_combdelay%(i%)/500000)) AND -2
  15874.               LONG{ADD(V:a$,ADD(208,MUL(i%,28)))}=a%
  15875.               a%=INT(se.rev_combgain%*(SUB(32768,se.rev_comblpf%(i%))/16384))
  15876.               LONG{ADD(V:a$,ADD(212,MUL(i%,28)))}=a%
  15877.               LONG{ADD(V:a$,ADD(216,MUL(i%,28)))}=SHL(se.rev_comblpf%(i%),1)
  15878.             NEXT i%
  15879.             LONG{ADD(V:a$,424)}=SUCC(INT(freq_buf_real#*se.rev_aprdelay%/500000)) AND -2
  15880.             LONG{ADD(V:a$,428)}=SUCC(INT(freq_buf_real#*se.rev_adlydelay%/500000)) AND -2
  15881.             '
  15882.             GOSUB affiche_panneau_progression("Please wait...",LONG{ADD(V:a$,12)},-1,-1)
  15883.             a%=V:a$
  15884.             ~C:g_reverberation%(L:a%)
  15885.             WHILE LONG{g_progression_pos%}<LONG{g_progression_len%}
  15886.               GOSUB affiche_progression(LONG{g_progression_pos%})
  15887.               ~C:g_reverberation%(L:0)
  15888.             WEND
  15889.             '
  15890.             FOR i%=0 TO ADD(se.rev_nbrcomb%,2)
  15891.               se.rev_buffer$(i%)=""
  15892.             NEXT i%
  15893.             ~FRE(0)
  15894.             GOSUB bee(FALSE)
  15895.             GOSUB affiche_panneau_sample
  15896.             ' ----------------------------------------------------------------
  15897.           ENDSELECT
  15898.           GOSUB affiche_icone_b(srt%,21,orc%,ory%,0)
  15899.         ENDSELECT
  15900.         GOSUB wait_mouse(flag_relachement!)
  15901.         flag_relachement!=TRUE
  15902.         GOSUB vide_buffer_clavier
  15903.         IF ss_menu2.rev%<>1
  15904.           GOSUB sample_editor.affiche_sm
  15905.         ENDIF
  15906.       ENDIF
  15907.     ENDIF
  15908.   ENDIF
  15909. RETURN
  15910. PROCEDURE se.sm_affsm_reverb2
  15911.   ' Var locales de Sample_Editor :
  15912.   ' i%
  15913.   GOSUB cadre_int(orc%,ADD(ory%,80),18,59,13,13,14,12)
  15914.   GOSUB cadre_int(ADD(orc%,19),ADD(ory%,80),18,59,13,13,14,12)
  15915.   GOSUB cadre_int(ADD(orc%,38),ADD(ory%,80),29,29,13,13,14,12)
  15916.   GOSUB cadre_int(ADD(orc%,38),ADD(ory%,110),29,29,13,13,14,12)
  15917.   GOSUB affiche_bloc_icones_b(0,1,22,orc%,ory%)
  15918.   GOSUB affiche_bloc_icones_b(4,2,22,orc%,ory%)
  15919.   GOSUB affiche_bloc_icones_b(9,5,22,orc%,ory%)
  15920.   FOR i%=1 TO 6 STEP 5
  15921.     GOSUB cadre_ext(ADD(orc%,divbi&(0,i%,22)),ADD(ory%,divbi&(1,i%,22)),1,41,0,13,12,14)
  15922.     GOSUB cadre_ext(ADD(orc%,divbi&(0,SUCC(i%),22)),ADD(ory%,divbi&(1,SUCC(i%),22)),4,41,0,13,12,14)
  15923.     GOSUB cadre_ext(ADD(orc%,divbi&(0,ADD(i%,2),22)),ADD(ory%,divbi&(1,ADD(i%,2),22)),4,41,0,13,12,14)
  15924.   NEXT i%
  15925.   FOR i%=11 TO 13
  15926.     GOSUB cadre_ext(ADD(orc%,ADD(divbi&(0,i%,22),6)),ADD(ory%,ADD(divbi&(1,i%,22),2)),4,5,0,13,12,14)
  15927.   NEXT i%
  15928.   GOSUB affchaine_trans("EARLY REFLECTION",ADD(SHL(orc%,1),2),ADD(ory%,82),14)
  15929.   GOSUB affchaine_trans("COMB FILTERS",ADD(SHL(orc%,1),40),ADD(ory%,82),14)
  15930.   GOSUB affchaine_trans("#",ADD(SHL(orc%,1),3),ADD(ory%,134),14)
  15931.   GOSUB affchaine_trans("DELAY",ADD(SHL(orc%,1),8),ADD(ory%,134),14)
  15932.   GOSUB affchaine_trans("GAIN",ADD(SHL(orc%,1),21),ADD(ory%,134),14)
  15933.   GOSUB affchaine_trans("#",ADD(SHL(orc%,1),41),ADD(ory%,134),14)
  15934.   GOSUB affchaine_trans("DELAY",ADD(SHL(orc%,1),46),ADD(ory%,134),14)
  15935.   GOSUB affchaine_trans("LPF",ADD(SHL(orc%,1),60),ADD(ory%,134),14)
  15936.   GOSUB affchaine_trans("ALL PASS REVERB",ADD(SHL(orc%,1),78),ADD(ory%,87),14)
  15937.   GOSUB affchaine_trans("ALIGNEMENT DELAY",ADD(SHL(orc%,1),78),ADD(ory%,117),14)
  15938.   GOSUB se.sm_actsm_reverb2
  15939. RETURN
  15940. PROCEDURE se.sm_actsm_reverb2
  15941.   ' Var locales de Sample_Editor :
  15942.   ' a%, b%, c%, i%
  15943.   a%=se.rev_tappos%
  15944.   b%=se.rev_combpos%
  15945.   FOR i%=0 TO 36 STEP 6
  15946.     IF a%<16
  15947.       IF a%<se.rev_nbrtaps%
  15948.         c%=1
  15949.       ELSE
  15950.         c%=12
  15951.       ENDIF
  15952.       GOSUB affchaine_notrans(STR$(SUCC(a%),2),ADD(orc%,divbi&(0,1,22)),ADD(ory%,ADD(divbi&(1,1,22),i%)),c%)
  15953.       GOSUB affchaine_notrans(STR$(se.rev_tapdelay%(a%)/1000,5),ADD(orc%,divbi&(0,2,22)),ADD(ory%,ADD(divbi&(1,2,22),i%)),c%)
  15954.       GOSUB affchaine_notrans(FN pourcent$(se.rev_taplevel%(a%),32768),ADD(orc%,divbi&(0,3,22)),ADD(ory%,ADD(divbi&(1,3,22),i%)),c%)
  15955.     ELSE
  15956.       GOSUB affchaine_notrans(SPACE$(2),ADD(orc%,divbi&(0,1,22)),ADD(ory%,ADD(divbi&(1,1,22),i%)),1)
  15957.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,2,22)),ADD(ory%,ADD(divbi&(1,2,22),i%)),1)
  15958.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,3,22)),ADD(ory%,ADD(divbi&(1,3,22),i%)),1)
  15959.     ENDIF
  15960.     IF b%<8
  15961.       IF b%<se.rev_nbrcomb%
  15962.         c%=1
  15963.       ELSE
  15964.         c%=12
  15965.       ENDIF
  15966.       GOSUB affchaine_notrans(STR$(SUCC(b%),2),ADD(orc%,divbi&(0,6,22)),ADD(ory%,ADD(divbi&(1,6,22),i%)),c%)
  15967.       GOSUB affchaine_notrans(STR$(se.rev_combdelay%(b%)/1000,5),ADD(orc%,divbi&(0,7,22)),ADD(ory%,ADD(divbi&(1,7,22),i%)),c%)
  15968.       GOSUB affchaine_notrans(FN pourcent$(se.rev_comblpf%(b%),32768),ADD(orc%,divbi&(0,8,22)),ADD(ory%,ADD(divbi&(1,8,22),i%)),c%)
  15969.     ELSE
  15970.       GOSUB affchaine_notrans(SPACE$(2),ADD(orc%,divbi&(0,6,22)),ADD(ory%,ADD(divbi&(1,6,22),i%)),1)
  15971.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,7,22)),ADD(ory%,ADD(divbi&(1,7,22),i%)),1)
  15972.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,8,22)),ADD(ory%,ADD(divbi&(1,8,22),i%)),1)
  15973.     ENDIF
  15974.     INC a%
  15975.     INC b%
  15976.   NEXT i%
  15977.   GOSUB affchaine_notrans(STR$(se.rev_aprdelay%/1000,5),ADD(orc%,ADD(divbi&(0,11,22),6)),ADD(ory%,ADD(divbi&(1,11,22),2)),1)
  15978.   GOSUB affchaine_notrans(FN pourcent$(se.rev_aprg%,32768),ADD(orc%,ADD(divbi&(0,12,22),6)),ADD(ory%,ADD(divbi&(1,12,22),2)),1)
  15979.   GOSUB affchaine_notrans(STR$(se.rev_adlydelay%/1000,5),ADD(orc%,ADD(divbi&(0,13,22),6)),ADD(ory%,ADD(divbi&(1,13,22),2)),1)
  15980. RETURN
  15981. PROCEDURE se.sm_gere_reverb2
  15982.   ' Var locales de Sample_Editor :
  15983.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15984.   ' Utilise srt%, a%, b%, c%, aaaa$, flag_relachement!
  15985.   ~FRE(0)
  15986.   IF km%>0
  15987.     a%=V:divbi&(0,0,0)
  15988.     srt%=C:g_teste_icones%(L:a%,W:22,W:xm2%,W:ym2%)
  15989.     IF srt%>=0
  15990.       SELECT srt%
  15991.         ' Radio-boutons, Flip-flops ou champs de texte
  15992.         ' --------------------------------------------------------------------
  15993.       CASE 2            ! Tap delay
  15994.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  15995.         b%=ADD(a%,se.rev_tappos%)
  15996.         GOSUB edite_chaine(STR$(se.rev_tapdelay%(b%)/1000,5),ADD(orc%,divbi&(0,srt%,22)),ADD(ory%,ADD(divbi&(1,srt%,22),MUL(a%,6))),5,3)
  15997.         se.rev_tapdelay%(b%)=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  15998.         GOSUB se.sm_actsm_reverb2
  15999.         ' --------------------------------------------------------------------
  16000.       CASE 3            ! Tap level
  16001.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  16002.         b%=ADD(a%,se.rev_tappos%)
  16003.         GOSUB edite_chaine(FN pourcent$(se.rev_taplevel%(b%),32768),ADD(orc%,divbi&(0,srt%,22)),ADD(ory%,ADD(divbi&(1,srt%,22),MUL(a%,6))),5,3)
  16004.         se.rev_taplevel%(b%)=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  16005.         GOSUB se.sm_actsm_reverb2
  16006.         ' --------------------------------------------------------------------
  16007.       CASE 4,5          ! Position +/- dans liste des taps
  16008.         se.rev_tappos%=MAX(MIN(SUB(se.rev_tappos%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,4),km%))),9),0)
  16009.         GOSUB se.sm_actsm_reverb2
  16010.         IF km%=1
  16011.           PAUSE 8
  16012.         ENDIF
  16013.         flag_relachement!=FALSE
  16014.         ' --------------------------------------------------------------------
  16015.       CASE 7            ! Comb delay
  16016.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  16017.         b%=ADD(a%,se.rev_combpos%)
  16018.         GOSUB edite_chaine(STR$(se.rev_combdelay%(b%)/1000,5),ADD(orc%,divbi&(0,srt%,22)),ADD(ory%,ADD(divbi&(1,srt%,22),MUL(a%,6))),5,3)
  16019.         se.rev_combdelay%(b%)=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  16020.         GOSUB se.sm_actsm_reverb2
  16021.         ' --------------------------------------------------------------------
  16022.       CASE 8            ! Comb LPF gain
  16023.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  16024.         b%=ADD(a%,se.rev_combpos%)
  16025.         GOSUB edite_chaine(FN pourcent$(se.rev_comblpf%(b%),32768),ADD(orc%,divbi&(0,srt%,22)),ADD(ory%,ADD(divbi&(1,srt%,22),MUL(a%,6))),5,3)
  16026.         se.rev_comblpf%(b%)=DIV(32768*MIN(MAX(VAL(bbbb$),0),100),100)
  16027.         GOSUB se.sm_actsm_reverb2
  16028.         ' --------------------------------------------------------------------
  16029.       CASE 9,10         ! Position +/- dans liste des comb filters
  16030.         se.rev_combpos%=MAX(MIN(SUB(se.rev_combpos%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%))),1),0)
  16031.         GOSUB se.sm_actsm_reverb2
  16032.         IF km%=1
  16033.           PAUSE 8
  16034.         ENDIF
  16035.         flag_relachement!=FALSE
  16036.         ' --------------------------------------------------------------------
  16037.       CASE 11           ! APR delay
  16038.         GOSUB edite_chaine(STR$(se.rev_aprdelay%/1000,5),ADD(orc%,ADD(divbi&(0,srt%,22),6)),ADD(ory%,ADD(divbi&(1,srt%,22),2)),5,3)
  16039.         se.rev_aprdelay%=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  16040.         GOSUB se.sm_actsm_reverb2
  16041.         ' --------------------------------------------------------------------
  16042.       CASE 12           ! APR gain
  16043.         GOSUB edite_chaine(FN pourcent$(se.rev_aprg%,32768),ADD(orc%,ADD(divbi&(0,srt%,22),6)),ADD(ory%,ADD(divbi&(1,srt%,22),2)),5,3)
  16044.         se.rev_aprg%=DIV(32768*MIN(MAX(VAL(bbbb$),0),100),100)
  16045.         GOSUB se.sm_actsm_reverb2
  16046.         ' --------------------------------------------------------------------
  16047.       CASE 13           ! Alignement delay
  16048.         GOSUB edite_chaine(STR$(se.rev_adlydelay%/1000,5),ADD(orc%,ADD(divbi&(0,srt%,22),6)),ADD(ory%,ADD(divbi&(1,srt%,22),2)),5,3)
  16049.         se.rev_adlydelay%=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  16050.         GOSUB se.sm_actsm_reverb2
  16051.         ' --------------------------------------------------------------------
  16052.       CASE 1,6          ! Numero de tap/comb
  16053.         ' Aucun effet
  16054.         ' --------------------------------------------------------------------
  16055.       DEFAULT
  16056.         ' Icones normales
  16057.         GOSUB affiche_icone_b(srt%,22,orc%,ory%,-1)
  16058.         GOSUB wait_mouse(TRUE)
  16059.         SELECT srt%
  16060.           ' ------------------------------------------------------------------
  16061.         CASE 0          ! 1st page
  16062.           ss_menu2.rev%=1
  16063.           ' ------------------------------------------------------------------
  16064.         ENDSELECT
  16065.         GOSUB affiche_icone_b(srt%,22,orc%,ory%,0)
  16066.       ENDSELECT
  16067.       GOSUB wait_mouse(flag_relachement!)
  16068.       flag_relachement!=TRUE
  16069.       GOSUB vide_buffer_clavier
  16070.       IF ss_menu2.rev%<>2
  16071.         GOSUB sample_editor.affiche_sm
  16072.       ENDIF
  16073.     ENDIF
  16074.   ENDIF
  16075. RETURN
  16076. ' Song to disk
  16077. PROCEDURE se.sm_affsm_song2disk
  16078.   GOSUB cadre_int(orc%,ADD(ory%,80),15,39,13,13,14,12)
  16079.   GOSUB cadre_int(ADD(orc%,16),ADD(ory%,80),25,19,13,13,14,12)
  16080.   GOSUB cadre_int(ADD(orc%,16),ADD(ory%,100),25,19,13,13,14,12)
  16081.   GOSUB cadre_int(ADD(orc%,34),ADD(ory%,80),7,39,13,13,14,12)
  16082.   GOSUB cadre_int(ADD(orc%,42),ADD(ory%,80),26,39,13,13,14,12)
  16083.   GOSUB cadre_int(ADD(orc%,69),ADD(ory%,80),10,59,13,13,14,12)
  16084.   GOSUB cadre_int(ADD(orc%,57),ADD(ory%,120),11,19,13,13,14,12)
  16085.   GOSUB affiche_bloc_icones_b(4,8,23,orc%,ory%)
  16086.   GOSUB affiche_bloc_icones_b(20,1,23,orc%,ory%)
  16087.   GOSUB cadre_ext(ADD(orc%,divbi&(0,0,23)),ADD(ADD(ory%,divbi&(1,0,23)),2),1,5,0,13,12,14)
  16088.   GOSUB cadre_ext(ADD(orc%,divbi&(0,1,23)),ADD(ADD(ory%,divbi&(1,1,23)),2),1,5,0,13,12,14)
  16089.   GOSUB cadre_ext(ADD(orc%,divbi&(0,2,23)),ADD(ADD(ory%,divbi&(1,2,23)),2),1,5,0,13,12,14)
  16090.   GOSUB cadre_ext(ADD(orc%,divbi&(0,3,23)),ADD(ADD(ory%,divbi&(1,3,23)),2),1,5,0,13,12,14)
  16091.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,10,23)),17),ADD(ADD(ory%,divbi&(1,10,23)),2),4,5,0,13,12,14)
  16092.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,11,23)),15),ADD(ADD(ory%,divbi&(1,11,23)),2),6,5,0,13,12,14)
  16093.   GOSUB affchaine_trans("POS",ADD(SHL(orc%,1),2),ADD(ory%,97),14)
  16094.   GOSUB affchaine_trans("LINE",ADD(SHL(orc%,1),2),ADD(ory%,107),14)
  16095.   GOSUB affchaine_trans("START",ADD(SHL(orc%,1),12),ADD(ory%,87),14)
  16096.   GOSUB affchaine_trans("END",ADD(SHL(orc%,1),24),ADD(ory%,87),14)
  16097.   GOSUB affchaine_trans("TO:",ADD(SHL(orc%,1),70),ADD(ory%,87),14)
  16098.   GOSUB affchaine_trans("SECURITY",ADD(SHL(orc%,1),86),ADD(ory%,87),14)
  16099.   GOSUB affchaine_trans("REC SPEED",ADD(SHL(orc%,1),140),ADD(ory%,87),14)
  16100.   GOSUB se.sm_actsm_song2disk
  16101. RETURN
  16102. PROCEDURE se.sm_actsm_song2disk
  16103.   ' Var locales de Sample_Editor utilisees:
  16104.   ' i%
  16105.   GOSUB affchaine_notrans(HEX$(se.s2d_posstart%,2),ADD(orc%,divbi&(0,0,23)),ADD(ADD(ory%,divbi&(1,0,23)),2),1)
  16106.   GOSUB affchaine_notrans(HEX$(se.s2d_posend%,2),ADD(orc%,divbi&(0,1,23)),ADD(ADD(ory%,divbi&(1,1,23)),2),1)
  16107.   GOSUB affchaine_notrans(HEX$(se.s2d_ligstart%,2),ADD(orc%,divbi&(0,2,23)),ADD(ADD(ory%,divbi&(1,2,23)),2),1)
  16108.   GOSUB affchaine_notrans(HEX$(se.s2d_ligend%,2),ADD(orc%,divbi&(0,3,23)),ADD(ADD(ory%,divbi&(1,3,23)),2),1)
  16109.   GOSUB affchaine_notrans(STR$(se.s2d_maxsize%*1024/MUL(freq_buffer%,MUL(se.s2d_bits%,se.s2d_stereo%)),5),ADD(ADD(orc%,divbi&(0,10,23)),17),ADD(ADD(ory%,divbi&(1,10,23)),2),1)
  16110.   GOSUB affchaine_notrans(STR$(se.s2d_maxsize%,7),ADD(ADD(orc%,divbi&(0,11,23)),15),ADD(ADD(ory%,divbi&(1,11,23)),2),1)
  16111.   GOSUB affiche_icone_b(4,23,orc%,ory%,se.s2d_bits%<>2)
  16112.   GOSUB affiche_icone_b(5,23,orc%,ory%,se.s2d_bits%=2)
  16113.   GOSUB affiche_icone_b(6,23,orc%,ory%,se.s2d_stereo%<>2)
  16114.   GOSUB affiche_icone_b(7,23,orc%,ory%,se.s2d_stereo%=2)
  16115.   GOSUB affiche_icone_b(8,23,orc%,ory%,se.s2d_out%<>2)
  16116.   GOSUB affiche_icone_b(9,23,orc%,ory%,se.s2d_out%=2)
  16117.   GOSUB affiche_icone_b(21,23,orc%,ory%,se.s2d_monitor!)
  16118.   FOR i%=0 TO 7
  16119.     GOSUB affiche_icone_b(ADD(12,i%),23,orc%,ory%,se.s2d_speed%=i%)
  16120.   NEXT i%
  16121.   se.s2d_prediv%=VAL("$"+MID$("1234579B",SUCC(se.s2d_speed%),1))
  16122. RETURN
  16123. PROCEDURE se.sm_gere_song2disk
  16124.   ' Var locales de Sample_Editor :
  16125.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  16126.   ' Utilise srt%, a%, aaaa$, flag_relachement!
  16127.   ~FRE(0)
  16128.   IF km%>0
  16129.     a%=V:divbi&(0,0,0)
  16130.     srt%=C:g_teste_icones%(L:a%,W:23,W:xm2%,W:ym2%)
  16131.     IF srt%>=0
  16132.       SELECT srt%
  16133.         ' Radio-boutons, Flip-flops ou champs de texte
  16134.         ' --------------------------------------------------------------------
  16135.       CASE 0            ! Start pos
  16136.         GOSUB edite_chaine(HEX$(se.s2d_posstart%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  16137.         se.s2d_posstart%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN song_length))
  16138.         GOSUB se.sm_actsm_song2disk
  16139.         ' --------------------------------------------------------------------
  16140.       CASE 1            ! End pos
  16141.         GOSUB edite_chaine(HEX$(se.s2d_posend%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  16142.         se.s2d_posend%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN song_length))
  16143.         GOSUB se.sm_actsm_song2disk
  16144.         ' --------------------------------------------------------------------
  16145.       CASE 2            ! Start line
  16146.         GOSUB edite_chaine(HEX$(se.s2d_ligstart%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  16147.         se.s2d_ligstart%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN nbr_lines(se.s2d_posstart%)))
  16148.         GOSUB se.sm_actsm_song2disk
  16149.         ' --------------------------------------------------------------------
  16150.       CASE 3            ! End line
  16151.         GOSUB edite_chaine(HEX$(se.s2d_ligend%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  16152.         se.s2d_ligend%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN nbr_lines(se.s2d_posend%)))
  16153.         GOSUB se.sm_actsm_song2disk
  16154.         ' --------------------------------------------------------------------
  16155.       CASE 4            ! 8 bits
  16156.         se.s2d_bits%=1
  16157.         GOSUB se.sm_actsm_song2disk
  16158.         ' --------------------------------------------------------------------
  16159.       CASE 5            ! 16 bits
  16160.         se.s2d_bits%=2
  16161.         GOSUB se.sm_actsm_song2disk
  16162.         ' --------------------------------------------------------------------
  16163.       CASE 6            ! Mono
  16164.         se.s2d_stereo%=1
  16165.         GOSUB se.sm_actsm_song2disk
  16166.         ' --------------------------------------------------------------------
  16167.       CASE 7            ! Stereo
  16168.         se.s2d_stereo%=2
  16169.         GOSUB se.sm_actsm_song2disk
  16170.         ' --------------------------------------------------------------------
  16171.       CASE 8            ! To block
  16172.         se.s2d_out%=1
  16173.         GOSUB se.sm_actsm_song2disk
  16174.         ' --------------------------------------------------------------------
  16175.       CASE 9            ! To sample
  16176.         se.s2d_out%=2
  16177.         GOSUB se.sm_actsm_song2disk
  16178.         ' --------------------------------------------------------------------
  16179.       CASE 10           ! Maximum duration
  16180.         GOSUB edite_chaine(STR$(se.s2d_maxsize%*1024/MUL(freq_buffer%,MUL(se.s2d_bits%,se.s2d_stereo%)),5),ADD(ADD(orc%,divbi&(0,srt%,23)),17),ADD(ory%,ADD(divbi&(1,srt%,23),2)),5,2)
  16181.         se.s2d_maxsize%=MIN(MAX(0,VAL(bbbb$)*MUL(freq_buffer%,MUL(se.s2d_bits%,se.s2d_stereo%))/1024),99999)
  16182.         GOSUB se.sm_actsm_song2disk
  16183.         ' --------------------------------------------------------------------
  16184.       CASE 11           ! Maximum size
  16185.         GOSUB edite_chaine(STR$(se.s2d_maxsize%,5),ADD(ADD(orc%,divbi&(0,srt%,23)),15),ADD(ory%,ADD(divbi&(1,srt%,23),2)),7,2)
  16186.         se.s2d_maxsize%=MIN(MAX(0,VAL(bbbb$)),4E+06)
  16187.         GOSUB se.sm_actsm_song2disk
  16188.         ' --------------------------------------------------------------------
  16189.       CASE 12 TO 19     ! Recording speed
  16190.         se.s2d_speed%=SUB(srt%,12)
  16191.         se.s2d_prediv%=VAL("$"+MID$("1234579B",SUCC(se.s2d_speed%),1))
  16192.         GOSUB se.sm_actsm_song2disk
  16193.         ' --------------------------------------------------------------------
  16194.       CASE 21           ! Monitor
  16195.         se.s2d_monitor!=NOT se.s2d_monitor!
  16196.         GOSUB se.sm_actsm_song2disk
  16197.         ' --------------------------------------------------------------------
  16198.       DEFAULT
  16199.         ' Icones normales
  16200.         GOSUB affiche_icone_b(srt%,23,orc%,ory%,-1)
  16201.         GOSUB wait_mouse(TRUE)
  16202.         SELECT srt%
  16203.           ' ------------------------------------------------------------------
  16204.         CASE 20         ! Record
  16205.           IF se.s2d_out%=2
  16206.             GOSUB se.sm_record_song_to_disk
  16207.           ELSE
  16208.             GOSUB se.sm_record_song_to_block
  16209.           ENDIF
  16210.           se.volume_ok!=FALSE
  16211.           GOSUB affiche_panneau_sample
  16212.           ' ------------------------------------------------------------------
  16213.         ENDSELECT
  16214.         GOSUB affiche_icone_b(srt%,23,orc%,ory%,0)
  16215.       ENDSELECT
  16216.       GOSUB wait_mouse(flag_relachement!)
  16217.       flag_relachement!=TRUE
  16218.       GOSUB vide_buffer_clavier
  16219.     ENDIF
  16220.   ENDIF
  16221. RETURN
  16222. PROCEDURE se.sm_record_song_to_block
  16223.   LOCAL ok!
  16224.   IF mark_len%<MUL(se.s2d_bits%,se.s2d_stereo%)
  16225.     GOSUB dialog("STOP","Block too small.","Cancel",MOUSEX,MOUSEY)
  16226.     GOSUB affiche_panneau_sample
  16227.   ELSE IF freq_buffer%<12000
  16228.     GOSUB dialog("STOP","Recording frequency must be|greater than 12 KHz.","Cancel",MOUSEX,MOUSEY)
  16229.     GOSUB affiche_panneau_sample
  16230.   ELSE
  16231.     ok!=TRUE
  16232.     IF se.s2d_monitor! AND freq_buffer%<DIV(DIV(98340,SUCC(se.s2d_prediv%)),3)
  16233.       GOSUB dialog("WARNING","Please select a lower recording frequency|to avoid bugs.","Continue|Cancel",MOUSEX,MOUSEY)
  16234.       IF bouton%=1
  16235.         ok!=FALSE
  16236.       ENDIF
  16237.       GOSUB affiche_panneau_sample
  16238.     ENDIF
  16239.     IF ok!
  16240.       IF se.s2d_monitor!
  16241.         GOSUB se.sm_do_record_song_to_block
  16242.       ELSE
  16243.         GOSUB se.sm_do_record_song_to_block_norealtime
  16244.       ENDIF
  16245.     ENDIF
  16246.   ENDIF
  16247. RETURN
  16248. PROCEDURE se.sm_do_record_song_to_block
  16249.   LOCAL longueur%
  16250.   LOCAL sortie!
  16251.   GOSUB stop_voices
  16252.   GOSUB bee(TRUE)
  16253.   '
  16254.   ' Preparation des routines d'enregistrement
  16255.   '
  16256.   longueur%=mark_len% AND -win_bits%
  16257.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16258.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16259.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16260.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16261.   LONG{ADD(r_songrecord_state%,10)}=g_rec_sam_buffer%
  16262.   LONG{ADD(r_songrecord_state%,14)}=ADD(g_rec_sam_buffer%,4096)
  16263.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16264.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16265.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16266.   CARD{ADD(r_songrecord_state%,32)}=1           ! Realtime
  16267.   CARD{r_songrecord_state%}=0
  16268.   LONG{g_sngrec_paramadr%}=r_songrecord_state%
  16269.   LONG{ADD(g_sngrec_paramadr%,4)}=ADD(FN adr_buffer,mark_1%)    ! Adresse du buffer
  16270.   LONG{ADD(g_sngrec_paramadr%,8)}=longueur%     ! Taille du buffer
  16271.   LONG{ADD(g_sngrec_paramadr%,12)}=0            ! Position du buffer
  16272.   LONG{ADD(g_sngrec_paramadr%,16)}=longueur%    ! Taille maxi
  16273.   LONG{ADD(g_sngrec_paramadr%,20)}=0            ! Position du sample
  16274.   CARD{ADD(g_sngrec_paramadr%,24)}=1            ! Type (1 = bouclage)
  16275.   CARD{ADD(g_sngrec_paramadr%,26)}=1            ! Flag (0 = arret)
  16276.   CARD{ADD(g_sngrec_paramadr%,28)}=win_bits%
  16277.   CARD{ADD(g_sngrec_paramadr%,30)}=1            ! Mono
  16278.   songpos%=se.s2d_posstart%
  16279.   sortie!=FALSE
  16280.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16281.   GOSUB play_song2(0)
  16282.   ~C:g_start_song_recording%(W:0)
  16283.   '
  16284.   ' Boucle d'enregistrement
  16285.   '
  16286.   REPEAT
  16287.     ' Position finale atteinte ?
  16288.     IF CARD{r_songrecord_state%}=4
  16289.       ~C:g_stop_song_recording%(W:0)
  16290.       sortie!=TRUE
  16291.     ENDIF
  16292.     ' Depasse le temps imparti ou la taille maxi ?
  16293.     IF CARD{ADD(g_sngrec_paramadr%,26)}=0
  16294.       sortie!=TRUE
  16295.     ENDIF
  16296.     ' Arret de l'utilisateur ?
  16297.     IF GEMDOS(11)<>0
  16298.       ~GEMDOS(7)
  16299.       sortie!=TRUE
  16300.     ENDIF
  16301.   UNTIL sortie!
  16302.   '
  16303.   ' On s'arrete d'enregistrer si on est sorti avant la fin
  16304.   '
  16305.   IF CARD{ADD(g_sngrec_paramadr%,26)}<>0
  16306.     ~C:g_stop_song_recording%(W:0)
  16307.   ENDIF
  16308.   IF CARD{r_songrecord_state%}<3
  16309.     CARD{r_songrecord_state%}=3
  16310.   ENDIF
  16311.   REPEAT
  16312.   UNTIL CARD{r_songrecord_state%}=4 AND CARD{ADD(g_sngrec_paramadr%,26)}=0
  16313.   CARD{r_songrecord_state%}=0
  16314.   mark_2%=ADD(mark_1%,LONG{ADD(g_sngrec_paramadr%,20)})
  16315.   GOSUB stop_voices
  16316.   GOSUB bee(FALSE)
  16317. RETURN
  16318. PROCEDURE se.sm_do_record_song_to_block_norealtime
  16319.   LOCAL adr_dest%,convlen1%,convlen2%,framelen%,longueur%,rec_pos%
  16320.   LOCAL cur_songpos%,old_songpos%
  16321.   LOCAL buffer$
  16322.   '
  16323.   GOSUB stop_voices
  16324.   GOSUB wait_mouse(TRUE)
  16325.   GOSUB bee(TRUE)
  16326.   '
  16327.   GOSUB affiche_panneau_progression("Please wait...",SUB(se.s2d_posend%,se.s2d_posstart%),-1,-1)
  16328.   old_songpos%=-1
  16329.   '
  16330.   ' Prepare l'enregistrement
  16331.   '
  16332.   buffer$=STRING$(8192,0)                       ! Il faut au moins 1200 * 2 * 2 octets
  16333.   longueur%=mark_len% AND -win_bits%
  16334.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16335.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16336.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16337.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16338.   LONG{ADD(r_songrecord_state%,10)}=V:buffer$
  16339.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16340.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16341.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16342.   ' sjx, for debugging, may remove
  16343. dbs2d1:
  16344.   CARD{ADD(r_songrecord_state%,32)}=0           ! Pas de realtime
  16345.   CARD{r_songrecord_state%}=0
  16346.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16347.   songpos%=se.s2d_posstart%
  16348. dbs2d2:
  16349.   GOSUB play_song2(0)
  16350.   rec_pos%=0                                    ! Position dans l'enregistrement
  16351.   REPEAT                                        ! Attend le debut de l'enregistrement
  16352.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16353.       ~GEMDOS(7)
  16354.       CARD{r_songrecord_state%}=3
  16355.       GOTO se.sm_do_record_song_to_block_norealtime_end
  16356.     ENDIF
  16357.     IF MOUSEK=2                                 ! Arret souris?
  16358.       CARD{r_songrecord_state%}=3
  16359.       GOTO se.sm_do_record_song_to_block_norealtime_end
  16360.     ENDIF
  16361.   UNTIL CARD{r_songrecord_state%}=2
  16362.   '
  16363.   ' Boucle d'enregistrement
  16364.   '
  16365. dbs2d3:
  16366.   WHILE CARD{r_songrecord_state%}=2
  16367.     IF rec_pos%>=longueur%                      ! Fin atteinte?
  16368.       CARD{r_songrecord_state%}=3
  16369.     ENDIF
  16370.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16371.       ~GEMDOS(7)
  16372.       CARD{r_songrecord_state%}=3
  16373.     ENDIF
  16374.     IF MOUSEK=2                                 ! Arret souris?
  16375.       CARD{r_songrecord_state%}=3
  16376.     ENDIF
  16377.   dbs2d4:
  16378.     ~C:rr_songrecord_routine_no_realtime%()
  16379.     framelen%=LONG{ADD(r_songrecord_state%,34)}
  16380.     convlen1%=MIN(framelen%,DIV(MUL(SUB(longueur%,rec_pos%),4),win_bits%))
  16381.     convlen2%=MUL(DIV(convlen1%,4),win_bits%)
  16382.     adr_dest%=ADD(FN adr_buffer,ADD(mark_1%,rec_pos%))
  16383.   dbs2d5:
  16384.     ~C:g_convert_stereo16%(L:V:buffer$,L:adr_dest%,L:convlen1%,W:win_bits%,W:1)
  16385.     ADD rec_pos%,convlen2%
  16386.     cur_songpos%=CARD{r_mod_songpos%}
  16387.     IF cur_songpos%<>old_songpos%
  16388.       GOSUB affiche_progression(SUB(cur_songpos%,se.s2d_posstart%))
  16389.       old_songpos%=cur_songpos%
  16390.     ENDIF
  16391.   WEND
  16392. se.sm_do_record_song_to_block_norealtime_end:
  16393.   GOSUB stop_voices
  16394.   mark_2%=ADD(mark_1%,rec_pos%) AND -2
  16395.   GOSUB bee(FALSE)
  16396. RETURN
  16397. PROCEDURE se.sm_record_song_to_disk
  16398.   LOCAL erreur%
  16399.   LOCAL ok!
  16400.   LOCAL nfic$
  16401.   erreur%=0
  16402.   IF flag_registered!
  16403.     IF mark_len%<&H10000
  16404.       GOSUB dialog("STOP","Block too small. It must be greater than 64 Ko.|If you have a slow hard drive, the buffer must be as big|as possible, and select the lower recording speed.","Cancel",MOUSEX,MOUSEY)
  16405.       GOSUB affiche_panneau_sample
  16406.     ELSE IF freq_buffer%<12000
  16407.       GOSUB dialog("STOP","Recording frequency must be greater than 12 KHz.|For a low recording frequency, please select a low|recording speed.","Cancel",MOUSEX,MOUSEY)
  16408.       GOSUB affiche_panneau_sample
  16409.     ELSE
  16410.       ok!=TRUE
  16411.       IF se.s2d_monitor! AND freq_buffer%<DIV(DIV(98340,SUCC(se.s2d_prediv%)),3)
  16412.         GOSUB dialog("WARNING","Please select a lower recording frequency|to avoid bugs.","Continue|Cancel",MOUSEX,MOUSEY)
  16413.         IF bouton%=1
  16414.           ok!=FALSE
  16415.         ENDIF
  16416.         GOSUB affiche_panneau_sample
  16417.       ENDIF
  16418.       IF ok!
  16419.         GOSUB sjx_system_to_gem
  16420.         FILESELECT npath_sample$+next_sample$,nfile_sample$,nfic$
  16421.         GOSUB sjx_system_to_gtk
  16422.         GOSUB affiche_panneau_sample
  16423.         IF nfic$<>""
  16424.           IF se.s2d_monitor!
  16425.             GOSUB se.sm_do_record_song_to_disk(nfic$)
  16426.           ELSE
  16427.             GOSUB se.sm_do_record_song_to_disk_norealtime(nfic$)
  16428.           ENDIF
  16429.           GOSUB separe_nom_chemin(nfic$)
  16430.           nfile_sample$=nfile_$
  16431.           npath_sample$=npath_$
  16432.         ENDIF
  16433.       ENDIF
  16434.     ENDIF
  16435.   ELSE
  16436.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  16437.     GOSUB affiche_panneau_sample
  16438.   ENDIF
  16439. RETURN
  16440. PROCEDURE se.sm_do_record_song_to_disk(nfic$)
  16441.   '
  16442.   ' Attention, erreurs de disk non reperees!
  16443.   '
  16444.   LOCAL a%,longueur%,moitie%,next_buffer%,pointeur%
  16445.   LOCAL fin!,sortie!
  16446.   LOCAL handle_fichier%,code_erreur_fichier%
  16447.   LOCAL filename$
  16448.   LOCAL b$,npath_$,nfile_$
  16449.   GOSUB stop_voices
  16450.   GOSUB wait_mouse(TRUE)
  16451.   GOSUB bee(TRUE)
  16452.   filename$=nfic$+CHR$(0)
  16453.   handle_fichier%=GEMDOS(60,L:V:filename$,W:0)
  16454.   '
  16455.   ' Entete du format .AVR
  16456.   '
  16457.   IF next_sample$="*.AVR"
  16458.     GOSUB separe_nom_chemin(nfic$)      ! Recupere le nom
  16459.     b$=LEFT$(nfile_$,8)
  16460.     IF INSTR(b$,".")>1
  16461.       b$=LEFT$(b$,PRED(INSTR(b$,".")))
  16462.       IF LEN(b$)<8
  16463.         b$=b$+STRING$(SUB(8,LEN(b$)),0)
  16464.       ENDIF
  16465.     ENDIF
  16466.     b$="2BIT"+b$+MKI$(se.s2d_stereo%=2)+MKI$(SHL(se.s2d_bits%,3))+MKI$(-1)
  16467.     b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(freq_buffer%)+MKL$(0)+MKL$(0)+MKL$(0)      ! Longueur en samples pour 1 canal
  16468.     b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  16469.     b$=b$+STRING$(SUB(128,LEN(b$)),0)
  16470.     code_erreur_fichier%=FN fwrite(handle_fichier%,128,V:b$)
  16471.   ENDIF
  16472.   '
  16473.   ' Preparation des routines d'enregistrement
  16474.   '
  16475.   longueur%=mark_len% AND -SHL(MUL(se.s2d_bits%,se.s2d_stereo%),1)
  16476.   moitie%=SHR(longueur%,1)
  16477.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16478.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16479.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16480.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16481.   LONG{ADD(r_songrecord_state%,10)}=g_rec_sam_buffer%
  16482.   LONG{ADD(r_songrecord_state%,14)}=ADD(g_rec_sam_buffer%,4096)
  16483.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16484.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16485.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16486.   CARD{ADD(r_songrecord_state%,32)}=1           ! Realtime
  16487.   CARD{r_songrecord_state%}=0
  16488.   LONG{g_sngrec_paramadr%}=r_songrecord_state%
  16489.   LONG{ADD(g_sngrec_paramadr%,4)}=ADD(FN adr_buffer,mark_1%)
  16490.   LONG{ADD(g_sngrec_paramadr%,8)}=mark_len%
  16491.   LONG{ADD(g_sngrec_paramadr%,12)}=0
  16492.   LONG{ADD(g_sngrec_paramadr%,16)}=MUL(se.s2d_maxsize%,1024)
  16493.   LONG{ADD(g_sngrec_paramadr%,20)}=0
  16494.   CARD{ADD(g_sngrec_paramadr%,24)}=1
  16495.   CARD{ADD(g_sngrec_paramadr%,26)}=1
  16496.   CARD{ADD(g_sngrec_paramadr%,28)}=se.s2d_bits%
  16497.   CARD{ADD(g_sngrec_paramadr%,30)}=se.s2d_stereo%
  16498.   songpos%=se.s2d_posstart%
  16499.   next_buffer%=1
  16500.   sortie!=FALSE
  16501.   fin!=FALSE
  16502.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16503.   GOSUB play_song2(0)
  16504.   ~C:g_start_song_recording%(W:0)
  16505.   '
  16506.   ' Boucle d'enregistrement
  16507.   '
  16508.   REPEAT
  16509.     ' Position finale atteinte ?
  16510.     IF CARD{r_songrecord_state%}=4
  16511.       ~C:g_stop_song_recording%(W:0)
  16512.       sortie!=TRUE
  16513.     ENDIF
  16514.     ' Depasse le temps imparti ou la taille maxi ?
  16515.     IF CARD{ADD(g_sngrec_paramadr%,26)}=0
  16516.       sortie!=TRUE
  16517.     ENDIF
  16518.     ' Arret de l'utilisateur ?
  16519.     IF GEMDOS(11)<>0
  16520.       ~GEMDOS(7)
  16521.       sortie!=TRUE
  16522.     ENDIF
  16523.     ' On peut sauver un buffer ?
  16524.     pointeur%=LONG{ADD(g_sngrec_paramadr%,12)}
  16525.     IF next_buffer%=0
  16526.       IF pointeur%<moitie%
  16527.         code_erreur_fichier%=FN fwrite(handle_fichier%,moitie%,ADD(FN adr_buffer,ADD(mark_1%,moitie%)))
  16528.         next_buffer%=1
  16529.       ENDIF
  16530.     ELSE
  16531.       IF pointeur%>=moitie%
  16532.         code_erreur_fichier%=FN fwrite(handle_fichier%,moitie%,ADD(FN adr_buffer,mark_1%))
  16533.         next_buffer%=0
  16534.       ENDIF
  16535.     ENDIF
  16536.   UNTIL sortie!
  16537.   '
  16538.   ' On s'arrete d'enregistrer si on est sorti avant la fin
  16539.   '
  16540.   IF CARD{ADD(g_sngrec_paramadr%,26)}<>0
  16541.     ~C:g_stop_song_recording%(W:0)
  16542.   ENDIF
  16543.   IF CARD{r_songrecord_state%}<3
  16544.     CARD{r_songrecord_state%}=3
  16545.   ENDIF
  16546.   REPEAT
  16547.   UNTIL CARD{r_songrecord_state%}=4 AND CARD{ADD(g_sngrec_paramadr%,26)}=0
  16548.   CARD{r_songrecord_state%}=0
  16549.   GOSUB stop_voices
  16550.   '
  16551.   ' On sauve le debut du buffer qu'on enregistrait au moment de l'arret
  16552.   '
  16553.   pointeur%=LONG{ADD(g_sngrec_paramadr%,12)}
  16554.   IF next_buffer%=0
  16555.     code_erreur_fichier%=FN fwrite(handle_fichier%,SUB(pointeur%,moitie%),ADD(FN adr_buffer,ADD(mark_1%,moitie%)))
  16556.   ELSE
  16557.     code_erreur_fichier%=FN fwrite(handle_fichier%,pointeur%,ADD(FN adr_buffer,mark_1%))
  16558.   ENDIF
  16559.   '
  16560.   ' Sauve la taille dans l'entete si format .AVR
  16561.   '
  16562.   IF next_sample$="*.AVR"
  16563.     a%=DIV(LONG{ADD(g_sngrec_paramadr%,20)},MUL(se.s2d_bits%,se.s2d_stereo%))   ! Samples pour un canal
  16564.     code_erreur_fichier%=GEMDOS(66,L:&H1A,W:handle_fichier%,0)
  16565.     code_erreur_fichier%=FN fwrite(handle_fichier%,4,V:a%)      ! Taille totale du sample enregistre
  16566.   ENDIF
  16567.   '
  16568. se.sm_do_record_song_to_disk_end:
  16569.   code_erreur_fichier%=GEMDOS(62,W:handle_fichier%)
  16570.   IF code_erreur_fichier%<0
  16571.     erreur%=code_erreur_fichier%
  16572.   ENDIF
  16573.   GOSUB bee(FALSE)
  16574. RETURN
  16575. PROCEDURE se.sm_do_record_song_to_disk_norealtime(nfic$)
  16576.   '
  16577.   ' Attention, erreurs de disk non reperees!
  16578.   '
  16579.   LOCAL a%,adr_dest%,convlen1%,convlen2%,framelen%,longueur%,rec_pos%
  16580.   LOCAL cur_songpos%,old_songpos%
  16581.   LOCAL b$,buffer$
  16582.   LOCAL handle_fichier%,code_erreur_fichier%
  16583.   LOCAL filename$
  16584.   '
  16585.   GOSUB stop_voices
  16586.   GOSUB wait_mouse(TRUE)
  16587.   GOSUB bee(TRUE)
  16588.   filename$=nfic$+CHR$(0)
  16589.   handle_fichier%=GEMDOS(60,L:V:filename$,W:0)
  16590.   '
  16591.   ' En-tete du format .AVR
  16592.   '
  16593.   IF next_sample$="*.AVR"
  16594.     GOSUB separe_nom_chemin(nfic$)      ! Recupere le nom
  16595.     b$=LEFT$(nfile_$,8)
  16596.     IF INSTR(b$,".")>1
  16597.       b$=LEFT$(b$,PRED(INSTR(b$,".")))
  16598.       IF LEN(b$)<8
  16599.         b$=b$+STRING$(SUB(8,LEN(b$)),0)
  16600.       ENDIF
  16601.     ENDIF
  16602.     b$="2BIT"+b$+MKI$(se.s2d_stereo%=2)+MKI$(SHL(se.s2d_bits%,3))+MKI$(-1)
  16603.     b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(freq_buffer%)+MKL$(0)+MKL$(0)+MKL$(0)      ! Longueur en samples pour 1 canal
  16604.     b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  16605.     b$=b$+STRING$(SUB(128,LEN(b$)),0)
  16606.     code_erreur_fichier%=FN fwrite(handle_fichier%,128,V:b$)
  16607.   ENDIF
  16608.   '
  16609.   GOSUB affiche_panneau_progression("Please wait...",SUB(se.s2d_posend%,se.s2d_posstart%),-1,-1)
  16610.   old_songpos%=-1
  16611.   '
  16612.   ' Prepare l'enregistrement
  16613.   '
  16614.   buffer$=STRING$(8192,0)                       ! Il faut au moins 1200 * 2 * 2 octets
  16615.   longueur%=MUL(se.s2d_maxsize%,1024)
  16616.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16617.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16618.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16619.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16620.   LONG{ADD(r_songrecord_state%,10)}=V:buffer$
  16621.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16622.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16623.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16624.   CARD{ADD(r_songrecord_state%,32)}=0           ! Pas de realtime
  16625.   CARD{r_songrecord_state%}=0
  16626.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16627.   songpos%=se.s2d_posstart%
  16628.   GOSUB play_song2(0)
  16629.   REPEAT                                        ! Attend le debut de l'enregistrement
  16630.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16631.       ~GEMDOS(7)
  16632.       CARD{r_songrecord_state%}=3
  16633.       GOTO se.sm_do_record_song_to_disk_norealtime_end
  16634.     ENDIF
  16635.     IF MOUSEK=2                                 ! Arret souris?
  16636.       CARD{r_songrecord_state%}=3
  16637.       GOTO se.sm_do_record_song_to_disk_norealtime_end
  16638.     ENDIF
  16639.   UNTIL CARD{r_songrecord_state%}=2
  16640.   rec_pos%=0                                    ! Position dans l'enregistrement
  16641.   '
  16642.   ' Boucle d'enregistrement
  16643.   '
  16644.   WHILE CARD{r_songrecord_state%}=2
  16645.     IF rec_pos%>=longueur%                      ! Fin atteinte?
  16646.       CARD{r_songrecord_state%}=3
  16647.     ENDIF
  16648.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16649.       ~GEMDOS(7)
  16650.       CARD{r_songrecord_state%}=3
  16651.     ENDIF
  16652.     IF MOUSEK=2                                 ! Arret souris?
  16653.       CARD{r_songrecord_state%}=3
  16654.     ENDIF
  16655.     ~C:rr_songrecord_routine_no_realtime%()
  16656.     framelen%=LONG{ADD(r_songrecord_state%,34)}
  16657.     convlen1%=MIN(framelen%,DIV(MUL(SUB(longueur%,rec_pos%),4),MUL(se.s2d_bits%,se.s2d_stereo%)))
  16658.     convlen2%=MUL(DIV(convlen1%,4),MUL(se.s2d_bits%,se.s2d_stereo%))
  16659.     adr_dest%=ADD(FN adr_buffer,mark_1%)
  16660.     ~C:g_convert_stereo16%(L:V:buffer$,L:adr_dest%,L:convlen1%,W:se.s2d_bits%,W:se.s2d_stereo%)
  16661.     code_erreur_fichier%=FN fwrite(handle_fichier%,convlen2%,adr_dest%)
  16662.     ADD rec_pos%,convlen2%
  16663.     cur_songpos%=CARD{r_mod_songpos%}
  16664.     IF cur_songpos%<>old_songpos%
  16665.       GOSUB affiche_progression(SUB(cur_songpos%,se.s2d_posstart%))
  16666.       old_songpos%=cur_songpos%
  16667.     ENDIF
  16668.   WEND
  16669.   GOSUB stop_voices
  16670.   '
  16671.   IF next_sample$="*.AVR"
  16672.     a%=rec_pos%
  16673.     code_erreur_fichier%=GEMDOS(66,L:&H1A,W:handle_fichier%,0)
  16674.     code_erreur_fichier%=FN fwrite(handle_fichier%,4,V:a%)      ! Taille totale du sample enregistre
  16675.   ENDIF
  16676.   '
  16677. se.sm_do_record_song_to_disk_norealtime_end:
  16678.   code_erreur_fichier%=GEMDOS(62,W:handle_fichier%)
  16679.   IF code_erreur_fichier%<0
  16680.     erreur%=code_erreur_fichier%
  16681.   ENDIF
  16682.   '
  16683.   GOSUB stop_voices
  16684.   GOSUB bee(FALSE)
  16685. RETURN
  16686. ' Compression
  16687. PROCEDURE se.sm_affsm_compression
  16688.   GOSUB cadre_int(orc%,ADD(ory%,80),17,59,13,13,14,12)
  16689.   GOSUB cadre_int(ADD(orc%,18),ADD(ory%,80),61,59,13,13,14,12)
  16690.   GOSUB affiche_bloc_icones_b(0,9,26,orc%,ory%)
  16691.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,1,26)),7),ADD(ADD(ory%,divbi&(1,1,26)),2),1,5,0,13,12,14)
  16692.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,4,26)),1),ADD(ADD(ory%,divbi&(1,4,26)),2),27,5,0,13,12,14)
  16693.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,5,26)),7),ADD(ADD(ory%,divbi&(1,5,26)),2),4,5,0,13,12,14)
  16694.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,6,26)),7),ADD(ADD(ory%,divbi&(1,6,26)),2),1,5,0,13,12,14)
  16695.   GOSUB se.sm_actsm_compression
  16696. RETURN
  16697. PROCEDURE se.sm_actsm_compression
  16698.   se.comp_initvolume%=se.comp_level%            !!!!!!!!!!!!!!!!!!!!!!!! Pour l'instant...
  16699.   GOSUB affchaine_notrans(FN pourcent$(se.comp_level%,32768),ADD(ADD(orc%,divbi&(0,5,26)),7),ADD(ADD(ory%,divbi&(1,5,26)),2),1)
  16700.   GOSUB affchaine_notrans(STR$(DIV(se.comp_speed%,1000),2),ADD(ADD(orc%,divbi&(0,6,26)),7),ADD(ADD(ory%,divbi&(1,6,26)),2),1)
  16701.   IF se.comp_source%>0
  16702.     GOSUB affchaine_notrans(HEX$(se.comp_source%,2),ADD(orc%,ADD(divbi&(0,1,26),7)),ADD(ory%,ADD(divbi&(1,1,26),2)),1)
  16703.     GOSUB affchaine_notrans(FN samplename$(se.comp_source%),ADD(orc%,ADD(divbi&(0,4,26),1)),ADD(ory%,ADD(divbi&(1,4,26),2)),1)
  16704.   ELSE
  16705.     GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,1,26),7)),ADD(ory%,ADD(divbi&(1,1,26),2)),1)
  16706.     GOSUB affchaine_notrans("Block"+SPACE$(23),ADD(orc%,ADD(divbi&(0,4,26),1)),ADD(ory%,ADD(divbi&(1,4,26),2)),1)
  16707.   ENDIF
  16708. RETURN
  16709. PROCEDURE se.sm_gere_compression
  16710.   ' Var locales de Sample_Editor :
  16711.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  16712.   ' Utilise srt%, a%, flag_relachement!
  16713.   LOCAL am%,b%,lon_sam%,taille_buffer%
  16714.   LOCAL a$,buffer$
  16715.   ~FRE(0)
  16716.   IF km%>0
  16717.     a%=V:divbi&(0,0,0)
  16718.     srt%=C:g_teste_icones%(L:a%,W:26,W:xm2%,W:ym2%)
  16719.     IF srt%>=0
  16720.       SELECT srt%
  16721.         ' Radio-boutons, Flip-flops ou champs de texte
  16722.         ' ------------------------------------------------------------------
  16723.       CASE 1            ! Numero de sample
  16724.         GOSUB edite_chaine(HEX$(se.comp_source%,2),ADD(orc%,ADD(divbi&(0,srt%,26),7)),ADD(ory%,ADD(divbi&(1,srt%,26),2)),2,2)
  16725.         se.comp_source%=MIN(MAX(VAL("$"+bbbb$),0),255)
  16726.         GOSUB se.sm_actsm_compression
  16727.         ' --------------------------------------------------------------------
  16728.       CASE 2,3          ! Numero +/-
  16729.         se.comp_source%=MAX(MIN(ADD(se.comp_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,2),km%))),255),0)
  16730.         GOSUB se.sm_actsm_compression
  16731.         IF km%=1
  16732.           PAUSE 8
  16733.         ENDIF
  16734.         flag_relachement!=FALSE
  16735.         ' --------------------------------------------------------------------
  16736.       CASE 4            ! Nom du sample source
  16737.         ' Aucun effet
  16738.         ' --------------------------------------------------------------------
  16739.       CASE 5            ! Level
  16740.         GOSUB edite_chaine(FN pourcent$(se.comp_level%,32768),ADD(orc%,ADD(divbi&(0,srt%,26),7)),ADD(ory%,ADD(divbi&(1,srt%,26),2)),5,3)
  16741.         se.comp_level%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  16742.         GOSUB se.sm_actsm_compression
  16743.         ' --------------------------------------------------------------------
  16744.       CASE 6            ! Speed
  16745.         DIV se.comp_speed%,1000
  16746.         GOSUB edite_chaine(STR$(se.comp_speed%,2),ADD(orc%,ADD(divbi&(0,srt%,26),7)),ADD(ory%,ADD(divbi&(1,srt%,26),2)),2,2)
  16747.         se.comp_speed%=MIN(MAX(VAL(bbbb$),1),99)
  16748.         MUL se.comp_speed%,1000
  16749.         GOSUB se.sm_actsm_compression
  16750.         ' --------------------------------------------------------------------
  16751.       CASE 7,8          ! Speed +/-
  16752.         DIV se.comp_speed%,1000
  16753.         se.comp_speed%=MAX(MIN(ADD(se.comp_speed%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,7),km%))),99),1)
  16754.         MUL se.comp_speed%,1000
  16755.         GOSUB se.sm_actsm_compression
  16756.         IF km%=1
  16757.           PAUSE 8
  16758.         ENDIF
  16759.         flag_relachement!=FALSE
  16760.         ' --------------------------------------------------------------------
  16761.       DEFAULT
  16762.         ' Icones normales
  16763.         GOSUB affiche_icone_b(srt%,26,orc%,ory%,-1)
  16764.         GOSUB wait_mouse(TRUE)
  16765.         SELECT srt%
  16766.           ' ------------------------------------------------------------------
  16767.         CASE 0          ! Do
  16768.           GOSUB bee(TRUE)
  16769.           a$=STRING$(256,0)
  16770.           speed%=MAX(INT(freq_buffer%*se.comp_speed%/1E+06),1)
  16771.           taille_buffer%=MIN(SHL(DIV(freq_buffer%,50),1),60000) ! 1/50 de seconde en 16 bits
  16772.           buffer$=STRING$(taille_buffer%,0)
  16773.           IF se.comp_source%>0
  16774.             a%=FN length(se.comp_source%)
  16775.             b%=FN resol(se.comp_source%)
  16776.             lon_sam%=MUL(MIN(DIV(a%,b%),DIV(mark_len%,win_bits%)),b%)
  16777.             LONG{ADD(V:a$,0)}=FN adresse(se.comp_source%)       ! Adresse source
  16778.             CARD{ADD(V:a$,20)}=b%                               ! Resolution source
  16779.           ELSE
  16780.             LONG{ADD(V:a$,0)}=ADD(FN adr_buffer,mark_1%)
  16781.             CARD{ADD(V:a$,20)}=win_bits%
  16782.             lon_sam%=mark_len%
  16783.           ENDIF
  16784.           LONG{ADD(V:a$,12)}=lon_sam%                   ! Longueur source
  16785.           LONG{ADD(V:a$,4)}=ADD(FN adr_buffer,mark_1%)  ! Adresse dest.
  16786.           LONG{ADD(V:a$,16)}=taille_buffer%             ! Adresse buffer
  16787.           CARD{ADD(V:a$,22)}=win_bits%                  ! Resol dest
  16788.           LONG{ADD(V:a$,24)}=speed%                     ! Speed
  16789.           LONG{ADD(V:a$,28)}=SHL(se.comp_level%,1)      ! Niveau
  16790.           LONG{ADD(V:a$,32)}=SHL(se.comp_initvolume%,1) ! Volume initial
  16791.           LONG{ADD(V:a$,8)}=V:buffer$                   ! Adresse buffer
  16792.           a%=V:a$
  16793.           ~C:g_fx_compression%(L:a%)
  16794.           GOSUB affiche_sample
  16795.           GOSUB bee(FALSE)
  16796.           ' ------------------------------------------------------------------
  16797.         ENDSELECT
  16798.         GOSUB affiche_icone_b(srt%,26,orc%,ory%,0)
  16799.       ENDSELECT
  16800.       GOSUB wait_mouse(flag_relachement!)
  16801.       flag_relachement!=TRUE
  16802.       GOSUB vide_buffer_clavier
  16803.     ENDIF
  16804.   ENDIF
  16805. RETURN
  16806. ' Distortion
  16807. PROCEDURE se.sm_affsm_distortion
  16808.   GOSUB cadre_int(orc%,ADD(ory%,80),15,59,13,13,14,12)
  16809.   GOSUB cadre_int(ADD(orc%,16),ADD(ory%,80),63,59,13,13,14,12)
  16810.   GOSUB affiche_bloc_icones_b(0,8,29,orc%,ory%)
  16811.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,1,29)),7),ADD(ADD(ory%,divbi&(1,1,29)),2),1,5,0,13,12,14)
  16812.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,4,29)),1),ADD(ADD(ory%,divbi&(1,4,29)),2),27,5,0,13,12,14)
  16813.   GOSUB cadre_ext(ADD(ADD(orc%,divbi&(0,5,29)),5),ADD(ADD(ory%,divbi&(1,5,29)),2),4,5,0,13,12,14)
  16814.   GOSUB se.sm_actsm_distortion
  16815. RETURN
  16816. PROCEDURE se.sm_actsm_distortion
  16817.   GOSUB affchaine_notrans(FN pourcent$(se.disto_gain%,32768),ADD(ADD(orc%,divbi&(0,5,29)),5),ADD(ADD(ory%,divbi&(1,5,29)),2),1)
  16818.   IF se.disto_source%>0
  16819.     GOSUB affchaine_notrans(HEX$(se.disto_source%,2),ADD(orc%,ADD(divbi&(0,1,29),7)),ADD(ory%,ADD(divbi&(1,1,29),2)),1)
  16820.     GOSUB affchaine_notrans(FN samplename$(se.disto_source%),ADD(orc%,ADD(divbi&(0,4,29),1)),ADD(ory%,ADD(divbi&(1,4,29),2)),1)
  16821.   ELSE
  16822.     GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,1,29),7)),ADD(ory%,ADD(divbi&(1,1,29),2)),1)
  16823.     GOSUB affchaine_notrans("Block"+SPACE$(23),ADD(orc%,ADD(divbi&(0,4,29),1)),ADD(ory%,ADD(divbi&(1,4,29),2)),1)
  16824.   ENDIF
  16825. RETURN
  16826. PROCEDURE se.sm_gere_distortion         !!!
  16827.   ' Var locales de Sample_Editor :
  16828.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  16829.   ' Utilise srt%, a%, flag_relachement!
  16830.   LOCAL adr_source%,adr_dest%,i%,pas%,sens%
  16831.   LOCAL gain#,invgain#,puissance#
  16832.   ~FRE(0)
  16833.   IF km%>0
  16834.     a%=V:divbi&(0,0,0)
  16835.     srt%=C:g_teste_icones%(L:a%,W:29,W:xm2%,W:ym2%)
  16836.     IF srt%>=0
  16837.       SELECT srt%
  16838.         ' Radio-boutons, Flip-flops ou champs de texte
  16839.         ' ------------------------------------------------------------------
  16840.       CASE 1            ! Numero de sample
  16841.         GOSUB edite_chaine(HEX$(se.disto_source%,2),ADD(orc%,ADD(divbi&(0,srt%,29),7)),ADD(ory%,ADD(divbi&(1,srt%,29),2)),2,2)
  16842.         se.disto_source%=MIN(MAX(VAL("$"+bbbb$),0),255)
  16843.         GOSUB se.sm_actsm_distortion
  16844.         ' --------------------------------------------------------------------
  16845.       CASE 2,3          ! Numero +/-
  16846.         se.disto_source%=MAX(MIN(ADD(se.disto_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,2),km%))),255),0)
  16847.         GOSUB se.sm_actsm_distortion
  16848.         IF km%=1
  16849.           PAUSE 8
  16850.         ENDIF
  16851.         flag_relachement!=FALSE
  16852.         ' --------------------------------------------------------------------
  16853.       CASE 4            ! Nom du sample source
  16854.         ' Aucun effet
  16855.         ' --------------------------------------------------------------------
  16856.       CASE 5            ! Gain
  16857.         GOSUB edite_chaine(FN pourcent$(se.disto_gain%,32768),ADD(orc%,ADD(divbi&(0,srt%,29),5)),ADD(ory%,ADD(divbi&(1,srt%,29),2)),5,3)
  16858.         se.disto_gain%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  16859.         GOSUB se.sm_actsm_distortion
  16860.         ' --------------------------------------------------------------------
  16861.       CASE 6,7          ! Gain +/- (par pas de 5/10%)
  16862.         pas%=SUB(5,MUL(5,BTST(km%,1)))
  16863.         sens%=MUL(SUB(1,SHL(SUB(srt%,6),1)),pas%)
  16864.         a%=INT(se.disto_gain%*100/32768+0.0999)
  16865.         a%=ADD(MUL(DIV(a%,pas%),pas%),sens%)
  16866.         se.disto_gain%=DIV(32768*MIN(MAX(a%,0),999.9),100)
  16867.         GOSUB se.sm_actsm_distortion
  16868.         IF km%=1
  16869.           PAUSE 8
  16870.         ENDIF
  16871.         flag_relachement!=FALSE
  16872.         ' --------------------------------------------------------------------
  16873.       DEFAULT
  16874.         ' Icones normales
  16875.         GOSUB affiche_icone_b(srt%,29,orc%,ory%,-1)
  16876.         GOSUB wait_mouse(TRUE)
  16877.         SELECT srt%
  16878.           ' ------------------------------------------------------------------
  16879.         CASE 0          ! Do
  16880.           GOSUB bee(TRUE)
  16881.           gain#=se.disto_gain%/32768
  16882.           puissance#=se.disto_initpower%+MAX(SUB(se.disto_gain%,32768),0)/32768
  16883.           gain#=gain#*EXP(puissance#)
  16884.           adr_dest%=ADD(FN adr_buffer,mark_1%)
  16885.           IF win_bits%=2
  16886.             gain#=gain#/32768
  16887.             invgain#=32768/LOG(1+MAX(32768*gain#,EXP(se.disto_initpower%)))
  16888.             FOR i%=0 TO PRED(SHR(mark_len%,1))
  16889.               a%=INT{adr_dest%}
  16890.               IF a%>0
  16891.                 a%=LOG(1+a%*gain#)*invgain#
  16892.               ELSE IF a%<0
  16893.                 a%=-LOG(1-a%*gain#)*invgain#
  16894.               ENDIF
  16895.               INT{adr_dest%}=a%
  16896.               ADD adr_dest%,2
  16897.             NEXT i%
  16898.           ELSE
  16899.             gain#=gain#/128
  16900.             invgain#=128/LOG(1+MAX(128*gain#,EXP(se.disto_initpower%)))
  16901.             FOR i%=0 TO PRED(mark_len%)
  16902.               a%=FN sbyte(BYTE{adr_dest%})
  16903.               IF a%>0
  16904.                 a%=LOG(1+a%*gain#)*invgain#
  16905.               ELSE IF a%<0
  16906.                 a%=-LOG(1-a%*gain#)*invgain#
  16907.               ENDIF
  16908.               BYTE{adr_dest%}=a%
  16909.               INC adr_dest%
  16910.             NEXT i%
  16911.           ENDIF
  16912.           GOSUB affiche_sample
  16913.           GOSUB bee(FALSE)
  16914.           ' ------------------------------------------------------------------
  16915.         ENDSELECT
  16916.         GOSUB affiche_icone_b(srt%,29,orc%,ory%,0)
  16917.       ENDSELECT
  16918.       GOSUB wait_mouse(flag_relachement!)
  16919.       flag_relachement!=TRUE
  16920.       GOSUB vide_buffer_clavier
  16921.     ENDIF
  16922.   ENDIF
  16923. RETURN
  16924. '
  16925. '
  16926. '
  16927. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16928. ' *                                                                          *
  16929. ' *                                Fonctions                                 *
  16930. ' *                                                                          *
  16931. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16932. '
  16933. FUNCTION vire_xbra(adr%,id%,mask%,vire!)
  16934.   LOCAL a%,c%
  16935.   LOCAL flag!,found!
  16936.   found!=FALSE
  16937.   a%=LPEEK(adr%)
  16938.   flag!=FALSE
  16939.   WHILE LPEEK(MAX(SUB(a%,12),0))=CVL("XBRA")
  16940.     IF (LPEEK(SUB(a%,8)) AND mask%)=(id% AND mask%)
  16941.       found!=TRUE
  16942.       IF vire!
  16943.         c%=adr%
  16944.         IF flag!
  16945.           SUB c%,4
  16946.         ENDIF
  16947.         xbra_remove$=xbra_remove$+MKL$(c%)+MKL$(a%)
  16948.         SLPOKE c%,LPEEK(SUB(a%,4))
  16949.       ENDIF
  16950.     ENDIF
  16951.     adr%=a%
  16952.     a%=LPEEK(SUB(a%,4))
  16953.     flag!=TRUE
  16954.   WEND
  16955.   RETURN found!
  16956. ENDFUNC
  16957. FUNCTION exist(a$)
  16958.   ' Cherche si le fichier a$ existe (jockers autorises)
  16959.   LOCAL dta$,masque_fichier$
  16960.   dta$=STRING$(44,0)
  16961.   masque_fichier$=a$+CHR$(0)
  16962.   ~FRE(0)
  16963.   ~GEMDOS(&H1A,L:V:dta$)
  16964.   IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  16965.     RETURN TRUE
  16966.   ELSE
  16967.     RETURN FALSE
  16968.   ENDIF
  16969. ENDFUNC
  16970. FUNCTION backup_file(a$)
  16971.   LOCAL e%,a%
  16972.   LOCAL b$,c$
  16973.   IF FN exist(a$)
  16974.     b$=RIGHT$(a$,4)
  16975.     a%=ADD(INSTR(b$,"."),SUB(LEN(a$),4))
  16976.     b$=LEFT$(a$,a%)                             ! On a le fichier sans l'extention (mais avec le .)
  16977.     c$=b$+"BAK"+CHR$(0)
  16978.     IF FN exist(c$)
  16979.       e%=SHL(GEMDOS(65,L:V:c$),16)              ! Detruit l'ancien .BAK
  16980.     ELSE
  16981.       e%=0
  16982.     ENDIF
  16983.     a$=a$+CHR$(0)
  16984.     ADD e%,GEMDOS(86,0,L:V:a$,L:V:c$) AND 65535 ! Renome
  16985.   ENDIF
  16986.   RETURN e%
  16987.   ~FRE(0)
  16988. ENDFUNC
  16989. FUNCTION last_pat_util
  16990.   ' Indique le dernier pattern utilise
  16991.   LOCAL aaaaa%,iiiii%
  16992.   aaaaa%=0
  16993.   FOR iiiii%=0 TO PRED(module&(101))
  16994.     aaaaa%=MAX(aaaaa%,song&(iiiii%))
  16995.   NEXT iiiii%
  16996.   RETURN aaaaa%
  16997. ENDFUNC
  16998. FUNCTION last_spl_util
  16999.   ' Indique le dernier sample utilise (min 1)
  17000.   LOCAL iiii%,aaaa%
  17001.   aaaa%=1
  17002.   FOR iiii%=1 TO 255
  17003.     IF FN length(iiii%)>0
  17004.       aaaa%=iiii%
  17005.     ENDIF
  17006.   NEXT iiii%
  17007.   RETURN aaaa%
  17008. ENDFUNC
  17009. FUNCTION last_spl_util2
  17010.   ' Indique le dernier instrument utilisant un sample non-vide en C-2 (min 1)
  17011.   LOCAL iiii%,aaaa%
  17012.   aaaa%=1
  17013.   FOR iiii%=1 TO 255
  17014.     IF FN length(FN isample(iiii%,48))>0
  17015.       aaaa%=iiii%
  17016.     ENDIF
  17017.   NEXT iiii%
  17018.   RETURN aaaa%
  17019. ENDFUNC
  17020. FUNCTION nbr_lines_maxi
  17021.   LOCAL iiii%
  17022.   aaaa%=1
  17023.   FOR iiii%=0 TO FN last_pat_util
  17024.     aaaa%=MAX(aaaa%,FN nbr_lines(iiii%))
  17025.   NEXT iiii%
  17026.   RETURN aaaa%
  17027. ENDFUNC
  17028. FUNCTION songcomment$
  17029.   LOCAL aaaa$
  17030.   aaaa$=SPACE$(160)
  17031.   BMOVE V:module&(18),V:aaaa$,160
  17032.   RETURN aaaa$
  17033. ENDFUNC
  17034. FUNCTION songname$
  17035.   LOCAL aaaa$
  17036.   aaaa$=SPACE$(32)
  17037.   BMOVE V:module&(2),V:aaaa$,32
  17038.   RETURN aaaa$
  17039. ENDFUNC
  17040. FUNCTION patternname$(pppp%)
  17041.   LOCAL aaaa$
  17042.   aaaa$=SPACE$(16)
  17043.   BMOVE ADD(FN adr_patchunk(pppp%),10),V:aaaa$,16
  17044.   RETURN aaaa$
  17045. ENDFUNC
  17046. FUNCTION samplename$(ssss%)
  17047.   LOCAL iiii%,aaaa$
  17048.   aaaa$=""
  17049.   FOR iiii%=10 TO 34 STEP 4
  17050.     aaaa$=aaaa$+MKL$(LONG{ADD(FN adrsamchk(ssss%),iiii%)})
  17051.   NEXT iiii%
  17052.   RETURN aaaa$
  17053. ENDFUNC
  17054. FUNCTION pourcent$(aaaa%,bbbb%)
  17055.   ' Transforme aaaa%/bbbb% en "xxx.x" %
  17056.   ' Arrondissement par exces
  17057.   RETURN RIGHT$("  "+STR$(INT(aaaa%*100/bbbb%+0.0999)),3)+"."+RIGHT$(STR$(INT(aaaa%*1000/bbbb%+0.999)),1)
  17058. ENDFUNC
  17059. FUNCTION pourcent2$(aaaa%,bbbb%)
  17060.   ' Transforme aaaa%/bbbb% en "xxx %" ou en "done." si 100% ou +
  17061.   ' Arrondissement par defaut
  17062.   IF aaaa%<bbbb%
  17063.     RETURN STR$(INT(aaaa%*100/bbbb%),3)+" %"
  17064.   ELSE
  17065.     RETURN "done."
  17066.   ENDIF
  17067. ENDFUNC
  17068. FUNCTION time_hmsd$(t%)
  17069.   LOCAL h%,m%,s%,d%
  17070.   LOCAL a$
  17071.   h%=DIV(t%,720000)
  17072.   m%=DIV(t%,12000) MOD 60
  17073.   s%=DIV(t%,200) MOD 60
  17074.   d%=t% MOD 200
  17075.   a$=STR$(h%)+":"+STR$(DIV(m%,10))+STR$(m% MOD 10)+"'"+STR$(DIV(s%,10))+STR$(s% MOD 10)+""""+STR$(DIV(d%,20))
  17076.   RETURN a$
  17077. ENDFUNC
  17078. FUNCTION fft(aaaa%,tttt%,llll%,ffffe%,ffff0%,bbbb%)
  17079.   ' aaaa% = adresse du sample, tttt %= adresse d'une table de 1.25*4096 sinus 16 bits
  17080.   ' llll% = longueur en octets, ffffe% = freq d'ech, ffff0% = freq recherchee
  17081.   ' bbbb% = nombre d'octets par sample
  17082.   LOCAL cccc%,dddd#,eeee#,ffff#
  17083.   cccc%=C:g_trans_fourier%(L:aaaa%,L:llll%,L:ffffe%,L:ffff0%,W:bbbb%,L:tttt%)
  17084.   eeee#=LONG{cccc%}
  17085.   ffff#=LONG{ADD(cccc%,4)}
  17086.   dddd#=SQR((eeee#*eeee#+ffff#*ffff#))/1.07374E+09            ! Module (variant de 0 a 1)
  17087.   RETURN dddd#
  17088. ENDFUNC
  17089. FUNCTION spl_cherche_volume(dddd%,llll%,bbbb%)
  17090.   ' Cherche le volume du sample position dddd%, longueur llll%, resol bbbb%
  17091.   LOCAL aaaa%,cccc%
  17092.   cccc%=ADD(FN adr_buffer,dddd%)
  17093.   aaaa%=C:g_cherche_volume_sample%(L:cccc%,L:llll%,W:bbbb%)
  17094.   aaaa%=SHL(aaaa%,SHL(SUB(2,bbbb%),3))              ! Recalibre /32768
  17095.   RETURN aaaa%
  17096. ENDFUNC
  17097. FUNCTION hexasigne$(vvvv%,llll%)
  17098.   ' Renvoie une chaine en hexa signe, avec llll% chiffre (+ le signe)
  17099.   IF vvvv%>=0
  17100.     RETURN "+"+HEX$(vvvv%,llll%)
  17101.   ELSE
  17102.     RETURN "-"+HEX$(ABS(vvvv%),llll%)
  17103.   ENDIF
  17104. ENDFUNC
  17105. FUNCTION valhexasigne(aaaa$)
  17106.   ' Renvoie la valeur d'une chaine hexa signee, avec ou sans '$'
  17107.   LOCAL a%
  17108.   a%=INSTR(aaaa$,"$")
  17109.   IF a%>0
  17110.     aaaa$=LEFT$(aaaa$,PRED(a%))+RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))
  17111.   ENDIF
  17112.   a%=INSTR(aaaa$,"+")
  17113.   IF a%>0
  17114.     RETURN VAL("$"+TRIM$(RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))))
  17115.   ELSE
  17116.     a%=INSTR(aaaa$,"-")
  17117.     IF a%>0
  17118.       RETURN -VAL("$"+TRIM$(RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))))
  17119.     ELSE
  17120.       RETURN VAL("$"+TRIM$(aaaa$))
  17121.     ENDIF
  17122.   ENDIF
  17123. ENDFUNC
  17124. FUNCTION sbyte(a%)
  17125.   ' Retablit la signature d'un octet et enleve les bits inutiles
  17126.   a%=a% AND 255
  17127.   IF a%>127
  17128.     RETURN SUB(a%,256)
  17129.   ELSE
  17130.     RETURN a%
  17131.   ENDIF
  17132. ENDFUNC
  17133. FUNCTION squartet(a%)
  17134.   ' Retablit la signature d'un quartet et enleve les bits inutiles
  17135.   a%=a% AND 15
  17136.   IF a%>7
  17137.     RETURN SUB(a%,16)
  17138.   ELSE
  17139.     RETURN a%
  17140.   ENDIF
  17141. ENDFUNC
  17142. FUNCTION donne_combinaison_touche$(am%,ae%,bm%,be%)
  17143.   LOCAL scancode%
  17144.   LOCAL tot$,t$
  17145.   LOCAL all_keys_done!
  17146.   tot$=""
  17147.   IF ae%=0
  17148.     tot$="nokey"
  17149.   ELSE
  17150.     all_keys_done!=FALSE
  17151.     REPEAT
  17152.       ' Touche principale
  17153.       t$=""
  17154.       IF (am% AND &HFF)=&HFF                    ! Ascii
  17155.         t$=t$+CHR$(ae% AND &HFF)
  17156.       ELSE IF (am% AND &HFF0000)=&HFF0000       ! Scan
  17157.         scancode%=SHR(ae%,16) AND &HFF
  17158.         SELECT scancode%
  17159.         CASE 1                                  ! Esc
  17160.           t$=t$+"esc"
  17161.         CASE 2                                  ! &
  17162.           t$=t$+"&"
  17163.         CASE 14                                 ! Backspace
  17164.           t$=t$+"backspace"
  17165.         CASE 15                                 ! Tab
  17166.           t$=t$+"tab"
  17167.         CASE 28                                 ! Return
  17168.           t$=t$+"return"
  17169.         CASE 43                                 ! #
  17170.           t$=t$+"#"
  17171.         CASE 57                                 ! Space
  17172.           t$=t$+"space"
  17173.         CASE 59 TO 68                           ! F1 - F10
  17174.           t$=t$+"f"+STR$(SUB(scancode%,58))
  17175.         CASE 71                                 ! Clr
  17176.           t$=t$+"clr"
  17177.         CASE 72                                 ! Up
  17178.           t$=t$+"up"
  17179.         CASE 75                                 ! Left
  17180.           t$=t$+"left"
  17181.         CASE 77                                 ! Right
  17182.           t$=t$+"right"
  17183.         CASE 80                                 ! Down
  17184.           t$=t$+"down"
  17185.         CASE 82                                 ! Ins
  17186.           t$=t$+"ins"
  17187.         CASE 83                                 ! Del
  17188.           t$=t$+"del"
  17189.         CASE 96                                 ! <
  17190.           t$=t$+"<"
  17191.         CASE 97                                 ! Undo
  17192.           t$=t$+"undo"
  17193.         CASE 98                                 ! help
  17194.           t$=t$+"help"
  17195.         CASE 112                                ! Pad0
  17196.           t$=t$+"pad0"
  17197.         CASE 113                                ! Padpoint
  17198.           t$=t$+"padpoint"
  17199.         ENDSELECT
  17200.       ELSE IF BTST(ae%,9)                       ! Numpad
  17201.         t$=t$+"numpad"
  17202.       ELSE IF BTST(ae%,10)                      ! Fkeys
  17203.         t$=t$+"fkeys"
  17204.       ENDIF
  17205.       ' Touches auxiliaires
  17206.       IF BTST(ae%,8)                            ! Shift
  17207.         t$=t$+" + shift"
  17208.       ENDIF
  17209.       IF BTST(ae%,24)                           ! Rshift
  17210.         t$=t$+" + rshift"
  17211.       ENDIF
  17212.       IF BTST(ae%,25)                           ! Lshift
  17213.         t$=t$+" + lshift"
  17214.       ENDIF
  17215.       IF BTST(ae%,26)                           ! Ctrl
  17216.         t$=t$+" + ctrl"
  17217.       ENDIF
  17218.       IF BTST(ae%,27)                           ! Alt
  17219.         t$=t$+" + alt"
  17220.       ENDIF
  17221.       IF BTST(am%,28)
  17222.         IF BTST(ae%,28)                         ! caps
  17223.           t$=t$+" + caps"
  17224.         ELSE
  17225.           t$=t$+" + nocaps"                     ! No caps
  17226.         ENDIF
  17227.       ENDIF
  17228.       IF INSTR(t$," + ")=1
  17229.         t$=RIGHT$(t$,SUB(LEN(t$),3))
  17230.       ENDIF
  17231.       tot$=tot$+t$
  17232.       IF be%=0
  17233.         all_keys_done!=TRUE
  17234.       ELSE
  17235.         tot$=tot$+" / "
  17236.         SWAP am%,bm%
  17237.         SWAP ae%,be%
  17238.         bm%=0
  17239.         be%=0
  17240.       ENDIF
  17241.     UNTIL all_keys_done!
  17242.   ENDIF
  17243.   RETURN tot$
  17244. ENDFUNC
  17245. FUNCTION vol_exp_2_lin(b%)
  17246.   IF b%<=0
  17247.     RETURN 0
  17248.   ELSE
  17249.     RETURN MAX(MIN(ROUND(2^(b%/256)),&HFFFF),0)
  17250.   ENDIF
  17251. ENDFUNC
  17252. FUNCTION vol_lin_2_exp(b%)
  17253.   IF b%<=0
  17254.     RETURN 0
  17255.   ELSE
  17256.     RETURN MAX(MIN(ROUND(256*LOG(b%)/LOG(2)),&HFFF),0)
  17257.   ENDIF
  17258. ENDFUNC
  17259. ' Sample Editor
  17260. FUNCTION se.sm_fft_tot(fmin%,fmax%,fech%,nfreq%,adr%,lon%,bits%,flagc!,flagd!)
  17261.   ' Renvoie dans fft&() les puissances (15 bits) de nfreq%
  17262.   ' frequences de fmin%...fmax% puis la frequence.w du sample
  17263.   LOCAL a%,i%,pc%,pctot%,pcnxt%,a#,b#,coef#,p#,pm#,f1#,f2#,tabl$
  17264.   ~FRE(0)
  17265.   ARRAYFILL fft&(),0
  17266.   IF flagd!
  17267.     GOSUB bee(TRUE)
  17268.   ENDIF
  17269.   tabl$=STRING$(8192,0)
  17270.   a%=V:tabl$
  17271.   a#=PI/2048
  17272.   FOR i%=0 TO 1024                      ! Calcul de la table
  17273.     INT{a%}=ROUND(SIN(i%*a#)*32767)
  17274.     ADD a%,2
  17275.   NEXT i%
  17276.   FOR i%=4 TO 4092 STEP 4
  17277.     INT{a%}=INT{SUB(a%,i%)}
  17278.     ADD a%,2
  17279.   NEXT i%
  17280.   FOR i%=0 TO 2048
  17281.     INT{a%}=-INT{SUB(a%,4096)}
  17282.     ADD a%,2
  17283.   NEXT i%
  17284.   se.freq_fftmin%=fmin%
  17285.   se.freq_fftmax%=fmax%
  17286.   se.freq_fftech%=fech%
  17287.   se.freq_fftlon%=nfreq%
  17288.   ' FFT de chaque frequence
  17289.   pm#=0
  17290.   f1#=-1
  17291.   f2#=0
  17292.   b#=(fmax%-fmin%)/nfreq%
  17293.   IF b#>1 AND b#<100 AND flagc!
  17294.     pctot%=nfreq%+2*b#
  17295.   ELSE
  17296.     pctot%=nfreq%
  17297.   ENDIF
  17298.   IF flagd!
  17299.     GOSUB affiche_panneau_progression("WAITING: FFT...",pctot%,-1,-1)
  17300.   ENDIF
  17301.   pc%=0
  17302.   pcnxt%=0
  17303.   FOR i%=0 TO PRED(nfreq%)
  17304.     a#=f1#
  17305.     f1#=fmin%+i%*b#                       ! Frequence a tester
  17306.     p#=FN fft(adr%,V:tabl$,lon%,SHL(fech%,4),MAX(ROUND(f1#*16),0),bits%)
  17307.     fft&(i%)=MAX(MIN(p#*&H7FFF,&H7FFF),0)
  17308.     IF f1#>=30
  17309.       coef#=1/f1#
  17310.     ELSE
  17311.       coef#=0
  17312.     ENDIF
  17313.     IF p#*coef#>pm#
  17314.       pm#=p#*coef#
  17315.       f2#=f1#
  17316.     ENDIF
  17317.     IF GEMDOS(11)<>0
  17318.       IF SHR(GEMDOS(7),16)=1            ! ESC = arret
  17319.         i%=nfreq%
  17320.       ENDIF
  17321.     ENDIF
  17322.     IF flagd!                           ! Affichage du pourcentage de calcul
  17323.       GOSUB affiche_progression(pc%)
  17324.       GOSUB bee(TRUE)
  17325.       INC pc%
  17326.     ENDIF
  17327.   NEXT i%
  17328.   ' 2eme recherche pour la frequence du sample, precise
  17329.   IF flagc! AND b#>1 AND b#<=100          ! Scanning Hz par Hz
  17330.     FOR i%=f2#-b# TO f2#+b#
  17331.       p#=FN fft(adr%,V:tabl$,lon%,fech%,MAX(i%,0),bits%)
  17332.       IF i%>=30
  17333.         coef#=1/i%
  17334.       ELSE
  17335.         coef#=0
  17336.       ENDIF
  17337.       IF p#*coef#>pm#
  17338.         pm#=p#*coef#
  17339.         f2#=i%
  17340.       ENDIF
  17341.       IF GEMDOS(11)<>0
  17342.         IF SHR(GEMDOS(7),16)=1          ! ESC = arret
  17343.           i%=f2#+b#
  17344.         ENDIF
  17345.       ENDIF
  17346.       IF flagd!                         ! Affichage du pourcentage de calcul
  17347.         GOSUB affiche_progression(pc%)
  17348.         GOSUB bee(TRUE)
  17349.         INC pc%
  17350.       ENDIF
  17351.     NEXT i%
  17352.   ENDIF
  17353.   IF b#>100 OR NOT flagc!        ! Si l'ecart est trop grand, pas de frequence pour le sample
  17354.     f2#=0
  17355.   ENDIF
  17356.   RETURN ROUND(f2#)
  17357. ENDFUNC
  17358. FUNCTION se.sm_adresse_sample(i%)
  17359.   IF i%=0
  17360.     RETURN ADD(FN adr_buffer,mark_1%)
  17361.   ELSE
  17362.     RETURN FN adresse(i%)
  17363.   ENDIF
  17364. ENDFUNC
  17365. FUNCTION se.sm_longueur_sample(i%)
  17366.   IF i%=0
  17367.     RETURN mark_len%
  17368.   ELSE
  17369.     RETURN FN length(i%)
  17370.   ENDIF
  17371. ENDFUNC
  17372. FUNCTION se.sm_resol_sample(i%)
  17373.   IF i%=0
  17374.     RETURN win_bits%
  17375.   ELSE
  17376.     RETURN FN resol(i%)
  17377.   ENDIF
  17378. ENDFUNC
  17379. ' ASCIIsation de choix
  17380. FUNCTION get_elt_in_list$(l$,a%)
  17381.   ' Renvoie le a%ieme element (de 0 a ...) de la liste l$
  17382.   ' Les elements sont separes par des virgules
  17383.   LOCAL b%
  17384.   LOCAL b$
  17385.   IF a%<0
  17386.     b$=""
  17387.   ELSE
  17388.     REPEAT
  17389.       b%=INSTR(l$,",")
  17390.       IF b%>0
  17391.         b$=LEFT$(l$,PRED(b%))
  17392.         l$=RIGHT$(l$,SUB(LEN(l$),b%))
  17393.       ELSE
  17394.         b$=l$
  17395.         l$=""
  17396.       ENDIF
  17397.       DEC a%
  17398.     UNTIL a%<0
  17399.   ENDIF
  17400.   RETURN b$
  17401. ENDFUNC
  17402. FUNCTION falsetrue$(a%)
  17403.   IF a%<>0
  17404.     RETURN "true"
  17405.   ELSE
  17406.     RETURN "false"
  17407.   ENDIF
  17408. ENDFUNC
  17409. FUNCTION noyes$(a%)
  17410.   IF a%<>0
  17411.     RETURN "yes"
  17412.   ELSE
  17413.     RETURN "no"
  17414.   ENDIF
  17415. ENDFUNC
  17416. FUNCTION offon$(a%)
  17417.   IF a%<>0
  17418.     RETURN "on"
  17419.   ELSE
  17420.     RETURN "off"
  17421.   ENDIF
  17422. ENDFUNC
  17423. ' Fichiers
  17424. FUNCTION fread(handle%,len%,adr%)
  17425.   er%=GEMDOS(63,W:handle%,L:len%,L:adr%)
  17426.   IF er%<>len% AND er%>=0
  17427.     er%=-1
  17428.   ENDIF
  17429.   RETURN er%
  17430. ENDFUNC
  17431. FUNCTION fwrite(handle%,len%,adr%)
  17432.   er%=GEMDOS(64,W:handle%,L:len%,L:adr%)
  17433.   IF er%<>len% AND er%>=0
  17434.     er%=-1
  17435.   ENDIF
  17436.   RETURN er%
  17437. ENDFUNC
  17438. ' Menus Pop Up
  17439. FUNCTION popup(npop%,ligdef%,x_pix_midpos%,y_pix_midpos%)
  17440.   ' Gestion d'un menu pop up (possibilite de recursivite)
  17441.   ' Renvoie le numero du menu dans le mot fort, le code du choix dans le faible.
  17442.   ' Renvoie -1 si annulation
  17443.   LOCAL reponse%,choix%,old_choix%,couleur%
  17444.   LOCAL choisi!,select!
  17445.   LOCAL pix_width_ext%,pix_high_ext%,car_width_ext%,car_width_in%,car_high_in%
  17446.   LOCAL x_car_pos%,y_pix_pos%,xm%,ym%,km%,xm2%
  17447.   LOCAL a%,b%,i%,j%
  17448.   LOCAL a$,pop_background$
  17449.   '
  17450.   GOSUB wait_mouse(TRUE)
  17451.   '
  17452.   ' Recherche des dimensions et coordonnees du popup
  17453.   '
  17454.   car_high_in%=popup_nbrlines%(npop%)
  17455.   a%=4
  17456.   FOR i%=0 TO PRED(popup_nbrlines%(npop%))
  17457.     b%=LEN(popup_txt$(i%,npop%))
  17458.     IF NOT BTST(popup_code%(i%,npop%),18)       ! Si la ligne est selectionnable
  17459.       ADD b%,4                                  ! + 2 selected, + 2 pour la fleche (popup recursif)
  17460.     ENDIF
  17461.     a%=MAX(a%,b%)
  17462.   NEXT i%
  17463.   car_width_in%=a%
  17464.   pix_high_ext%=ADD(MUL(car_high_in%,8),8)
  17465.   pix_width_ext%=ADD(MUL(car_width_in%,8),16)
  17466.   car_width_ext%=SHR(pix_width_ext%,3)
  17467.   x_car_pos%=DIV(SUB(x_pix_midpos%,SHR(pix_width_ext%,1)),8)
  17468.   x_car_pos%=MAX(0,MIN(x_car_pos%,SUB(scr_ncol%,car_width_ext%)))
  17469.   IF ligdef%>=0 AND ligdef%<popup_nbrlines%(npop%)
  17470.     y_pix_pos%=SUB(y_pix_midpos%,ADD(MUL(ligdef%,8),8))
  17471.   ELSE
  17472.     y_pix_pos%=SUB(y_pix_midpos%,SHR(pix_high_ext%,1))
  17473.   ENDIF
  17474.   y_pix_pos%=MAX(0,MIN(y_pix_pos%,SUB(scr_haut%,pix_high_ext%)))
  17475.   '
  17476.   ' Sauvegarde du fond
  17477.   '
  17478.   GOSUB save_background(SHL(x_car_pos%,3),y_pix_pos%,pix_width_ext%,pix_high_ext%)
  17479.   '
  17480.   ' Affichage du popup
  17481.   '
  17482.   GOSUB cadre_int(x_car_pos%,y_pix_pos%,PRED(car_width_ext%),PRED(pix_high_ext%),13,13,14,12)
  17483.   y%=ADD(y_pix_pos%,5)
  17484.   FOR i%=0 TO PRED(popup_nbrlines%(npop%))
  17485.     a$=FN ligne_popup$(i%,npop%,select!)
  17486.     IF select!
  17487.       couleur%=12
  17488.     ELSE
  17489.       couleur%=14
  17490.     ENDIF
  17491.     GOSUB affchaine_trans(a$,ADD(SHL(x_car_pos%,1),2),y%,couleur%)
  17492.     ADD y%,8
  17493.   NEXT i%
  17494.   '
  17495.   ' Gestion du PopUp
  17496.   '
  17497.   old_choix%=-1
  17498.   choix%=-1
  17499.   choisi!=FALSE
  17500.   reponse%=-1
  17501.   WHILE NOT choisi!
  17502.     SHOWM
  17503.     MOUSE xm%,ym%,km%
  17504.     xm2%=SHR(xm%,3)
  17505.     IF xm2%>=x_car_pos% AND xm2%<ADD(x_car_pos%,car_width_ext%)
  17506.       a%=INT(SUB(ym%,ADD(y_pix_pos%,5))/8)
  17507.       IF a%>=0 AND a%<popup_nbrlines%(npop%)
  17508.         choix%=a%
  17509.       ELSE
  17510.         choix%=-1
  17511.       ENDIF
  17512.     ELSE
  17513.       choix%=-1
  17514.     ENDIF
  17515.     ' Affichage de l'inversion video
  17516.     IF old_choix%<>choix%
  17517.       IF old_choix%>=0
  17518.         a$=FN ligne_popup$(old_choix%,npop%,select!)
  17519.         IF select!
  17520.           couleur%=12
  17521.         ELSE
  17522.           couleur%=14
  17523.         ENDIF
  17524.         GOSUB cadre_int(SUCC(x_car_pos%),ADD(ADD(y_pix_pos%,4),MUL(old_choix%,8)),SUB(car_width_ext%,3),7,13,13,13,13)
  17525.         GOSUB affchaine_trans(a$,ADD(SHL(x_car_pos%,1),2),ADD(ADD(y_pix_pos%,5),MUL(old_choix%,8)),couleur%)
  17526.       ENDIF
  17527.       IF choix%>=0
  17528.         IF NOT BTST(popup_code%(choix%,npop%),18)
  17529.           a$=FN ligne_popup$(choix%,npop%,select!)
  17530.           GOSUB cadre_int(SUCC(x_car_pos%),ADD(ADD(y_pix_pos%,4),MUL(choix%,8)),SUB(car_width_ext%,3),7,12,12,12,12)
  17531.           GOSUB affchaine_trans(a$,ADD(SHL(x_car_pos%,1),2),ADD(ADD(y_pix_pos%,5),MUL(choix%,8)),14)
  17532.         ENDIF
  17533.       ENDIF
  17534.       SHOWM
  17535.     ENDIF
  17536.     old_choix%=choix%
  17537.     ' Clic
  17538.     IF km%>0
  17539.       IF choix%>=0 AND km%<>2
  17540.         IF NOT BTST(popup_code%(choix%,npop%),18)
  17541.           IF BTST(popup_code%(choix%,npop%),16)
  17542.             a%=FN popup(popup_code%(choix%,npop%) AND &HFFFF,0,ADD(SHL(x_car_pos%,3),32),ADD(ADD(y_pix_pos%,20),MUL(choix%,8)))
  17543.             IF a%<>-1
  17544.               reponse%=a%
  17545.               choisi!=TRUE
  17546.             ENDIF
  17547.           ELSE
  17548.             reponse%=ADD(popup_code%(choix%,npop%) AND &HFFFF,SHL(npop%,16))
  17549.             choisi!=TRUE
  17550.           ENDIF
  17551.         ENDIF
  17552.       ELSE
  17553.         reponse%=-1
  17554.         choisi!=TRUE
  17555.       ENDIF
  17556.     ENDIF
  17557.   WEND
  17558.   '
  17559.   ' Restitution du fond
  17560.   '
  17561.   GOSUB restore_background
  17562.   '
  17563.   GOSUB wait_mouse(TRUE)
  17564.   RETURN reponse%
  17565. ENDFUNC
  17566. FUNCTION ligne_popup$(nlig%,npop%,VAR select!)
  17567.   ' Renvoie une ligne du popup telle qu'elle apparait dans le menu
  17568.   ' Renvoie select!: TRUE = selectionnable, FALSE = non selectionnable
  17569.   LOCAL a$
  17570.   IF BTST(popup_code%(nlig%,npop%),18)          ! Non selectionnable
  17571.     select!=FALSE
  17572.     a$=popup_txt$(nlig%,npop%)
  17573.   ELSE
  17574.     select!=TRUE
  17575.     IF BTST(popup_code%(nlig%,npop%),17)
  17576.       a$=MKI$(&H820)+popup_txt$(nlig%,npop%)    ! Checked + Espace
  17577.     ELSE
  17578.       a$=MKI$(&H2020)+popup_txt$(nlig%,npop%)
  17579.     ENDIF
  17580.     IF BTST(popup_code%(nlig%,npop%),16)
  17581.       a$=a$+MKI$(&H2003)                        ! Espace + fleche droite
  17582.     ENDIF
  17583.   ENDIF
  17584.   RETURN a$
  17585. ENDFUNC
  17586. ' Instruments
  17587. FUNCTION instrname$(ssss%)
  17588.   LOCAL iiii%,aaaa$
  17589.   aaaa$=""
  17590.   FOR iiii%=10 TO 34 STEP 4
  17591.     aaaa$=aaaa$+MKL$(LONG{ADD(V:instrset%(0,ssss%),iiii%)})
  17592.   NEXT iiii%
  17593.   RETURN aaaa$
  17594. ENDFUNC
  17595. FUNCTION ins_deb_zone(nnnn%,pppp%)
  17596.   ' Cherche le debut d'une zone isosample dans la table des samples d'un instrument
  17597.   LOCAL aaaa%
  17598.   aaaa%=FN isample(nnnn%,pppp%)
  17599.   WHILE pppp%>1
  17600.     EXIT IF FN isample(nnnn%,PRED(pppp%))<>aaaa%
  17601.     DEC pppp%
  17602.   WEND
  17603.   RETURN pppp%
  17604. ENDFUNC
  17605. FUNCTION ins_fin_zone(nnnn%,pppp%)
  17606.   ' Cherche la fin d'une zone isosample dans la table des samples d'un instrument
  17607.   LOCAL aaaa%
  17608.   aaaa%=FN isample(nnnn%,pppp%)
  17609.   WHILE pppp%<127
  17610.     EXIT IF FN isample(nnnn%,SUCC(pppp%))<>aaaa%
  17611.     INC pppp%
  17612.   WEND
  17613.   RETURN pppp%
  17614. ENDFUNC
  17615. FUNCTION ins_used_samples$(nnnn%)
  17616.   ' Renvoie une chaine de MOTS contenant les numeros des samples utilises dans
  17617.   ' l'instrument specifie (sauf 0)
  17618.   LOCAL aaaa%,iiii%,jjjj%,pppp%
  17619.   LOCAL ffff!
  17620.   LOCAL aaaa$
  17621.   aaaa$=""
  17622.   FOR iiii%=0 TO 127
  17623.     aaaa%=FN isample(nnnn%,iiii%)
  17624.     IF aaaa%>0
  17625.       ffff!=TRUE
  17626.       IF LEN(aaaa$)>0
  17627.         FOR jjjj%=0 TO SUB(LEN(aaaa$),2) STEP 2
  17628.           IF CARD{ADD(V:aaaa$,jjjj%)}=aaaa%
  17629.             ffff!=FALSE
  17630.             jjjj%=LEN(aaaa$)
  17631.           ENDIF
  17632.         NEXT jjjj%
  17633.       ENDIF
  17634.       IF ffff!
  17635.         pppp%=0
  17636.         WHILE pppp%<LEN(aaaa$)
  17637.           EXIT IF CARD{ADD(V:aaaa$,pppp%)}>aaaa%
  17638.           ADD pppp%,2
  17639.         WEND
  17640.         aaaa$=LEFT$(aaaa$,pppp%)+MKI$(aaaa%)+RIGHT$(aaaa$,SUB(LEN(aaaa$),pppp%))
  17641.       ENDIF
  17642.     ENDIF
  17643.   NEXT iiii%
  17644.   RETURN aaaa$
  17645. ENDFUNC
  17646. FUNCTION ins_cherche_sample(ssss%,dddd%)
  17647.   ' Cherche dans quel instrument se trouve le sample ssss%
  17648.   ' La recherche commence a l'instrument dddd%
  17649.   LOCAL iiii%
  17650.   LOCAL ffff!
  17651.   ffff!=FALSE
  17652.   WHILE dddd%<=255
  17653.     FOR iiii%=1 TO 127
  17654.       IF FN isample(dddd%,iiii%)=ssss%
  17655.         ffff!=TRUE
  17656.       ENDIF
  17657.     NEXT iiii%
  17658.     EXIT IF ffff!
  17659.     INC dddd%
  17660.   WEND
  17661.   IF ffff!
  17662.     RETURN dddd%
  17663.   ELSE
  17664.     RETURN 0
  17665.   ENDIF
  17666. ENDFUNC
  17667. ' Enveloppes
  17668. FUNCTION env_chunkadr(num%,type%)
  17669.   IF type%=0
  17670.     RETURN LONG{ADD(r_adr_evol%,SHL(num%,2))}
  17671.   ELSE IF type%=1
  17672.     RETURN LONG{ADD(r_adr_eton%,SHL(num%,2))}
  17673.   ELSE
  17674.     RETURN LONG{ADD(r_adr_epan%,SHL(num%,2))}
  17675.   ENDIF
  17676. ENDFUNC
  17677. FUNCTION env_chunklen(num%,type%)
  17678.   RETURN LONG{ADD(FN env_chunkadr(num%,type%),4)}
  17679. ENDFUNC
  17680. FUNCTION envelopename$(num%,type%)
  17681.   LOCAL i%,a$
  17682.   a$=""
  17683.   FOR i%=10 TO 26 STEP 4
  17684.     a$=a$+MKL$(LONG{ADD(FN env_chunkadr(num%,type%),i%)})
  17685.   NEXT i%
  17686.   RETURN a$
  17687. ENDFUNC
  17688. FUNCTION env_sectadr(num%,type%,sect%)
  17689.   IF sect%=0
  17690.     RETURN ADD(FN env_chunkadr(num%,type%),32)
  17691.   ELSE
  17692.     RETURN ADD(FN env_chunkadr(num%,type%),ADD(32,CARD{ADD(FN env_chunkadr(num%,type%),30)}))
  17693.   ENDIF
  17694. ENDFUNC
  17695. FUNCTION env_sectlen(num%,type%,sect%)
  17696.   LOCAL length%
  17697.   IF sect%=0
  17698.     length%=CARD{ADD(FN env_chunkadr(num%,type%),30)}
  17699.   ELSE
  17700.     length%=SUB(SUB(FN env_chunklen(num%,type%),32),FN env_sectlen(num%,type%,0))
  17701.   ENDIF
  17702.   RETURN length%
  17703. ENDFUNC
  17704. FUNCTION pos_enveloppe(num%,type%,sect%,pos%)
  17705.   ' Type de l'enveloppe (0,1 ou 2), numero de l'enveloppe (0-63),
  17706.   ' Attack/Key off (0 ou 1), position recherchee
  17707.   ' Retourne la position en octets relativement au debut des donnees du numero
  17708.   ' d'une commande
  17709.   ' Retourne -1 si la position n'existe pas
  17710.   LOCAL a%,b%,c%,l%,p%
  17711.   a%=FN env_sectadr(num%,type%,sect%)
  17712.   l%=FN env_sectlen(num%,type%,sect%)
  17713.   p%=0                  ! Compteur en positions
  17714.   c%=0                  ! Compteur en octets
  17715.   WHILE c%<l%
  17716.     EXIT IF p%>=pos%
  17717.     b%=BYTE{a%}         ! Commande
  17718.     ADD a%,FN env_comlen(b%)
  17719.     ADD c%,FN env_comlen(b%)
  17720.     INC p%
  17721.   WEND
  17722.   IF c%>=l%
  17723.     RETURN -1
  17724.   ELSE
  17725.     RETURN c%
  17726.   ENDIF
  17727. ENDFUNC
  17728. FUNCTION numcom_enveloppe(num%,type%,sect%,pos%)
  17729.   ' Type de l'enveloppe (0,1 ou 2), numero de l'enveloppe (0-63),
  17730.   ' Attack/Key off (0 ou 1), position en octets recherchee
  17731.   ' Retourne le numero de la commande correspondant a une position en octets
  17732.   LOCAL a%,b%,c%,l%,p%
  17733.   a%=FN env_sectadr(num%,type%,sect%)
  17734.   l%=FN env_sectlen(num%,type%,sect%)
  17735.   p%=0                  ! Compteur en positions
  17736.   c%=0                  ! Compteur en octets
  17737.   WHILE c%<l% AND c%<pos%
  17738.     b%=BYTE{a%}         ! Commande
  17739.     ADD a%,FN env_comlen(b%)
  17740.     ADD c%,FN env_comlen(b%)
  17741.     INC p%
  17742.   WEND
  17743.   RETURN p%
  17744. ENDFUNC
  17745. FUNCTION env_comlen(com%)
  17746.   ' Renvoie le nombre d'octets pris par une commande + son parametre
  17747.   LOCAL len%
  17748.   SELECT com%
  17749.   CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  17750.     len%=2
  17751.   CASE &H1,&H2,&H4,&H80,&H81,&HA0,&HA1,&HC0,&HC1
  17752.     len%=3
  17753.   DEFAULT
  17754.     len%=1
  17755.   ENDSELECT
  17756.   RETURN len%
  17757. ENDFUNC
  17758. '
  17759. '
  17760. '
  17761. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  17762. ' *                                                                          *
  17763. ' *                             Donnees diverses                             *
  17764. ' *                                                                          *
  17765. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  17766. '
  17767. ' 0
  17768. icones_disk:
  17769. DATA 17,0,5
  17770. DATA 0,"LOAD MOD",21,35,9,9, 1,"SAVE MOD",31,35,9,9
  17771. DATA 2,"LOAD PREF",21,45,9,9, 3,"SAVE PREF",31,45,9,9
  17772. DATA 4,"LOAD PATT",21,55,9,9, 5,"SAVE PATT",31,55,9,9
  17773. DATA 6,"LOAD SONG",21,65,9,9, 7,"SAVE SONG",31,65,9,9
  17774. DATA 8,"PATH OF                 ",20,80,24,9
  17775. DATA 9," ",20,90,59,9
  17776. DATA 10,"MODULE FILE      ",43,35,17,9
  17777. DATA 11,"MAKE DIR",62,35,8,9, 12,"DEL DIR",71,35,8,9
  17778. DATA 13,"RENAME",62,45,8,9, 14,"DEL FILE",71,45,8,9
  17779. DATA 15,"FORMAT",71,55,8,9
  17780. DATA 16," ",77,75,1,9
  17781. ' 1
  17782. icones_tools:
  17783. DATA 24,0,5
  17784. DATA 0,"START",21,40,9,11, 1,"PASTE",33,35,7,9, 2,"CLEAR",41,45,7,9, 3,"N/O UP",49,45,9,9
  17785. DATA 4,"END",21,53,9,11, 5,"INSERT",33,45,7,9, 6,"DELETE",41,55,7,9, 7,"N/O DOWN",49,55,9,9
  17786. DATA 8,"SWAP",33,55,7,9, 9,"REPLACE",53,75,7,9, 10,"ALL",21,75,7,9, 11,"TRACK",61,30,7,9
  17787. DATA 12,"TRANSP",53,85,7,9, 13,"MASK",21,85,7,9, 14,"PATTERN",61,40,7,9, 15,"PRESET",61,50,7,9
  17788. DATA 16,"MASK ON               ",29,75,22,9, 17,"REPLACE BY            ",29,85,22,9
  17789. DATA 18,"EXT NOTE       ",63,77,15,9
  17790. DATA 19,"SONG",71,40,7,9, 20,"INSTR",71,50,7,9, 21,"ALL",71,60,7,9
  17791. DATA 22,".../...",72,90,7,9
  17792. DATA 23,"SONG",61,60,7,9
  17793. ' 2
  17794. icones_sample1:
  17795. DATA 18,0,0
  17796. DATA 0,"EXIT",70,70,9,9
  17797. DATA 1,"ZOOM",0,20,9,9, 2,"ZOOM OUT",10,20,9,9
  17798. DATA 3,"COPY SPL => BLOCK",0,30,19,9
  17799. DATA 4,"COPY BLOCK => SPL",0,40,19,9
  17800. DATA 5,"SWAP BLOCK AND SPL",0,50,19,9
  17801. DATA 6,"CLEAR",0,70,5,9, 7,"CUT",6,70,3,9, 8,"KEEP",10,70,4,9, 9,"FLIP",15,70,4,9
  17802. DATA 10,"GAP (BLK)",0,60,9,9, 11,"GAP (SPL)",10,60,9,9
  17803. DATA 12,"PLAY",20,30,9,29
  17804. DATA 13,"FINE POS",20,60,9,9
  17805. DATA 14,"SWAP CURS",20,70,9,9
  17806. DATA 15,"RESET CUR",20,20,9,9
  17807. DATA 16,"LOAD SAMPLE", 68, 50, 11, 9
  17808. DATA 17,"SAVE SAMPLE", 68, 60, 11, 9
  17809. ' 3
  17810. icones_sample2:
  17811. DATA 10,0,0
  17812. DATA 0,"POS L",1,0,5,9, 1,"CURS L",8,0,5,9, 2,"BITS",25,0,1,9, 3,"BLOCK",29,0,5,9, 4,"BUFFER",36,0,5,9
  17813. DATA 5,"REPEAT",43,0,5,9, 6,"FREQ",50,0,4,9, 7,"SAMPLE",60,0,1,9, 8,"CURS R",66,0,5,9, 9,"POS R",73,0,5,9
  17814. ' 4
  17815. icones_sample3:
  17816. DATA 11,0,0
  17817. DATA 0,"VOLUME",40,20,9,9, 1,"MIX",40,30,9,9, 2,"RECORD",40,40,9,9
  17818. DATA 3,"MARKS",40,50,9,9, 4,"FREQUENCY",40,60,9,9, 5,"DELAY",40,70,9,9
  17819. DATA 6,"FLANGER",50,20,9,9, 7,"REVERB",50,30,9,9, 8,"SONG2DISK",50,40,9,9
  17820. DATA 9,"COMPRESS.",50,50,9,9, 10,"DISTO",50,60,9,9
  17821. ' 5
  17822. icones_sample_sm1:
  17823. DATA 17,0,0
  17824. DATA 0,"VOLUME      %",15,90,13,9
  17825. DATA 1,"VOLUME ?",1,85,12,19
  17826. DATA 2,"+ 1 dB",31,90,7,9, 3,"+ 2 dB",31,100,7,9, 4,"+ 3 dB",31,110,7,9, 5,"+ 6 dB",31,120,7,9
  17827. DATA 6,"- 1 dB",39,90,7,9, 7,"- 2 dB",39,100,7,9, 8,"- 3 dB",39,110,7,9, 9,"- 6 dB",39,120,7,9
  17828. DATA 10,"FADE !",49,90,29,9
  17829. DATA 11,"FADE START      %",49,115,17,9
  17830. DATA 12,"FADE END        %",49,125,17,9
  17831. DATA 13,"FADE IN",69,115,9,9
  17832. DATA 14,"FADE OUT",69,125,9,9
  17833. DATA 15,"NO CHANGE",1,125,13,9, 16,"BEST",15,125,13,9
  17834. ' 6
  17835. icones_sample_sm2:
  17836. DATA 46,0,0
  17837. DATA 0,"MIX !",1,85,11,9, 1,"MASTER      %",15,85,13,9
  17838. DATA 2,"2",31,85,1,9, 3,"3",33,85,1,9, 4,"4",35,85,1,9, 5,"5",37,85,1,9
  17839. DATA 6,"ON",5,100,3,9, 7,"START      %",9,100,12,9, 8,"END      %",22,100,10,9, 9,"LOOP",33,100,5,9
  17840. DATA 10," ",1,110,3,9, 11,"ⁿ",5,110,1,9, 12,"²",7,110,1,9, 13," ",9,110,29,9
  17841. DATA 14,"ON",5,120,3,9, 15,"START      %",9,120,12,9, 16,"END      %",22,120,10,9, 17,"LOOP",33,120,5,9
  17842. DATA 18," ",1,130,3,9, 19,"ⁿ",5,130,1,9, 20,"²",7,130,1,9, 21," ",9,130,29,9
  17843. DATA 22,"ON",45,80,3,9, 23,"START      %",49,80,12,9, 24,"END      %",62,80,10,9, 25,"LOOP",73,80,5,9
  17844. DATA 26," ",41,90,3,9, 27,"ⁿ",45,90,1,9, 28,"²",47,90,1,9, 29," ",49,90,29,9
  17845. DATA 30,"ON",45,100,3,9, 31,"START      %",49,100,12,9, 32,"END      %",62,100,10,9, 33,"LOOP",73,100,5,9
  17846. DATA 34," ",41,110,3,9, 35,"ⁿ",45,110,1,9, 36,"²",47,110,1,9, 37," ",49,110,29,9
  17847. DATA 38,"ON",45,120,3,9, 39,"START      %",49,120,12,9, 40,"END      %",62,120,10,9, 41,"LOOP",73,120,5,9
  17848. DATA 42," ",41,130,3,9, 43,"ⁿ",45,130,1,9, 44,"²",47,130,1,9, 45," ",49,130,29,9
  17849. ' 7
  17850. icones_samples_sm3:
  17851. DATA 18,0,0
  17852. DATA 0,"SAMPLE",1,85,9,9, 1,"PRESAMPLE",13,85,9,9
  17853. DATA 2,"ⁿ",65,105,1,9, 3,"²",67,105,1,9, 4,"ⁿ",75,105,1,9, 5,"²",77,105,1,9
  17854. DATA 6,"AUTO",69,105,5,9
  17855. DATA 7,"FREQUENCY      Hz",1,105,17,9, 8,"ⁿ",19,105,1,9, 9,"²",21,105,1,9
  17856. DATA 10,"MONITOR",25,120,11,9
  17857. DATA 11,"LEVEL      %",10,125,12,9, 12,"TRIGGER",1,125,8,9
  17858. DATA 13,"L",25,95,3,9, 14,"L+R",29,95,3,9, 15,"R",33,95,3,9
  17859. DATA 16,"FALCON 030 D.A.C.",39,95,23,9, 17,"ST REPLAY PRO CARDRIDGE",39,105,23,9
  17860. ' 8
  17861. icones_samples_sm4:
  17862. DATA 29,0,0
  17863. DATA 0,"1",1,80,1,9, 1,"2",1,90,1,9, 2,"3",1,100,1,9, 3,"4",1,110,1,9, 4,"5",1,120,1,9
  17864. DATA 5,"6",41,80,1,9, 6,"7",41,90,1,9, 7,"8",41,100,1,9, 8,"9",41,110,1,9, 9,"10",41,120,1,9
  17865. DATA 10,"ALL",65,130,3,9, 11,"RESET",74,130,5,9
  17866. DATA 12,"SET",0,130,5,9
  17867. DATA 13,"1",44,130,1,9, 14,"2",46,130,1,9, 15,"3",48,130,1,9, 16,"4",50,130,1,9, 17,"5",52,130,1,9
  17868. DATA 18,"6",54,130,1,9, 19,"7",56,130,1,9, 20,"8",58,130,1,9, 21,"9",60,130,1,9, 22,"10",62,130,1,9
  17869. DATA 23," ",4,80,20,49, 24," ",44,80,20,49
  17870. DATA 25," ",26,80,20,49, 26," ",66,80,20,49
  17871. DATA 27," ",33,80,20,49, 28," ",73,80,20,49
  17872. ' 9
  17873. icones_samples_sm5:
  17874. DATA 23,0,0
  17875. DATA 0,"CONVERT",1,90,11,9
  17876. DATA 1,"/2",1,115,3,9, 2,"/3",5,115,3,9, 3,"/4",9,115,3,9
  17877. DATA 4,"x2",1,125,3,9, 5,"x3",5,125,3,9, 6,"x4",9,125,3,9
  17878. DATA 7,"DO",50,90,13,9
  17879. DATA 8,"Hz        =>      ",15,90,18,9
  17880. DATA 9,"NOTE      =>      ",15,115,18,9
  17881. DATA 10,"Hz        =>      ",15,125,18,9
  17882. DATA 11,"NONE",36,95,11,9, 12,"LINEAR",36,105,11,9, 13,"3RD DEGREE",36,115,11,9
  17883. DATA 14,"START      Hz",50,105,13,9, 15,"END        Hz",50,115,13,9
  17884. DATA 16,"# OF PTS     ",50,125,13,9
  17885. DATA 17,"LINEAR",66,90,6,9, 18,"dB",73,90,5,9
  17886. DATA 19,"NONE",66,115,12,9, 20,"BLACKMAN",66,125,12,9
  17887. DATA 21," ",33,107,0,5, 22," ",63,82,0,5
  17888. ' 10
  17889. icones_samples_sm6:
  17890. DATA 30,0,0
  17891. DATA 0,"ON",44,85,2,9, 1,"DELAY TIME      ms",47,85,18,9, 2,"LEVEL      %",66,85,12,9
  17892. DATA 3,"ON",44,95,2,9, 4,"DELAY TIME      ms",47,95,18,9, 5,"LEVEL      %",66,95,12,9
  17893. DATA 6,"ON",44,105,2,9, 7,"DELAY TIME      ms",47,105,18,9, 8,"LEVEL      %",66,105,12,9
  17894. DATA 9,"ON",44,115,2,9, 10,"DELAY TIME      ms",47,115,18,9, 11,"LEVEL      %",66,115,12,9
  17895. DATA 12,"SAMPLE SOURCE   ",29,130,16,9, 13,"ⁿ",46,130,1,9, 14,"²",48,130,1,9, 15," ",50,130,29,9
  17896. DATA 16,"DO",30,113,9,13
  17897. DATA 17,"FEEDBACK       % ",1,85,17,9, 18,"TIME FEED      ms",1,95,17,9
  17898. DATA 19,"DRY LEVEL        %",21,85,18,9, 20,"DELAY LEVEL      %",21,95,18,9
  17899. DATA 21,"MULTI-TAP MODE",1,115,18,9
  17900. DATA 22,"MUTE IN :",1,125,9,9, 23,"      ms",11,125,8,9
  17901. DATA 24,"1",22,115,1,9, 25,"2",24,115,1,9, 26,"3",26,115,1,9
  17902. DATA 27,"4",22,125,1,9, 28,"5",24,125,1,9, 29,"6",26,125,1,9
  17903. ' 11
  17904. icones_tools2:
  17905. DATA 11,0,5
  17906. DATA 0,".../...",72,90,7,9
  17907. DATA 1,"ECHO",21,40,7,9, 2,"CONT",31,40,7,9
  17908. DATA 3,"EVERY   LINES",21,55,13,9, 4,"ⁿ",35,55,1,9, 5,"²",37,55,1,9
  17909. DATA 6," ",21,70,1,9, 7,"FEEDBACK     %",24,70,14,9
  17910. DATA 8," ",21,85,1,9, 9,"FADESTEP      ",24,85,14,9
  17911. DATA 10,"VOLUME SLIDE",41,35,15,9
  17912. ' 12
  17913. icones_instr:
  17914. DATA 42,0,5
  17915. DATA 0," ",21,34,1,7, 1," ",24,34,19,7
  17916. DATA 2," ",21,40,1,7, 3," ",24,40,19,7
  17917. DATA 4," ",21,46,1,7, 5," ",24,46,19,7
  17918. DATA 6," ",21,52,1,7, 7," ",24,52,19,7
  17919. DATA 8," ",21,58,1,7, 9," ",24,58,19,7
  17920. DATA 10," ",21,64,1,7, 11," ",24,64,19,7
  17921. DATA 12," ",21,70,1,7, 13," ",24,70,19,7
  17922. DATA 14," ",21,76,1,7, 15," ",24,76,19,7
  17923. DATA 16,"ⁿ",45,35,1,9, 17,"²",45,45,1,9
  17924. DATA 18,"FROM      ",49,60,10,9, 19,"ⁿ",60,60,1,9, 20,"²",62,60,1,9
  17925. DATA 21,"TO        ",49,70,10,9, 22,"ⁿ",60,70,1,9, 23,"²",62,70,1,9
  17926. DATA 24,"VOLUME    ",49,85,10,9, 25,"ⁿ",60,85,1,9, 26,"²",62,85,1,9
  17927. DATA 27,"VOLUME   ",65,45,9,9, 28,"ⁿ",75,45,1,9, 29,"²",77,45,1,9
  17928. DATA 30,"TON      ",65,55,9,9, 31,"ⁿ",75,55,1,9, 32,"²",77,55,1,9
  17929. DATA 33,"PAN      ",65,65,9,9, 34,"ⁿ",75,65,1,9, 35,"²",77,65,1,9
  17930. DATA 36,"ⁿ",27,85,1,9, 37,"²",29,85,1,9
  17931. DATA 38,"ⁿ",44,85,1,9, 39,"²",46,85,1,9
  17932. DATA 40,"LIST",65,80,13,14
  17933. DATA 41,"GROUP",52,35,7,19
  17934. ' 13
  17935. icones_instr_list:
  17936. DATA 17,0,5
  17937. DATA 0,"1st PAGE",69,75,9,19
  17938. DATA 1,"ⁿ",53,35,1,9, 2,"²",53,45,1,9
  17939. DATA 3,"TOP",56,35,3,9
  17940. DATA 4,"LOAD INSTRUMENT",61,35,17,9
  17941. DATA 5,"LOAD & KEEP SPL",61,45,17,9
  17942. DATA 6,"SAVE INSTRUMENT",61,55,17,9
  17943. DATA 7," ",21,35,30,5
  17944. DATA 8," ",21,41,30,5
  17945. DATA 9," ",21,47,30,5
  17946. DATA 10," ",21,53,30,5
  17947. DATA 11," ",21,59,30,5
  17948. DATA 12," ",21,65,30,5
  17949. DATA 13," ",21,71,30,5
  17950. DATA 14," ",21,77,30,5
  17951. DATA 15," ",21,83,30,5
  17952. DATA 16," ",21,89,30,5
  17953. ' 14
  17954. icones_sample:
  17955. DATA 34,0,5
  17956. DATA 0,"SAMPLE       ",21,35,13,9, 1,"ⁿ",35,35,1,9, 2,"²",37,35,1,9
  17957. DATA 3,"NAME                             ",39,35,33,9
  17958. DATA 4,"LENGTH       ",21,50,13,9, 5,"ⁿ",35,50,1,9, 6,"²",37,50,1,9
  17959. DATA 7,"REPEAT       ",21,60,13,9, 8,"ⁿ",35,60,1,9, 9,"²",37,60,1,9
  17960. DATA 10,"REPLEN       ",21,70,13,9, 11,"ⁿ",35,70,1,9, 12,"²",37,70,1,9
  17961. DATA 13,"VOLUME     ",41,50,11,9, 14,"ⁿ",53,50,1,9, 15,"²",55,50,1,9
  17962. DATA 16,"FINETUNE   ",41,60,11,9, 17,"ⁿ",53,60,1,9, 18,"²",55,60,1,9
  17963. DATA 19,"BALANCE    ",41,70,11,9, 20,"ⁿ",53,70,1,9, 21,"²",55,70,1,9
  17964. DATA 22,"FREQUENCY      ",59,50,15,9, 23,"ⁿ",75,50,1,9, 24,"²",77,50,1,9
  17965. DATA 25,"NBR OF BITS    ",59,60,15,9, 26,"ⁿ",75,60,1,9, 27,"²",77,60,1,9
  17966. DATA 28,"KILL",74,35,4,9
  17967. DATA 29,"LIST",71,75,7,19
  17968. DATA 30,"LOAD",21,85,7,9, 31,"SAVE",29,85,7,9
  17969. DATA 32,"SAMPLE FILE      ",50,85,17,9
  17970. DATA 33,"SIGNED",39,85,8,9
  17971. ' 15
  17972. icones_sample_list:
  17973. DATA 15,0,5
  17974. DATA 0,"1st PAGE",69,75,9,19
  17975. DATA 1,"ⁿ",53,35,1,9, 2,"²",53,45,1,9
  17976. DATA 3,"TOP",56,35,3,9
  17977. DATA 4,"INSTRUMENT ?",61,35,17,9
  17978. DATA 5," ",21,35,30,5
  17979. DATA 6," ",21,41,30,5
  17980. DATA 7," ",21,47,30,5
  17981. DATA 8," ",21,53,30,5
  17982. DATA 9," ",21,59,30,5
  17983. DATA 10," ",21,65,30,5
  17984. DATA 11," ",21,71,30,5
  17985. DATA 12," ",21,77,30,5
  17986. DATA 13," ",21,83,30,5
  17987. DATA 14," ",21,89,30,5
  17988. ' 16
  17989. icones_panneau_principal:
  17990. DATA 28,0,0
  17991. DATA 0,"POSITION      ",0,0,14,9, 1,"ⁿ",15,0,1,9, 2,"²",17,0,1,9
  17992. DATA 3,"PATTERN       ",0,10,14,9, 4,"ⁿ",15,10,1,9, 5,"²",17,10,1,9
  17993. DATA 6,"LENGTH        ",0,20,14,9, 7,"ⁿ",15,20,1,9, 8,"²",17,20,1,9
  17994. DATA 9,"REPEAT        ",0,30,14,9, 10,"ⁿ",15,30,1,9, 11,"²",17,30,1,9
  17995. DATA 12,"INSTRUMENT    ",0,45,14,9, 13,"ⁿ",15,45,1,9, 14,"²",17,45,1,9
  17996. DATA 15,"SAMPLE        ",0,55,14,9, 16,"ⁿ",15,55,1,9, 17,"²",17,55,1,9
  17997. DATA 18,"STEP   ",7,65,7,9, 19,"ⁿ",15,65,1,9, 20,"²",17,65,1,9
  17998. DATA 21,"SONGNAME                                 ",0,110,41,9
  17999. DATA 22,"INSTRNAME                             ",42,110,37,9
  18000. DATA 23,"TRACKS   ",0,80,9,9, 24,"LINES    ",0,90,9,9
  18001. DATA 25," ",0,65,6,9
  18002. DATA 26,"ON/OFF",0,120,7,9, 27,"PRESET",0,130,7,9
  18003. ' 17
  18004. icones_enveloppe_volume:
  18005. DATA 49,0,5
  18006. DATA 0," ",21,35,3,5
  18007. DATA 1," ",21,41,3,5
  18008. DATA 2," ",21,47,3,5
  18009. DATA 3," ",21,53,3,5
  18010. DATA 4," ",21,59,3,5
  18011. DATA 5," ",21,65,3,5
  18012. DATA 6," ",21,71,3,5
  18013. DATA 7," ",21,77,3,5
  18014. DATA 8," ",21,83,3,5
  18015. DATA 9," ",21,89,3,5
  18016. DATA 10," ",26,35,15,5
  18017. DATA 11," ",26,41,15,5
  18018. DATA 12," ",26,47,15,5
  18019. DATA 13," ",26,53,15,5
  18020. DATA 14," ",26,59,15,5
  18021. DATA 15," ",26,65,15,5
  18022. DATA 16," ",26,71,15,5
  18023. DATA 17," ",26,77,15,5
  18024. DATA 18," ",26,83,15,5
  18025. DATA 19," ",26,89,15,5
  18026. DATA 20," ",68,35,10,5
  18027. DATA 21," ",68,41,10,5
  18028. DATA 22," ",68,47,10,5
  18029. DATA 23," ",68,53,10,5
  18030. DATA 24," ",68,59,10,5
  18031. DATA 25," ",68,65,10,5
  18032. DATA 26," ",68,71,10,5
  18033. DATA 27," ",68,77,10,5
  18034. DATA 28," ",68,83,10,5
  18035. DATA 29," ",68,89,10,5
  18036. DATA 30,"ⁿ",43,35,1,9, 31,"²",43,45,1,9
  18037. DATA 32,"ⁿ",65,35,1,9, 33,"²",65,45,1,9
  18038. DATA 34,"VOLUME",46,35,6,9, 35,"TONE",53,35,5,9, 36,"PAN",59,35,4,9
  18039. DATA 37,"ATTACK",47,45,7,9, 38,"KEY OFF",55,45,7,9
  18040. DATA 39,"ENVELOPE   ",43,60,11,9, 40,"ⁿ",55,60,1,9, 41,"²",57,60,1,9
  18041. DATA 42,"CLR ENV",59,60,7,9
  18042. DATA 43," ",44,70,21,9
  18043. DATA 44,"DEL COM",43,85,7,9
  18044. DATA 45,"COPY",52,85,6,9, 46," ",59,85,3,9, 47,"ⁿ",63,85,1,9, 48,"²",65,85,1,9
  18045. ' 18
  18046. icones_tools3:
  18047. DATA 16,0,5
  18048. DATA 0,".../...",72,90,7,9
  18049. DATA 1,"ⁿ",44,35,1,9, 2,"²",44,45,1,9
  18050. DATA 3,"TOP",47,35,3,9
  18051. DATA 4,"INSERT POS",52,35,11,9, 5,"DELETE POS",52,45,11,9
  18052. DATA 6," ",21,35,30,5
  18053. DATA 7," ",21,41,30,5
  18054. DATA 8," ",21,47,30,5
  18055. DATA 9," ",21,53,30,5
  18056. DATA 10," ",21,59,30,5
  18057. DATA 11," ",21,65,30,5
  18058. DATA 12," ",21,71,30,5
  18059. DATA 13," ",21,77,30,5
  18060. DATA 14," ",21,83,30,5
  18061. DATA 15," ",21,89,30,5
  18062. ' 19
  18063. icones_samples_sm7_1:
  18064. DATA 16,0,0
  18065. DATA 0,"2nd PAGE",61,115,17,19
  18066. DATA 1,"LEFT CHANNEL",1,95,13,9, 2,"RIGHT CHANNEL",1,105,13,9, 3,"MIX L & R CHN",1,115,13,9
  18067. DATA 4,"DRY LEVEL         %",17,95,19,9, 5,"FLANGE LEVEL      %",17,105,19,9
  18068. DATA 6,"FLANGE TIME      ms",39,95,19,9
  18069. DATA 7,"FLANGE FREQ      Hz",39,105,19,9
  18070. DATA 8,"FLANGE DEPTH     ms",39,115,19,9
  18071. DATA 9,"INIT PHASE       π ",39,125,19,9
  18072. DATA 10,"1",61,95,1,9, 11,"2",64,95,1,9, 12,"3",67,95,1,9
  18073. DATA 13,"4",70,95,1,9, 14,"5",73,95,1,9, 15,"6",76,95,1,9
  18074. ' 20
  18075. icones_samples_sm7_2:
  18076. DATA 20,0,0
  18077. DATA 0,"1st PAGE",67,115,11,19
  18078. DATA 1,"LEFT SOURCE    ",1,85,15,9, 2,"ⁿ",17,85,1,9, 3,"²",19,85,1,9, 4," ",21,85,29,9
  18079. DATA 5,"RIGHT SOURCE   ",1,115,15,9, 6,"ⁿ",17,115,1,9, 7,"²",19,115,1,9, 8," ",21,115,29,9
  18080. DATA 9,"LEFT ³ LEFT        %",10,95,20,9, 10,"LEFT ³ RIGHT      %",31,95,19,9
  18081. DATA 11,"RIGHT ³ RIGHT      %",10,125,20,9, 12,"RIGHT ³ LEFT      %",31,125,19,9
  18082. DATA 13,"MONO",67,85,11,9, 14,"STEREO",67,95,11,9
  18083. DATA 15,"SIN",53,85,11,9, 16,"SQUARE",53,95,11,9, 17,"TRIANGLE",53,105,11,9
  18084. DATA 18,"RAMP DOWN",53,115,11,9, 19,"RAMP UP",53,125,11,9
  18085. ' 21
  18086. icones_samples_sm8_1:
  18087. DATA 16,0,0
  18088. DATA 0,"EXTRA",71,120,8,19
  18089. DATA 1,"REVERBERATION",1,85,22,9
  18090. DATA 2,"DRY LEVEL            %",1,105,22,9
  18091. DATA 3,"REVERB LEVEL         %",1,115,22,9
  18092. DATA 4,"EARLY REF LEVEL      %",1,125,22,9
  18093. DATA 5,"NUMBER OF TAPS   ",26,95,17,9, 6,"ⁿ",44,95,1,9, 7,"²",46,95,1,9
  18094. DATA 8,"NUMBER OF C.F.   ",50,95,17,9, 9,"ⁿ",68,95,1,9, 10,"²",70,95,1,9
  18095. DATA 11,"OVERALL GAIN        %",50,105,21,9
  18096. DATA 12,"SOURCE   ",26,125,9,9, 13,"ⁿ",36,125,1,9, 14,"²",38,125,1,9
  18097. DATA 15," ",40,125,29,9
  18098. ' 22
  18099. icones_samples_sm8_2:
  18100. DATA 14,0,0
  18101. DATA 0,"MAIN PAGE",68,120,11,19
  18102. DATA 1," ",1,90,1,41, 2," ",4,90,4,41, 3," ",10,90,4,41
  18103. DATA 4,"ⁿ",16,90,1,9, 5,"²",16,100,1,9
  18104. DATA 6," ",20,90,1,41, 7," ",23,90,4,41, 8," ",29,90,4,41
  18105. DATA 9,"ⁿ",35,90,1,9, 10,"²",35,100,1,9
  18106. DATA 11,"DELAY      ms",39,95,13,9, 12,"GAIN       % ",53,95,13,9
  18107. DATA 13,"DELAY      ms",39,125,13,9
  18108. ' 23
  18109. icones_song2disk:
  18110. DATA 22,0,0
  18111. DATA 0," ",7,95,1,9, 1," ",12,95,1,9
  18112. DATA 2," ",7,105,1,9, 3," ",12,105,1,9
  18113. DATA 4,"8 BITS",17,85,7,9, 5,"16 BITS",25,85,7,9
  18114. DATA 6,"MONO",17,105,7,9, 7,"STEREO",25,105,7,9
  18115. DATA 8,"BLOCK",35,95,5,9, 9,"DISK",35,105,5,9
  18116. DATA 10,"MAXIMUM DURATION      s ",43,95,24,9
  18117. DATA 11,"MAXIMUM SIZE          Kb",43,105,24,9
  18118. DATA 12,"1  HIGH",70,95,8,9, 13,"2",70,105,2,9, 14,"3",73,105,2,9, 15,"4",76,105,2,9
  18119. DATA 16,"5",70,115,2,9, 17,"6",73,115,2,9, 18,"7",76,115,2,9, 19,"8   LOW",70,125,8,9
  18120. DATA 20,"RECORD",1,125,9,9
  18121. DATA 21,"MONITOR",58,125,9,9
  18122. ' 24
  18123. texte_icone1:
  18124. DATA 17,0,0
  18125. DATA 0,"PLAY SONG",20,0,11,9, 1,"EDIT",32,0,11,9, 2,"INSERT POS",44,0,11,9
  18126. DATA 3,"PREFS",56,0,11,9, 4,"SCORE",68,0,11,9
  18127. DATA 5,"PLAY PAT.",20,10,11,9, 6,"STOP",32,10,11,9, 7,"DELETE POS",44,10,11,9
  18128. DATA 8,"DRUM EDITOR",56,10,11,9, 9,"SAMP EDITOR",68,10,11,9
  18129. DATA 10,"DISK",20,20,6,9, 11,"TOOLS",27,20,6,9, 12,"INSTRUMENTS",34,20,11,9
  18130. DATA 13,"SAMPLES",46,20,7,9, 14,"ENVELOPES",54,20,9,9, 15,"CONTROL",64,20,9,9
  18131. DATA 16,"MIDI",74,20,5,9
  18132. ' 25
  18133. icones_control:
  18134. DATA 50,0,5
  18135. DATA 0,"VOLUMES",21,75,9,19, 1,"RESET",44,35,5,9
  18136. DATA 2," ",21,40,2,47, 3," ",21,92,2,5
  18137. DATA 4," ",26,40,2,47, 5," ",26,92,2,5
  18138. DATA 6," ",31,40,2,47, 7," ",31,92,2,5
  18139. DATA 8,"TEMPO    ",36,75,9,9, 9,"ⁿ",46,75,1,9, 10,"²",48,75,1,9
  18140. DATA 11,"SPEED    ",36,85,9,9, 12,"ⁿ",46,85,1,9, 13,"²",48,85,1,9
  18141. DATA 14,"01-08",36,45,6,9, 15,"09-16",43,45,6,9
  18142. DATA 16,"17-24",36,55,6,9, 17,"25-32",43,55,6,9
  18143. DATA 18," ",56,32,2,5, 19,"¯",60,31,1,7, 20,"³",62,31,1,7, 21," ",52,40,11,5
  18144. DATA 22," ",56,49,2,5, 23,"¯",60,48,1,7, 24,"³",62,48,1,7, 25," ",52,57,11,5
  18145. DATA 26," ",56,66,2,5, 27,"¯",60,65,1,7, 28,"³",62,65,1,7, 29," ",52,74,11,5
  18146. DATA 30," ",56,83,2,5, 31,"¯",60,82,1,7, 32,"³",62,82,1,7, 33," ",52,91,11,5
  18147. DATA 34," ",70,32,2,5, 35,"¯",74,31,1,7, 36,"³",76,31,1,7, 37," ",66,40,11,5
  18148. DATA 38," ",70,49,2,5, 39,"¯",74,48,1,7, 40,"³",76,48,1,7, 41," ",66,57,11,5
  18149. DATA 42," ",70,66,2,5, 43,"¯",74,65,1,7, 44,"³",76,65,1,7, 45," ",66,74,11,5
  18150. DATA 46," ",70,83,2,5, 47,"¯",74,82,1,7, 48,"³",76,82,1,7, 49," ",66,91,11,5
  18151. ' 26
  18152. icones_samples_sm9:
  18153. DATA 9,0,0
  18154. DATA 0,"DO",1,85,15,49
  18155. DATA 1,"SOURCE   ",19,125,9,9, 2,"ⁿ",29,125,1,9, 3,"²",31,125,1,9
  18156. DATA 4," ",33,125,29,9
  18157. DATA 5,"LEVEL       %",19,85,13,9
  18158. DATA 6,"SPEED    ",19,105,9,9, 7,"ⁿ",29,105,1,9, 8,"²",31,105,1,9
  18159. ' 27
  18160. icones_midi1:
  18161. DATA 15,0,5
  18162. DATA 0,"IN",26,34,3,9, 1,"OUT",30,34,3,9
  18163. DATA 2,"IN",26,46,3,9, 3,"OUT",30,46,3,9
  18164. DATA 4," ",0,0,0,0
  18165. DATA 5," ",0,0,0,0
  18166. DATA 6,"MONOPHONIC",21,75,12,9, 7,"POLYPHONIC",21,85,12,9
  18167. DATA 8,"CHANNEL      ",48,45,13,9, 9,"ⁿ",62,45,1,9, 10,"²",64,45,1,9
  18168. DATA 11,"INSTRUMENT   ",48,55,13,9, 12,"ⁿ",62,55,1,9, 13,"²",64,55,1,9
  18169. DATA 14,"P.M. CONF",67,85,11,9
  18170. ' 28
  18171. icones_midi2:
  18172. DATA 42,0,5
  18173. DATA 0,"1",55,31,2,15, 1,"2",58,31,2,15, 2,"3",61,31,2,15, 3,"4",64,31,2,15
  18174. DATA 4,"5",67,31,2,15, 5,"6",70,31,2,15, 6,"7",73,31,2,15, 7,"8",76,31,2,15
  18175. DATA 8,"9",55,48,2,15, 9,"10",58,48,2,15, 10,"11",61,48,2,15, 11,"12",64,48,2,15
  18176. DATA 12,"13",67,48,2,15, 13,"14",70,48,2,15, 14,"15",73,48,2,15, 15,"16",76,48,2,15
  18177. DATA 16,"17",55,65,2,15, 17,"18",58,65,2,15, 18,"19",61,65,2,15, 19,"20",64,65,2,15
  18178. DATA 20,"21",67,65,2,15, 21,"22",70,65,2,15, 22,"23",73,65,2,15, 23,"24",76,65,2,15
  18179. DATA 24,"25",55,82,2,15, 25,"26",58,82,2,15, 26,"27",61,82,2,15, 27,"28",64,82,2,15
  18180. DATA 28,"29",67,82,2,15, 29,"30",70,82,2,15, 30,"31",73,82,2,15, 31,"32",76,82,2,15
  18181. DATA 32,"MIDI CHANNEL     ",21,35,17,9, 33,"ⁿ",39,35,1,9, 34,"²",41,35,1,9
  18182. DATA 35,"INSTRUMENT       ",21,45,17,9, 36,"ⁿ",39,45,1,9, 37,"²",41,45,1,9
  18183. DATA 38,"SELECT CURRENT PRESET",21,60,21,9
  18184. DATA 39,"REMOVE MIDI CHANNEL",21,70,21,9
  18185. DATA 40,"RESET",21,85,5,9
  18186. DATA 41,"GENERAL CONF",29,85,15,9
  18187. ' 29
  18188. icones_samples_sm10:
  18189. DATA 8,0,0
  18190. DATA 0,"DISTORTION!",1,85,13,49
  18191. DATA 1,"SOURCE   ",17,125,9,9, 2,"ⁿ",27,125,1,9, 3,"²",29,125,1,9
  18192. DATA 4," ",31,125,29,9
  18193. DATA 5,"GAIN      %",17,85,11,9, 6,"ⁿ",29,85,1,9, 7,"²",31,85,1,9
  18194. ' 30
  18195. icones_drumeditor_main:
  18196. DATA 36,0,0
  18197. DATA 0,"RECORD",1,5,9,9, 1,"PLAY",1,15,9,9, 2,"STOP",1,25,9,9
  18198. DATA 3,"REAL TIME",18,45,9,9
  18199. DATA 4,"TEMPO      ",12,5,11,9, 5,"ⁿ", 24,5,1,9, 6,"²",26,5,1,9
  18200. DATA 7,"BEAT LEN   ",12,15,11,9, 8,"ⁿ", 24,15,1,9, 9,"²",26,15,1,9
  18201. DATA 10,"PAT LEN    ",12,25,11,9, 11,"ⁿ",24,25,1,9, 12,"²",26,25,1,9
  18202. DATA 13,"PATTERN    ",29,5,11,9, 14,"ⁿ",41,5,1,9, 15,"²",43,5,1,9
  18203. DATA 16,"IMPORT",29,15,7,9, 17,"EXPORT",37,15,7,9
  18204. DATA 18,"MAIN MENU",67,5,11,9
  18205. DATA 19,"SCORE",1,45,7,9, 20,"INFOS",9,45,7,9
  18206. DATA 21,"¯",29,45,3,9, 22,"³",33,45,3,9
  18207. DATA 23,"",1,70,12,9
  18208. DATA 24,"PAN                 ",14,70,20,9
  18209. DATA 25,"VOL",35,70,3,9, 26,"ⁿ",39,70,1,9, 27,"²",41,70,1,9
  18210. DATA 28,"TRACK   ",43,70,8,9, 29,"ⁿ",52,70,1,9, 30,"²",54,70,1,9
  18211. DATA 31,"",56,70,18,9, 32,"ⁿ",75,70,1,9, 33,"²",77,70,1,9
  18212. DATA 34,"",1,70,10,9, 35,"X",12,70,1,9
  18213. ' 31
  18214. icones_control_2:
  18215. DATA 20,0,5
  18216. DATA 0,"1ST PAGE",36,75,9,19, 1,"RESET",44,35,5,9
  18217. DATA 2," ",21,40,2,47, 3," ",21,92,2,5
  18218. DATA 4," ",26,40,2,47, 5," ",26,92,2,5
  18219. DATA 6," ",31,40,2,47, 7," ",31,92,2,5
  18220. DATA 8,"01-08",36,45,6,9, 9,"09-16",43,45,6,9
  18221. DATA 10,"17-24",36,55,6,9, 11,"25-32",43,55,6,9
  18222. DATA 12," ",56,40,1,47, 13," ",59,40,1,47, 14," ",62,40,1,47, 15," ",65,40,1,47
  18223. DATA 16," ",68,40,1,47, 17," ",71,40,1,47, 18," ",74,40,1,47, 19," ",77,40,1,47
  18224. ' Fin des donnees des sous-menus:
  18225. DATA -1
  18226. '
  18227. ' 0
  18228. popup_mod_ext:
  18229. DATA 11
  18230. DATA "*.GT2",0
  18231. DATA "*.GTK",1
  18232. DATA "*.MOD",2
  18233. DATA "*.S3M",3
  18234. DATA "*.DTM",4
  18235. DATA "*.MMD",5
  18236. DATA "*.MTM",6
  18237. DATA "*.669",7
  18238. DATA "*.ULT",8
  18239. DATA "*.XM",9
  18240. DATA "*.*",10
  18241. ' 1
  18242. popup_spl_ext:
  18243. DATA 5
  18244. DATA "*.AVR",0
  18245. DATA "*.SPL",1
  18246. DATA "*.WAV",2
  18247. DATA "*.VOC",3
  18248. DATA "*.*",4
  18249. ' 2
  18250. popup_path_type:
  18251. DATA 7
  18252. DATA "System",0
  18253. DATA "Module",1
  18254. DATA "Preferences",2
  18255. DATA "Sample",3
  18256. DATA "Instrument",4
  18257. DATA "Autoload",5
  18258. DATA "Miscellaneous",6
  18259. ' 3
  18260. popup_linestep:
  18261. DATA 8
  18262. DATA "Next volume",259
  18263. DATA "Next FX",258
  18264. DATA "Next note",257
  18265. DATA "Next line taken",256
  18266. DATA "1 line",1
  18267. DATA "2 lines",2
  18268. DATA "4 lines",4
  18269. DATA "8 lines",8
  18270. ' 4
  18271. popup_midi_in_poly:
  18272. DATA 9
  18273. DATA "Channel type:",$40000
  18274. DATA "Melody",0
  18275. DATA "Drums",1
  18276. DATA "Note Off:",$40000
  18277. DATA "Transcribed",10
  18278. DATA "Ignored",11
  18279. DATA "Velocity:",$40000
  18280. DATA "Transcribed",20
  18281. DATA "Ignored",21
  18282. ' Fin des donnees des pop-up:
  18283. DATA -1
  18284. '
  18285. touches_notes:
  18286. DATA 44,31,45,32,46,47,34,48,35,49,36,50,51,38,52,39,53
  18287. DATA 16,3,17,4,18,19,6,20,7,21,8,22,23,10,24,11,25,26,13,27,41
  18288. '
  18289. enveloppe_coms:
  18290. DATA $0,6
  18291. DATA "End",0,"Jump to ",0,"Wait ",50,"Set Counter ",1,"Loop to ",0,"Key Off",0
  18292. DATA $80,11
  18293. DATA "Volume ",$4000,"Vol Step ",0,"Vol Speed ",1
  18294. DATA "Tremolo On",0,"Tremolo Off",0,"Trem Width ",$10,"Trem Speed ",8
  18295. DATA "Tremor On",0,"Tremor Off",0,"TremorTime1 ",3,"TremorTime2 ",3
  18296. DATA $A0,7
  18297. DATA "Period ",$1000,"Tone Step ",0,"Tone Speed ",1
  18298. DATA "Vibrato On",0,"Vibrato Off",0,"Vib Width ",3,"Vib Speed ",8
  18299. DATA $C0,3
  18300. DATA "Panning ",$800,"Pan Step ",0,"Pan Speed ",1
  18301. '
  18302. rev_tap_delay_level:
  18303. DATA 0,0.213, 0.0349,0.135, 0.0714,0.051, 0.0178,0.217, 0.0371,0.153, 0.0317,0.174, 0.0627,0.157
  18304. rev_comb_delay_lpf:
  18305. DATA 0.0547,0.448, 0.07,0.496, 0.0448,0.408, 0.0646,0.476
  18306. '
  18307. keycode_names:
  18308. ' A mettre dans l'ordre:
  18309. ' * devant le nom: 1 parametre apres
  18310. ' ^ devant le nom: groupement de touches
  18311. DATA "CURSOR LEFT","CURSOR RIGHT","PREV LINE","NEXT LINE"
  18312. DATA "PREV OCTAVE","NEXT OCTAVE","PREV COLUMN","NEXT COLUMN"
  18313. DATA "PREV BAR","NEXT BAR","PREV SONGPOS","NEXT SONGPOS"
  18314. DATA "PREV PRESET","NEXT PRESET","DEC STEP","INC STEP"
  18315. DATA "DEC HIGH","INC HIGH","PLAY LINE","PLAY SONG"
  18316. DATA "CONT SONG","PLAY PATTERN","CONT PATTERN","STOP/EDIT"
  18317. DATA "PREV INSTR","NEXT INSTR","PREV SAMPLE","NEXT SAMPLE"
  18318. DATA "EXPAND","CPU TIME","REPLAY FREQ","INTERPOLATION ONE TRACK"
  18319. DATA "INTERPOLATION ALL TRACKS","LOAD MODULE","SAVE MODULE","RESYNC SCREEN"
  18320. DATA "SNAPSHOT","INSTRPAD/SAMPLEPAD/DRUMPAD","HELP","BLOCK START"
  18321. DATA "BLOCK END","INSTR UNDER CURSOR","CLEAR NOTE","CLEAR EFFECT"
  18322. DATA "CLEAR VOLUME","CLEAR WHOLE NOTE","COPY BLOCK (TRACK)","COPY BLOCK (PATTERN)"
  18323. DATA "COPY BLOCK (PRESET)","COPY BLOCK (TRACK UNDER CURSOR)","INSERT LINE IN PATTERN","INSERT LINE IN TRACK"
  18324. DATA "INSERT LINE IN PRESET","ROTATE & INSERT LINE IN PATTERN","ROTATE & INSERT LINE IN TRACK","ROTATE & INSERT LINE IN PRESET"
  18325. DATA "DELETE LINE IN PATTERN","DELETE LINE IN TRACK","DELETE LINE IN PRESET","ROTATE & DELETE LINE IN PATTERN"
  18326. DATA "ROTATE & DELETE LINE IN TRACK","ROTATE & DELETE LINE IN PRESET","*LINE","*LINE"
  18327. DATA "*LINE","*LINE","*LINE","*LINE"
  18328. DATA "*LINE","*LINE","*LINE","*LINE"
  18329. DATA "*^SELECT PRESET","*^SELECT PRESET","*^REC PRESET","*^REC PRESET"
  18330. DATA "*^INSTR/SAMPLE/DRUM","*^INSTR/SAMPLE/DRUM","*^REC INSTR/SAMPLE/DRUM","*^REC INSTR/SAMPLE/DRUM"
  18331. DATA "*^TRACK ON/OFF","*^TRACK ON/OFF","*^REC TRACK ON/OFF","*^REC TRACK ON/OFF"
  18332. ' sjx - VSLD
  18333. DATA "VOLUME SLIDE"
  18334. DATA "***","***"
  18335. '
  18336. key_scancode_to_ascii:
  18337. DATA "AZERTYUIOP","QSDFGHJKLM","WXCVBN,"
  18338. DATA "QWERTYUIOP","ASDFGHJKL:","ZXCVBNM"
  18339. '
  18340. default_keycodes:
  18341. DATA 85
  18342. DATA FFF0000,4B0000,F000100,0,0
  18343. DATA FFF0000,4D0000,F000100,0,0
  18344. DATA FFF0000,480000,F000100,0,0
  18345. DATA FFF0000,500000,F000100,0,0
  18346. DATA CFF0100,10100,F000100,0,0
  18347. DATA FFF0000,10000,F000100,0,0
  18348. DATA CFF0100,F0100,F000100,0,0
  18349. DATA FFF0000,F0000,F000100,0,0
  18350. DATA CFF0100,480100,F000100,0,0
  18351. DATA CFF0100,500100,F000100,0,0
  18352. DATA CFF0100,4B0100,F000100,0,0
  18353. DATA CFF0100,4D0100,F000100,0,0
  18354. DATA FFF0000,44B0000,F000100,0,0
  18355. DATA FFF0000,44D0000,F000100,0,0
  18356. DATA C0001FF,4000153,F000100,0,0
  18357. DATA F0000FF,4000053,F000100,0,0
  18358. DATA CFF0100,4480100,F000100,0,0
  18359. DATA CFF0100,4500100,F000100,0,0
  18360. DATA FFF0000,1C0000,F000100,0,0
  18361. DATA FFF0000,700000,F000100,0,0
  18362. DATA FFF0000,3E0000,F000100,0,0
  18363. DATA CFF0100,1C0100,CFF0100,700100,0
  18364. DATA CFF0100,3E0100,F000100,0,0
  18365. DATA FFF0000,390000,F000100,0,0
  18366. DATA FFF0000,520000,F000100,0,0
  18367. DATA FFF0000,470000,F000100,0,0
  18368. DATA 0,0,0,0,0
  18369. DATA 0,0,0,0,0
  18370. DATA F0000FF,4000045,F000100,0,0
  18371. DATA F0000FF,4000044,F000100,0,0
  18372. DATA F0000FF,4000052,F000100,0,0
  18373. DATA F0000FF,4000049,F000100,0,0
  18374. DATA C0001FF,4000149,F000100,0,0
  18375. DATA F0000FF,800004C,F000100,0,0
  18376. DATA F0000FF,8000053,F000100,0,0
  18377. DATA F0000FF,800004D,F000100,0,0
  18378. DATA F0000FF,C000050,F000100,0,0
  18379. DATA FFF0000,3F0000,F000100,0,0
  18380. DATA FFF0000,620000,F000100,0,0
  18381. DATA FFF0000,3B0000,F000100,0,0
  18382. DATA CFF0100,3B0100,F000100,0,0
  18383. DATA FFF0000,710000,F000100,0,0
  18384. DATA FFF0000,E0000,F000100,0,0
  18385. DATA CFF0100,E0100,F000100,0,0
  18386. DATA FFF0000,80E0000,F000100,0,0
  18387. DATA FFF0000,40E0000,F000100,0,0
  18388. DATA FFF0000,3C0000,F000100,0,0
  18389. DATA CFF0100,3C0100,F000100,0,0
  18390. DATA FFF0000,43C0000,F000100,0,0
  18391. DATA FFF0000,83C0000,F000100,0,0
  18392. DATA FFF0000,2520000,F000100,0,0
  18393. DATA FFF0000,4520000,F000100,0,0
  18394. DATA FFF0000,6520000,F000100,0,0
  18395. DATA FFF0000,3520000,F000100,0,0
  18396. DATA FFF0000,5520000,F000100,0,0
  18397. DATA FFF0000,7520000,F000100,0,0
  18398. DATA FFF0000,2530000,F000100,0,0
  18399. DATA FFF0000,4530000,F000100,0,0
  18400. DATA FFF0000,6530000,F000100,0,0
  18401. DATA FFF0000,3530000,F000100,0,0
  18402. DATA FFF0000,5530000,F000100,0,0
  18403. DATA FFF0000,7530000,F000100,0,0
  18404. DATA FFF0000,400000,F000100,0,0
  18405. DATA FFF0000,410000,F000100,0,10
  18406. DATA FFF0000,420000,F000100,0,20
  18407. DATA FFF0000,430000,F000100,0,30
  18408. DATA FFF0000,440000,F000100,0,3F
  18409. DATA CFF0100,400100,F000100,0,40
  18410. DATA CFF0100,410100,F000100,0,50
  18411. DATA CFF0100,420100,F000100,0,60
  18412. DATA CFF0100,430100,F000100,0,70
  18413. DATA CFF0100,440100,F000100,0,7F
  18414. DATA 0,0,0,0,0
  18415. DATA 0,0,0,0,10
  18416. DATA 0,0,0,0,0
  18417. DATA 0,0,0,0,10
  18418. DATA F000300,200,F000100,0,0
  18419. DATA F000200,1000200,F000100,0,10
  18420. DATA F000200,2000200,F000100,0,0
  18421. DATA F000200,3000200,F000100,0,10
  18422. DATA 0,0,0,0,0
  18423. DATA 0,0,0,0,10
  18424. DATA 0,0,0,0,0
  18425. DATA 0,0,0,0,10
  18426. DATA 0,0,0,0,0                          ! sjx - VSLD - no default, must be defined
  18427. '
  18428. help_text:
  18429. DATA "              ******************************************"
  18430. DATA "              *                                        *"
  18431. DATA "              *     G R A O U M F   T R A C K E R      *"
  18432. DATA "              *              F A L C O N               *"
  18433. DATA "              *                                        *"
  18434. DATA "              *      by Laurent de SORAS - 1994/96     *"
  18435. DATA "              *     and the Graoumf Devteam - 2000     *"
  18436. DATA "              *                                        *"
  18437. DATA "              ******************************************"
  18438. DATA ""
  18439. DATA "This is a beta/development version. Use at your own risk!"
  18440. DATA "(Sadly, this help text is slightly out of date. See README.TXT)"
  18441. DATA ""
  18442. DATA "                             ------------"
  18443. DATA "                             -   HELP   -"
  18444. DATA "                             ------------"
  18445. DATA ""
  18446. DATA "Graoumf Tracker is Freeware."
  18447. DATA ""
  18448. DATA "http://privatewww.essex.ac.uk/~smooreg/graoumf/"
  18449. DATA ""
  18450. DATA ""
  18451. DATA ""
  18452. DATA ""
  18453. '
  18454. DATA "Notes"
  18455. DATA "-----"
  18456. DATA ""
  18457. DATA "C  C# D  D# E     F  F# G  G# A  A# B     C  C# D  D# E    F  F# G  G#"
  18458. DATA "----------------------------------------------------------------------"
  18459. DATA "   2     3           5     6    7            9     0          -     `"
  18460. DATA "A     Z     E     R     T     Y     U     I     O     P    ^     $"
  18461. DATA "----------------------------------------------------------------------"
  18462. DATA "   S     D           G     H     J           L     M"
  18463. DATA "W     X     C     V     B     N     ,     ;     :     ="
  18464. DATA "----------------------------------------------------------------------"
  18465. DATA ""
  18466. DATA "Standard keys (you can redefine them)"
  18467. DATA "-------------------------------------"
  18468. DATA ""
  18469. DATA "SHIFT + ¯ ou ³            : Position +/-"
  18470. DATA "SHIFT + ⁿ ou ²            : Jump to the next bar"
  18471. DATA "TAB                       : Cursor on next column"
  18472. DATA "SHIFT + TAB               : Cursor on prev column"
  18473. DATA "CTRL + ¯ ou ³             : Preset +/-"
  18474. DATA "BACKSPACE                 : Clear note & instr under the curseur"
  18475. DATA "SHIFT + BACKSPACE         : Clear effect"
  18476. DATA "CTRL + BACKSPACE          : Clear note, instr & effect"
  18477. DATA "ALT + BACKSPACE           : Clear volume"
  18478. '
  18479. DATA "CTRL + DELETE             : Delete note (track)"
  18480. DATA "Left SHIFT + DELETE       : Delete note (pattern)"
  18481. DATA "Left SHIFT + CTRL + DEL   : Delete note (preset)"
  18482. DATA "CTRL + INSERT             : Insert note (track)"
  18483. DATA "Left SHIFT + INSERT       : Insert note (pattern)"
  18484. DATA "Left SHIFT + CTRL + INS   : Insert note (preset)"
  18485. DATA "These 6 commands + r SHIFT: Rotation of the track/pattern/preset"
  18486. DATA "Numeric Pad (+right SHIFT): Select an instrument"
  18487. DATA "INSERT                    : Prev instrument"
  18488. DATA "CLR HOME                  : Next instrument"
  18489. DATA "ESC (+ SHIFT)             : Next (prev) octave"
  18490. DATA "F5                        : NumPad is Instr/Sample/Drum-pad"
  18491. DATA "Left SHIFT + Numeric Pad  : Assign an Instr/Sample/Note to a key"
  18492. DATA "0 on NumPad               : Play song"
  18493. DATA "SHIFT + RET or + 0 on Pad : Play pattern"
  18494. DATA "RETURN                    : Play line"
  18495. DATA "F4                        : Cont song"
  18496. DATA "SHIFT + F4                : Cont pattern"
  18497. DATA "F1                        : Define block start"
  18498. DATA "SHIFT + F1                : Define block end"
  18499. DATA "F2                        : Paste block (piste)"
  18500. DATA "SHIFT + F2                : Paste block (pattern)"
  18501. DATA "CTRL + F2                 : Paste block (preset)"
  18502. DATA "ALT + F2                  : Paste block (track under the cursor)"
  18503. '
  18504. DATA "F6 - F10 (+ SHIFT)        : Line 00, 10, 20, 30 et 3F (+40)"
  18505. DATA "CTRL + SHIFT + ⁿ          : Increase pattern window height"
  18506. DATA "CTRL + SHIFT + ²          : Decrease pattern window height"
  18507. DATA "CTRL + D                  : Display CPU time"
  18508. DATA "CTRL + E                  : Change pattern display mode:"
  18509. DATA "                            - Note + Instr"
  18510. DATA "                            - Note + Instr + FX"
  18511. DATA "                            - Note + Instr + FX + Volume"
  18512. DATA "CTRL + I                  : Interpolation On/Off (track)"
  18513. DATA "CTRL + SHIFT + I          : Interpolation On/Off (pattern)"
  18514. DATA "CTRL + R                  : Change replay frequency"
  18515. DATA "CTRL + S                  : Increase the LineStep"
  18516. DATA "  + SHIFT                 : Decrease the LineStep"
  18517. DATA "ALT + L                   : Load module"
  18518. DATA "ALT + S                   : Save module"
  18519. DATA ""
  18520. DATA ""
  18521. DATA ""
  18522. DATA ""
  18523. DATA ""
  18524. DATA ""
  18525. DATA ""
  18526. DATA ""
  18527. DATA ""
  18528. '
  18529. DATA "Effects"
  18530. DATA "-------"
  18531. DATA ""
  18532. DATA "01xx : Portamento up"
  18533. DATA "02xx : Portamento down"
  18534. DATA "03xx : Tone portamento"
  18535. DATA "04xy : Vibrato"
  18536. DATA "05xx : Tone portamento + Vibrato"
  18537. DATA "06xy : Vibrato + Tone portamento"
  18538. DATA "07xy : Tremolo"
  18539. DATA "08xy : Detune"
  18540. DATA "09xx : Note delay"
  18541. DATA "0Axx : Cut note"
  18542. DATA "0Bxx : Go to position xx"
  18543. DATA "0C?x : Set vibrato waveform"
  18544. DATA "0Dxx : Break pattern"
  18545. DATA "0E?x : Set tremolo waveform"
  18546. DATA "0Fxx : Set global speed/Tempo"
  18547. DATA "10xy : Arpeggio"
  18548. DATA "11xx : Fine portamento up"
  18549. DATA "12xx : Fine portamento down"
  18550. DATA "13xy : Roll + Volume slide"
  18551. DATA "14xx : Linear volume slide up"
  18552. DATA "15xx : Linear volume slide down"
  18553. '
  18554. DATA "16xx : Exp. volume slide up"
  18555. DATA "17xx : Exp. volume slide down"
  18556. DATA "18xx : Linear volume slide up + Tone portamento"
  18557. DATA "19xx : Linear volume slide down + Tone portamento"
  18558. DATA "1Axx : Exp. volume slide up + Tone portamento"
  18559. DATA "1Bxx : Exp. volume slide down + Tone portamento"
  18560. DATA "1Cxx : Linear volume slide up + Vibrato"
  18561. DATA "1Dxx : Linear volume slide down + Vibrato"
  18562. DATA "1Exx : Exp. volume slide up + Vibrato"
  18563. DATA "1Fxx : Exp. volume slide down + Vibrato"
  18564. DATA "A0xx : Linear master volume slide up"
  18565. DATA "A1xx : Linear master volume slide down"
  18566. DATA "A4xx : Fine linear volume up"
  18567. DATA "A5xx : Fine linear volume down"
  18568. DATA "A6xx : Fine linear master volume up"
  18569. DATA "A7xx : Fine linear master volume down"
  18570. DATA "A8xx : Set number of frames"
  18571. DATA "A9xx : Set fine speed"
  18572. DATA "AAxx : Pattern delay"
  18573. DATA "ABxx : Extra fine tone portamento"
  18574. DATA "ACxx : Extra fine portamento up"
  18575. DATA "ADxx : Extra fine portamento down"
  18576. DATA "AExx : Left balance move"
  18577. DATA "AFxx : Right balance move"
  18578. '
  18579. DATA "B0xy : Tremor"
  18580. DATA "B1xx : Pattern loop"
  18581. DATA "B2xx : Set flags... +1: Linear interpolation on the track"
  18582. DATA "B3xx : Set Volume Envelope"
  18583. DATA "B4xx : Set Tone Evelope"
  18584. DATA "B5xx : Set Panning Envelope"
  18585. DATA "B6xx : Set Volume Envelope and Key Off"
  18586. DATA "B7xx : Set Tone Envelope and Key Off"
  18587. DATA "B8xx : Set Panning Envelope and Key Off"
  18588. DATA "BAxx : Fine Sample Offset"
  18589. DATA "BBxx : Very Fine Sample Offset"
  18590. DATA "BCxx : Increment Sample Position"
  18591. DATA "BDxx : Decrement Sample Position"
  18592. DATA "BExx : Auto Tempo"
  18593. DATA "BFxx : Auto Period"
  18594. DATA "C2xx : Set linear track volume"
  18595. DATA "C3xx : Set exponential track volume"
  18596. DATA "C4xx : Linear track volume slide up"
  18597. DATA "C5xx : Linear track volume slide down"
  18598. DATA "C6xx : Exponential track volume slide up"
  18599. DATA "C7xx : Exponential track volume slide down"
  18600. DATA "C8xx : Fine exponential track volume slide up"
  18601. DATA "C9xx : Fine exponential track volume slide down"
  18602. DATA ""
  18603. '
  18604. DATA "2xxx : Set linear volume"
  18605. DATA "3xxx : Set exp. volume"
  18606. DATA "4xxx : Set balance"
  18607. DATA "5xxx : Set master linear volume"
  18608. DATA "6xxx : Set master esp. volume"
  18609. DATA "7xyy : Roll"
  18610. DATA "8xyz : Roll + volume slide + set balance"
  18611. DATA "9xxx : Sample Offset"
  18612. DATA ""
  18613. DATA ""
  18614. DATA ""
  18615. DATA ""
  18616. DATA ""
  18617. DATA ""
  18618. DATA ""
  18619. DATA ""
  18620. DATA ""
  18621. DATA ""
  18622. DATA ""
  18623. DATA ""
  18624. DATA ""
  18625. DATA ""
  18626. DATA ""
  18627. DATA ""
  18628. '
  18629. DATA "THE CRUCIFICTION OF SEAN PENN"
  18630. DATA ""
  18631. DATA "We're gonna kill the California girls"
  18632. DATA "We're gonna fire the exploding load"
  18633. DATA "in the milkmaid maidenhead"
  18634. DATA "We're gonna find the meaning of feeling good"
  18635. DATA "And we're gonna stay there as long as we think we should"
  18636. DATA "  Mystery train"
  18637. DATA "  Three way plane"
  18638. DATA "  Expressway to yr skull"
  18639. DATA ""
  18640. DATA "                                               (SoNiC YoUTh / E.V.O.L)"
  18641. DATA ""
  18642. DATA ""
  18643. DATA "I'm the firestarter"
  18644. DATA "Twisted firestarter"
  18645. '    "1234567890123456789012345678901234567890123456789012345678901234567890"
  18646. DATA "                                                         (The Prodigy)"
  18647. DATA ""
  18648. DATA ""
  18649. DATA ""
  18650. DATA ""
  18651. DATA ""
  18652. DATA ""
  18653. DATA ""
  18654. '    "1234567890123456789012345678901234567890123456789012345678901234567890"
  18655. DATA "***"
  18656. '
  18657. textes_blagues:
  18658. DATA "Mr et Mme BRICOT ont un fils,|comment l'appellent-ils ?||R : Judas","*"
  18659. DATA "Mr et Mme POTDANLAPOCHE ont une fille,|comment l'appellent-ils ?||R : Jessica","*"
  18660. DATA "Mr et Mme PEULAFENETRE ont trois fils,|comment les appellent-ils ?||R : Geoffroy, Angele, Firmin","*"
  18661. DATA "Mr et Mme HERGEBEL ont un fils,|comment l'appellent-ils ?||R : Octave","*"
  18662. DATA "Mr et Mme PAFROI ont sept fils,|comment les appellent-ils ?||R : Eva, Aude, Anne, Marc, Sanson, Gilles et Ella","*"
  18663. DATA "Mr et Mme PROVISTSAPU ont trois fils,|comment les appellent-ils ?||R : Quentin, Gaspard, Alain","*"
  18664. DATA "Mr et Mme LIOTEKDAKAJOU ont un fils,|comment l'appellent-ils ?||R : Habib","*"
  18665. DATA "Mr et Mme REMORD ont un fils,|comment l'appellent-ils ?||R : Yves","*"
  18666. DATA "Mr et Mme POURLAVERLCARLAGE ont un fils,|comment l'appellent-ils ?||R : Vladimir","*"
  18667. DATA "Mr et Mme CREMENT ont un fils,|comment l'appellent-ils ?||R : Alex","*"
  18668. DATA "Mr et Mme TANANANANANANA ont deux fils,|comment les appellent-ils ?||R : Starsky et Hutch","*"
  18669. DATA "Mr et Mme LFRIGO ont cinq fils,|comment les appellent-ils ?||R : Steve, Eude, Hubert, Yann, Adam","*"
  18670. DATA "Mr et Mme ERVITMONSLIP ont un fils,|comment l'appellent-ils ?||R : Jean-Philippe","*"
  18671. DATA "Mr et Mme ZELPOURMONMOTEUR ont un fils,|comment l'appellent-ils ?||R : Didier","*"
  18672. DATA "Mr et Mme MAIJAVALPA ont un fils,|comment l'appellent-ils ?||R : Jesus","*"
  18673. DATA "Mr et Mme MAROLEX ont une fille,|comment l'appellent-ils ?||R : Eleonore","*"
  18674. DATA "Mr et Mme PONSABLDUMATOS ont une fille,|comment l'appellent-ils ?||R : Therese","*"
  18675. DATA "Mr et Mme LUTFINALE ont une fille,|comment l'appellent-ils ?||R : Sheila","*"
  18676. DATA "Mr et Mme CHMONFILS ont un fils,|comment l'appellent-ils ?||R : Thierry","*"
  18677. DATA "Mr et Mme BIENUNPTICASCROUTE ont un fils,|comment l'appellent-ils ?||R : Humphrey","*"
  18678. DATA "Mr et Mme BISTROJAISOIF ont un fils,|comment l'appellent-ils ?||R : Alonzo","*"
  18679. DATA "Mr et Mme CONERY ont une fille,|comment l'appellent-ils ?||R : Aretha","*"
  18680. DATA "Mr et Mme PUDBIERDANLFRIGO ont un fils,|comment l'appellent-ils ?||R : Roger","*"
  18681. DATA "Mr et Mme ITZEGOUDWAITOUZESTATION ont une fille,|comment l'appellent-ils ?||R : Eloise","*"
  18682. DATA "Mr et Mme POURIEN ont trois fils,|comment les appellent-ils ?||R : Yvon, Paul et Mickey","*"
  18683. DATA "Mr et Mme AMAR ont cinq fils,|comment les appellent-ils ?||R : Ella, Pacome, Ancel, Helene,|Nadege","*"
  18684. DATA "Mr et Mme NAIBOURREDAITA ont trois fils,|comment les appelent-ils ?||R : Derek, Tom, Jean","*"
  18685. DATA "Mr et Mme ORER ont un fils,|qui est l'ami du fils de|Mr et Mme JEUNER. Comment|s'appelle le fils des ORER ?||R : Rick|Car Rick ORER, l'ami du petit des JEUNER","*"
  18686. DATA "Mr et Mme MACOUVERTURMEGRAT ont une fille,|comment l'appellent-ils ?||R : Sandra","*"
  18687. DATA "Mr et Mme SURLELITETPASSURLECANAPE ont un chien,|comment l'appelent-ils ?||R : Medor","*"
  18688. DATA C'est un chat|qui se fait eventrer|par John Borg|qui a besoin de|nouvelles|cordes.||Le chat dit :|"C'est du racket!"
  18689. DATA "*","C'est deux Corses qui se promenent.|Tout d'un coup, l'un deux se retourne"
  18690. DATA "et ecrase un escargot. L'autre :|- Ben pourquoi t'as fait ca ?"
  18691. DATA "- Ca faisait un quart d'heure|que cette bestiole nous suivait!","*"
  18692. DATA "2 vieilles dames discutent|sur la terrasse d'un cafe :"
  18693. DATA "- J'ai l'impression que l'homme la-bas,|il nous regarde avec envie."
  18694. DATA "- Tu m'etonnes, c'est l'antiquaire!","*"
  18695. DATA "Saviez-vous qu'il y a deux|sortes de Pastis ?|- Le Pastis 51 au gout d'anis|- Le Pastis 69 au gout d'anus","*"
  18696. DATA "C'est un type qui veut se suicider."
  18697. DATA "Pour son dernier jour, il se lave, se coiffe,"
  18698. DATA "se relave, met du Petrol Hane, du parfum,"
  18699. DATA "enfile ses plus beaux habits."
  18700. DATA "Il monte en haut de la Tour Eiffel, et saute."
  18701. DATA "Le corps s'ecrase, suivi plusieurs secondes"
  18702. DATA "apres de ses cheveux.|Pourquoi ?|"
  18703. DATA "R : parceque Petrol Hane ralentit|la chute des cheveux...","*"
  18704. DATA "C'est un gars qui a une moumoute et|qui va chez le coiffeur"
  18705. DATA "La, rien a faire, les ciseaux|n'arrivent pas a couper les cheveux.|Pourquoi ?|"
  18706. DATA "R : parceque les faux tifs ne sont pas coupables","*"
  18707. DATA "Pourquoi les Somaliens ne prennent-|ils pas de medicament ?||R : C'est marque dessus :|"A prendre apres chaque repas","*"
  18708. DATA "Qu'est-ce qui est le plus|dur a manger dans|un legume ?||R : la chaise roulante","*"
  18709. DATA "Quel est le point commun entre|un myopathe et un spaghetti ?||R : Le spaghetti bouge quand|on le suce...","*"
  18710. DATA "Qu'est-ce qui est vert|et qui devient rouge|quand on appuie sur|un bouton ?||R : Une grenouille dans un mixer","*"
  18711. DATA "Qu'est-ce qui est vert|et qui pue au fond des bois ?||R : Un scout mort","*"
  18712. DATA "Qu'est-ce qui est rouge|et qui a plus de cervelle|que Kurt Cobain ?||R : Son plafond","*"
  18713. DATA "Qu'est-ce qui est petit, rouge,|et qui avance en faisant|beaucoup de bruit ?||R : Un bebe sucant des lames de rasoir","*"
  18714. DATA "Qu'est-ce qui est petit, rouge,|et qui ne tourne pas dans|les couloirs ?||R : Un enfant avec un javelot|dans la tete.","*"
  18715. DATA "Qu'est-ce qu'une boite jaune a|l'exterieur et noire a l'interieur ?||R : Une R4 de la Poste","*"
  18716. DATA "Qu'y a-t-il de pire qu'un|bebe dans une poubelle ?||R : Un bebe dans deux poubelles","*"
  18717. DATA "Qu'est-ce qu'un combat|d'eunuques ?||R : c'est un combat sanglant","*"
  18718. DATA "C'est J.C. Vandame qui rentre|dans sa bagnole et qui|fout l'contact","*"
  18719. DATA "C'est Stallone qui va au|bal et qui se rend beau","*"
  18720. DATA "C'est un mec qui rentre|dans un cafe et PLOUF!","*"
  18721. DATA "C'est un sanglier qui|croise un cochon:|- Ca se passe bien pour|toi la chimiotherapie ?","*"
  18722. DATA "Vous connaissez l'histoire|de Paf le chien ?||C'est un chien qui traverse|l'autoroute et PAF le chien!","*"
  18723. DATA "Vous connaissez l'histoire|de Scroutch l'escargot ?||C'est un escargot qui passe|sous un rouleau compresseur|et SCROUTCH l'escargot!","*"
  18724. DATA "Vous connaissez l'histoire|de Zip le pingouin ?||C'est un pingouin qui se promene|sur la banquise et ZIP le pingouin!","*"
  18725. DATA "Vous connaissez l'histoire|de Flip-Flop la girafe ?||C'est un helicoptere qui fait du|rase-motte et FLIP-FLOP la girafe!","*"
  18726. DATA "Vous connaissez l'histoire|de Tiens la vieille ?||C'est une vieille qui se fait|frapper et TIENS la vieille!","*"
  18727. DATA "***"
  18728.