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.LST < prev    next >
File List  |  2000-04-04  |  697KB  |  18,454 lines

  1. ' ****************************************************************************
  2. ' *                                                                          *
  3. ' * #### #### #### #### #  # #   # ####  ##### #### #### #### #  # #### #### *
  4. ' * #    #  # #  # #  # #  # ## ## #       #   #  # #  # #    #  # #    #  # *
  5. ' * # ## ###  #### #  # #  # # # # ###     #   ###  #### #    ###  ###  ###  *
  6. ' * #  # #  # #  # #  # #  # #   # #       #   #  # #  # #    #  # #    #  # *
  7. ' * #### #  # #  # #### #### #   # #       #   #  # #  # #### #  # #### #  # *
  8. ' *                                                                          *
  9. ' *         THE ULTIMATE 32-VOICES DSP SOUNDTRACKER ON ATARI FALCON.         *
  10. ' *                        TO SERVE WITH FRESH BLOOD.                        *
  11. ' *                                                                          *
  12. ' *              GRAOUMF TRACKER by Laurent de SORAS ~ 1994-96               *
  13. ' *                                                                          *
  14. ' ****************************************************************************
  15. '
  16. ' GRAOUMF TRACKER by Laurent de SORAS and the Graoumf Devteam ~ 2000
  17. '
  18. ' The Graoumf Devteam is:
  19. '                         - sjx
  20. '                         - lp
  21. '
  22. ' ============================================================================
  23. ' Divers bugs et contraintes dus au GfA-Basic:
  24. '     - Ne pas utiliser EXIST() (fonction redefinie).
  25. '     - Sous le compilateur, les operations flottantes a arguments uniquement
  26. ' entiers ne sont pas toujours calculees en flottant.
  27. ' ============================================================================
  28. '
  29. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  30. ' *                                                                          *
  31. ' *                              Initialisations                             *
  32. ' *                                                                          *
  33. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  34. '
  35. ' -------------------------- [ post-SORAS version history ] ------------------
  36. ' /sjx - 0.8776 - Correcting typos and making bugfixes, about 10 in all.
  37. '                 Notably, envelopes are now actually saved in GT2 modules!
  38. '                 Also, new configuration file options:
  39. '                     grmode_preserve  (set to yes to force graoumf not to change resolution)
  40. '                     grmode_skipxbra  (set to yes to force graoumf not to unhook NVDI, etc.)
  41. '                 ... these ought to improve stability in certain cases.
  42. '                 See the update documentation for more detailed info.
  43. ' /sjx - 0.8775 - Workaround for a bug in 0.8770 (which would save GT2 modules
  44. '                 with a quirk whereby some samples would start with a 'ASMP'
  45. '                 chunk). Looks like the old binary sometimes did one too many
  46. '                 byteswaps, so as a result, the loader has to be kludged.
  47. '                 (On the bright side, once saved again, it'll be correct.)
  48. ' /sjx - 0.8774 - Full support for Octalyser modules (e.g., CD83) added.
  49. ' /sjx - 0.8773 - Seriously braindead bug ("jmp 0"?!) with unknown module type
  50. '                 fixed - bug in compiler. Don't goto to an undefined label!
  51. ' /sjx - 0.8772 - Some registration legacy code removed; as now freeware.
  52. '        0.8771 - Laurent de SORAS's full source code release. Freeware.
  53. '                 Note that changes between 8870 and 8771 are unknown.
  54. '        0.8770 - Last known binary release.
  55. ' ----------------------------------------------------------------------------
  56. gtk_version%=8776               ! Numero de version du logiciel x10000
  57. gtk_file_vnum%=4                ! Numero de format de module GTK
  58. gt2_file_vnum%=4                ! Numero de format de module GT2
  59. npath_prog$=CHR$(ADD(65,GEMDOS(&H19)))+":"+DIR$(0)+"\SYS\"
  60. ' npath_prog$="E:\DEV.GTK\SYS\"   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  61. npath_prefs$=npath_prog$        ! Chemin des preferences
  62. nfile_prefs$="GTKPREFS.INF"     ! Fichier de preferences a charger
  63. nfile_present$="PRESENT.PIC"    ! Nom de l'image de presentation
  64. nfile_logo$="GT_LOGO.PI1"       ! Nom du logo
  65. key_click%=PEEK(&H484)          ! Sauve l'etat du clavier
  66. '
  67. GOSUB init_variables_prefs
  68. '
  69. IF FN exist(npath_prefs$+nfile_prefs$)
  70.   GOSUB load_prefs2(npath_prefs$+nfile_prefs$,TRUE)
  71. ENDIF
  72. '
  73. ' Initialisations diverses 1
  74. ' --------------------------
  75. xbra_remove$=""                                 ! Les adr de tous les vecteurs detournes (adr_vect.l, old_val_vect.l)
  76. zone%=0                                         ! C'est a cause du Mfree qui peut intervenir avant le Malloc (break)
  77. oldscreenmode%=0                                ! Idem.
  78. GOSUB change_resolution
  79. adr_af_pat%=ADD(XBIOS(2),MUL(SHR(scr_larg%,1),170))     ! Adresse d'affichage des patterns
  80. ON BREAK GOSUB br
  81. GOSUB bee(TRUE)
  82. SPOKE &H484,PEEK(&H484) AND -2
  83. ~XBIOS(&H82,4,2)
  84. ~XBIOS(&H82,5,0)                                ! Connecte l'ADC pour la partie enregistrement
  85. GOSUB charge_g_routines
  86. attente_fin_presentation%=0                     ! Nombre de secondes a attendre apres la presentation
  87. graoumf_logo$=""                                ! Le logo
  88. graoumf_logo_mask$=""                           ! Et son masque
  89. GOSUB charge_image_presentation
  90. '
  91. GOSUB init_tableaux
  92. '
  93. ' Initialisations diverses 2
  94. ' --------------------------
  95. para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  96. garbage%=0
  97. GOSUB charge_r_routines
  98. ARRAYFILL module&(),&H2020                      ! Initialise le module
  99. module&(0)=&H4754
  100. module&(1)=ADD(&H4B00,gtk_file_vnum% AND 255)
  101. module&(98)=255                                 ! Nbr d'instr
  102. module&(99)=nbr_lines%
  103. module&(100)=nbr_track%
  104. module&(101)=1
  105. module&(102)=0
  106. '
  107. GOSUB reset_all_midi_track_state
  108. GOSUB chg_midi_flag_data_in(midi_flag_data_in!)
  109. '
  110. GOSUB init_fonctions_simples
  111. '
  112. GOSUB init_variables_post_prefs
  113. '
  114. HIDEM
  115. SETMOUSE SHL(ADD(divbi&(0,0,0),SHR(SUCC(divbi&(2,0,0)),1)),3),ADD(divbi&(1,0,0),5),0
  116. GOSUB teste_enregistrement
  117. HIDEM
  118. GOSUB attente_interruptible(attente_fin_presentation%)
  119. CLS
  120. GOSUB nouvelle_palette(color_pal$)
  121. IF NOT flag_registered!
  122.   SHOWM
  123.   GOSUB affiche_please_register
  124. ENDIF
  125. GOSUB affiche_panneau_principal
  126. ~FRE(0)
  127. GOSUB autoload
  128. GOSUB aff_message("Welcome to GRAOUMF TRACKER v"+STR$(gtk_version%/10000)+mes_registred$)
  129. ON ERROR GOSUB erreur_gfa_basic
  130. '
  131. '
  132. '
  133. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  134. ' *                                                                          *
  135. ' *                            Boucle principale                             *
  136. ' *                                                                          *
  137. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  138. '
  139. DO
  140.   '
  141.   ' Souris
  142.   ' ------
  143.   SHOWM
  144.   MOUSE xm%,ym%,km%
  145.   IF km%<>0 AND xm%<8 AND ym%<8         ! On se barre ?
  146.     GOSUB dialog("QUIT","Do you really want to quit|GRAOUMF TRACKER ?","Yes sir!|Bof...|No, no!",xm%,ym%)
  147.     IF bouton%=0 OR (bouton%=1 AND (TIMER AND 1)=1)
  148.       CLS
  149.       IF NOT flag_registered!
  150.         GOSUB affiche_please_register
  151.       ENDIF
  152.       GOSUB br
  153.     ELSE
  154.       GOSUB affiche_panneau_principal
  155.       MOUSE xm%,ym%,km%
  156.     ENDIF
  157.   ELSE IF km%<>0 AND xm%=PRED(scr_larg%) AND ym%=PRED(scr_haut%)
  158.     flag_blague!=TRUE
  159.   ENDIF
  160.   '
  161.   ' Icones a repetition
  162.   ' -------------------
  163.   IF km%<>0 AND ym%>159 AND ym%<170
  164.     ' Changement de la voie d'une colonne
  165.     IF type_affpiste%=0         ! Selon la taille d'une piste
  166.       a%=SUB(xm%,24) MOD 48
  167.       b%=DIV(SUB(xm%,24),48)
  168.       c%=6
  169.     ELSE IF type_affpiste%=2
  170.       a%=SUB(xm%,24) MOD 96
  171.       b%=DIV(SUB(xm%,24),96)
  172.       c%=12
  173.     ELSE
  174.       a%=SUB(xm%,24) MOD 80
  175.       b%=DIV(SUB(xm%,24),80)      ! Numero de la colonne
  176.       c%=10
  177.     ENDIF
  178.     IF km%=1 AND b%=>0 AND b%<MIN(nbr_col%,nbr_colonnes%(n_preset%))
  179.       IF a%>47
  180.         IF a%<64          ! Fleche haut
  181.           d%=1
  182.         ELSE IF a%<80     ! Fleche bas
  183.           d%=-1
  184.         ENDIF
  185.         preset&(b%,n_preset%)=MIN(MAX(ADD(preset&(b%,n_preset%),d%),0),PRED(nbr_track%))
  186.       ELSE
  187.         a$=STR$(SUCC(preset&(b%,n_preset%)),2)
  188.         GOSUB edite_chaine(a$,ADD(MUL(b%,c%),6),162,2,2)
  189.         preset&(b%,n_preset%)=MIN(MAX(PRED(VAL(bbbb$)),0),PRED(nbr_track%))
  190.         GOSUB affiche_c_pattern
  191.       ENDIF
  192.       GOSUB affiche_info_preset
  193.     ELSE IF km%=2 AND a%>7 AND a%<48 AND b%=>0 AND b%<nbr_col%
  194.       nbr_colonnes%(n_preset%)=SUCC(b%)
  195.       curs_col%=MIN(curs_col%,b%)
  196.       GOSUB affiche_info_preset
  197.     ENDIF
  198.     GOTO fin_test_souris
  199.   ENDIF
  200.   '
  201.   ' Icones a simple clic
  202.   ' --------------------
  203.   IF km%<>0 AND ym%<30 AND xm%>167 AND xm%<640  ! Icones du haut
  204.     ~FRE(0)
  205.     GOSUB gere_icones_haut
  206.   ELSE IF km%<>0 AND ym%>34 AND ym%<105 AND xm%>159 AND xm%<640
  207.     ~FRE(0)
  208.     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
  209.   ELSE IF km%<>0 AND ym%>129 AND ym%<140 AND xm%>63 AND xm%<576
  210.     ' --- Choix d'un preset --------------------------------------------------
  211.     GOSUB chg_preset(SHR(SUB(xm%,64),4))
  212.   ELSE IF km%<>0 AND ym%>169 AND ym%<ADD(170,MUL(haut_lig%,6)) AND xm%>31
  213.     ' --- Clic sur une colonne -----------------------------------------------
  214.     IF type_affpiste%=0               ! Selon la largeur d'une piste
  215.       a%=DIV(SUB(xm%,32),48)
  216.       b%=SUB(SUB(xm%,32),MUL(a%,48))
  217.     ELSE IF type_affpiste%=2
  218.       a%=DIV(SUB(xm%,32),96)
  219.       b%=SUB(SUB(xm%,32),MUL(a%,96))
  220.     ELSE
  221.       a%=DIV(SUB(xm%,32),80)
  222.       b%=SUB(SUB(xm%,32),MUL(a%,80))
  223.     ENDIF
  224.     IF km%=1
  225.       ' Bouton gauche: positionne le curseur
  226.       IF a%<nbr_colonnes%(n_preset%) AND b%<72
  227.         curs_col%=a%
  228.         curs_x%=MAX(0,SUB(SHR(b%,3),2))
  229.         a%=ADD(170,MUL(SHR(haut_lig%,1),6))
  230.         IF ym%<a%
  231.           posligne%=MAX(0,MIN(PRED(FN nbr_lines3),ADD(posligne%,DIV(SUB(ym%,ADD(a%,5)),6))))
  232.         ELSE IF ym%>ADD(a%,5)
  233.           posligne%=MAX(0,MIN(PRED(FN nbr_lines3),ADD(posligne%,DIV(SUB(ym%,a%),6))))
  234.         ENDIF
  235.         IF play%>0
  236.           DPOKE r_mod_linepos%,posligne%
  237.         ENDIF
  238.         GOSUB affiche_c_pattern
  239.         GOSUB wait_mouse(TRUE)
  240.       ENDIF
  241.       ' Bouton droit: track on/off
  242.     ELSE IF km%=2
  243.       IF a%<nbr_colonnes%(n_preset%)
  244.         a%=preset&(a%,n_preset%)
  245.         GOSUB chg_a_track_onoff(a%,ABS(SGN(FN track_onoff(a%))) XOR 1)
  246.         GOSUB wait_mouse(TRUE)
  247.       ENDIF
  248.     ENDIF
  249.   ELSE IF km%<>0 AND ym%>119 AND ym%<130 AND xm%>63
  250.     ' --- Track on/off, par appui sur les touches ----------------------------
  251.     a%=SHR(SUB(xm%,64),4)
  252.     IF a%<nbr_track%
  253.       IF km%=1          ! Track on/off
  254.         GOSUB chg_a_track_onoff(a%,ABS(SGN(FN track_onoff(a%))) XOR 1)
  255.       ELSE              ! Track cliquee on, les autres off
  256.         FOR i%=0 TO PRED(nbr_track%)
  257.           IF i%<>a%
  258.             GOSUB chg_track_onoff(i%,0)
  259.             GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  260.           ELSE
  261.             GOSUB chg_track_onoff(i%,1)
  262.             GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  263.           ENDIF
  264.         NEXT i%
  265.         GOSUB affiche_info_preset
  266.       ENDIF
  267.       GOSUB affiche_info_preset
  268.       GOSUB wait_mouse(TRUE)
  269.     ENDIF
  270.   ELSE IF km%>0
  271.     ' --- Toutes les autres icones -------------------------------------------
  272.     GOSUB gere_icones_panneaup
  273.   ENDIF
  274. fin_test_souris:
  275.   '
  276.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  277.   '
  278.   ' MIDI In
  279.   ' -------
  280.   IF edit%<>0 AND play%=0                       ! Seulement en Edit sans Play
  281.     IF CARD{r_midi_in_gfa_playline%}<>0         ! Une ou des notes frappees?
  282.       CARD{r_midi_in_gfa_playline%}=0
  283.       FOR i%=0 TO PRED(nbr_track%)
  284.         a%=ADD(r_new_note_buffer%,MUL(i%,6))
  285.         b%=FN adr_strk(songpos%,posligne%,i%)
  286.         IF BYTE{a%}<>0                          ! Si nouvelle note sur cette piste,
  287.           LONG{b%}=LONG{SUCC(a%)}               ! copie-la sur le pattern
  288.           BYTE{ADD(b%,4)}=BYTE{ADD(a%,5)}
  289.           BYTE{a%}=0
  290.         ENDIF
  291.         LONG{ADD(V:pattern_bidon%(8),MUL(i%,5))}=LONG{b%}
  292.         BYTE{ADD(V:pattern_bidon%(8),ADD(MUL(i%,5),4))}=BYTE{ADD(b%,4)}
  293.       NEXT i%
  294.       GOSUB play_pattern_bidon
  295.       GOSUB next_line
  296.     ENDIF
  297.   ENDIF
  298.   '
  299.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  300.   '
  301.   ' Clavier
  302.   ' -------
  303.   GOSUB gestion_clavier
  304.   '
  305.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  306.   '
  307.   ' Affichages
  308.   ' ----------
  309.   ' Pattern et horloge
  310.   IF play%>0
  311.     posligne%=DPEEK(r_mod_linepos%)
  312.     GOSUB affiche_c_pattern
  313.     IF play%=1 AND songpos%<>DPEEK(r_mod_songpos%)
  314.       songpos%=DPEEK(r_mod_songpos%)
  315.       GOSUB affiche_info_song
  316.     ENDIF
  317.     GOSUB affiche_temps
  318.   ENDIF
  319.   ' Raffraichissement du sous-menu Control
  320.   IF ss_menu%=6
  321.     IF ss_menuc%=1
  322.       GOSUB affiche_icones_controlc(FALSE)
  323.       GOSUB affiche_icones_controld(FALSE)
  324.     ELSE IF ss_menuc%=2
  325.       GOSUB affiche_icones_controlc2(FALSE)
  326.       GOSUB affiche_icones_controld2(FALSE)
  327.     ENDIF
  328.   ENDIF
  329.   ' Temps machine
  330.   IF play%>0 OR flag_cpu_display!
  331.     GOSUB affiche_cpu_time_pourcent
  332.   ENDIF
  333.   ' Blague
  334.   IF flag_blague!
  335.     IF INT(RND*SHR(periode_blague%,MUL(SGN(play%),2)))=0
  336.       a$=blague$(INT(RND*blague_nbr%))
  337.       GOSUB dialog("JOKE",a$,"Hahaha!!!|Bide...",SHR(scr_larg%,1),SHR(scr_haut%,1))
  338.       IF bouton%=0
  339.         GOSUB aff_message("Merci, j'en cherche une autre, voyons...")
  340.         periode_blague%=MAX(SHR(periode_blague%,1),1)
  341.       ELSE
  342.         GOSUB aff_message("Desole...")
  343.         periode_blague%=MIN(SHL(periode_blague%,1),262144)
  344.       ENDIF
  345.       GOSUB vide_buffer_clavier
  346.     ENDIF
  347.   ENDIF
  348.   SHOWM
  349.   ' Nouveau bouclage ?
  350.   IF flag_nvl_boucle_sample%>0
  351.     DEC flag_nvl_boucle_sample%
  352.     IF flag_nvl_boucle_sample%=0
  353.       GOSUB stop_voices
  354.       ~C:rr_boucle_sample%(W:num_nvl_boucle_sample%)
  355.     ENDIF
  356.   ENDIF
  357.   ' 2eme test de protection
  358.   IF (NOT flag_registered3!) AND flag_registered!
  359.     GOSUB teste_enregistrement2
  360.     flag_registered3!=TRUE
  361.   ENDIF
  362. LOOP
  363. '
  364. GOSUB br
  365. '
  366. '
  367. '
  368. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  369. ' *                                                                          *
  370. ' *                                Procedures                                *
  371. ' *                                                                          *
  372. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  373. '
  374. ' Systeme
  375. ' -------
  376. PROCEDURE rien
  377.   ' rien !!!
  378. RETURN
  379. PROCEDURE br
  380.   HIDEM
  381.   IF r_flag_the_end%>0
  382.     DPOKE r_flag_the_end%,1     ! A pu zik...
  383.   ENDIF
  384.   IF zone%<>0
  385.     ~MFREE(zone%)
  386.   ENDIF
  387.   IF oldscreenmode%<>0
  388.     oldscreenadr%=GEMDOS(21,L:oldscreensize%)
  389.     IF grmode_preserve%=0
  390.       ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,3,oldscreenmode%)
  391.     ELSE IF grmode_preserve%=1
  392.       ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,-1)
  393.     ENDIF
  394.     GOSUB restaure_palette                      ! Restaure la palette
  395.   ENDIF
  396.   ~XBIOS(&H82,5,3)
  397.   ~XBIOS(&H82,4,3)
  398.   SPOKE &H484,key_click%        ! Bip bip
  399.   SETCOLOR 0,&HFFF
  400.   SETCOLOR 15,0
  401.   IF grmode_skipxbra%=0
  402.     WHILE xbra_remove$<>""        ! On remet les vecteurs a l'envers car il peut y avoir plusieurs fois le meme vecteur detourne
  403.       SLPOKE LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),8))},LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),4))}
  404.       xbra_remove$=LEFT$(xbra_remove$,SUB(LEN(xbra_remove$),8))
  405.     WEND
  406.   ENDIF
  407.   SHOWM
  408.   GOSUB bee(FALSE)
  409.   EDIT
  410. RETURN
  411. PROCEDURE erreur_gfa_basic
  412.   erreur_gfa%=ERR
  413.   flag_erreur_gfa!=TRUE
  414.   PRINT CHR$(7);
  415.   GOSUB aff_message("ERROR : "+ERR$(erreur_gfa%)+" PRESS A KEY.")
  416.   ~GEMDOS(7)
  417.   GOSUB aff_message("NEXT MISTAKE... LAST MISTAKE!")
  418.   flag_erreur_gfa!=FALSE
  419.   RESUME NEXT
  420. RETURN
  421. '
  422. ' Initialisations
  423. ' ---------------
  424. PROCEDURE init_variables_prefs
  425.   '
  426.   ' Variables configurables dans les preferences
  427.   ' --------------------------------------------
  428.   LOCAL i%,n%,a1$,a2$,a3$,a4$,a5$
  429.   '
  430.   ' Tableaux
  431.   '
  432.   DIM keydef_val%(1,99)         ! 2 touches possibles, numero de commande
  433.   DIM keydef_mask%(1,99)        ! 2 touches possibles, numero de commande
  434.   DIM keydef_param%(99)         ! Numero de commande
  435.   ARRAYFILL keydef_val%(),0
  436.   ARRAYFILL keydef_mask%(),0
  437.   ARRAYFILL keydef_param%(),0
  438.   RESTORE default_keycodes
  439.   READ n%
  440.   FOR i%=0 TO PRED(n%)
  441.     READ a1$,a2$,a3$,a4$,a5$
  442.     keydef_mask%(0,i%)=VAL("$"+a1$)
  443.     keydef_val%(0,i%)=VAL("$"+a2$)
  444.     keydef_mask%(1,i%)=VAL("$"+a3$)
  445.     keydef_val%(1,i%)=VAL("$"+a4$)
  446.     keydef_param%(i%)=VAL("$"+a5$)
  447.   NEXT i%
  448.   '
  449.   ' Variables simples
  450.   '
  451.   system_memory%=131072         ! 128 Ko reserves pour le systeme
  452.   keyboard_type%=0              ! 0 = azerty, 1 = qwerty
  453.   color_pal$="00088FF00F4F800C6FF40F8F888AAACCCFFF889AABCCDFFF" ! La palette (RVB pour 16 couleurs)
  454.   grmode_overscan%=-1           ! -1 = suivant VGA/RGB/TV, 0 = aucun overscan, 1 = force l'overscan
  455.   grmode_80colonnes%=1          ! -1 = laisse, 0 = 40 colonnes, 1 = 80 colonnes
  456.   grmode_entrelace%=-1          ! -1 = laisse, 0 = 200/240 lignes, 1 = 400/480 lignes
  457.   grmode_puissance_plans%=2     ! -1 = laisse, 0 = 2 couleurs, 1 = 4, 2 = 16, 3 = 256, 4 = 65536
  458.   grmode_preserve%=0            ! 0 = change mode, 1 = change mode if current mode unusable, 2 = never change mode
  459.   grmode_skipxbra%=0            ! 0 = remove NVDI/etc from vector chain, 1 = leave vectors alone
  460.   graoumf_logo_color%=4         ! Numero de la couleur du logo (marron)
  461.   path_displayed%=1             ! 0 = systeme, 1 = module, 2 = prefs, 3 = sample, 4 = instruments, 5 = autoload, 6 = misc
  462.   npath_sample$=npath_prog$     ! Chemin des samples
  463.   npath_module$=npath_prog$     ! Chemin des modules
  464.   npath_autoload$=npath_prog$   ! Chemin d'autochargement
  465.   npath_div$=npath_prog$        ! Chemin des operations diverses
  466.   nfile_sample$=""              ! Fichier par defaut pour les samples
  467.   nfile_module$=""              ! Fichier par defaut pour les modules
  468.   nfile_autoload$=""            ! Fichier par defaut a autocharger
  469.   nfile_p1$="DUMTRACK.PGT"      ! Nom du fichier contenant les routines diverses
  470.   nfile_p2$="GTPLAY.PGT"        ! Nom du fichier contenant le player
  471.   next_module$="*.GT2"          ! Extension pour les modules
  472.   next_sample$="*.AVR"          ! Extension pour les samples
  473.   nbr_track%=4                  ! Nombre de voies
  474.   nbr_lines%=64                 ! Nombre de lignes (n'a plus d'utilite mais sert encore)
  475.   instr%=1                      ! Instrument courant
  476.   sample%=1                     ! Sample courant
  477.   n_preset%=0                   ! Numero du preset courant
  478.   line_step%=1                  ! Saut de ligne a l'edition
  479.   haut_lig%=99999               ! Nombre de lignes de pattern affichees (99999 car min dans chgt de resol)
  480.   octave%=1                     ! Octave-1 (0-6 -> 1-7)
  481.   default_pattern_high%=64      ! Nombre de lignes a mettre sur un pattern lors de sa creation
  482.   ss_menu%=1                    ! 1 = disk, 2 = tools, 3 = instr, 4 = samples, 5 = enveloppes, 6 = midi
  483.   ss_menut%=1                   ! Numero de sous-menu du sous-menu Tools (1, 2 ou 3)
  484.   ss_menui%=1                   ! Numero de sous-menu du sous-menu Instruments (1 ou 2)
  485.   ss_menus%=1                   ! Numero de sous-menu du sous-menu Samples (1 ou 2)
  486.   ss_menue%=0                   ! Numero de sous-menu du sous-menu Envelopes (0, 1 ou 2)
  487.   ss_menuc%=1                   ! Numero de sous-menu du sous-menu Control (1 ou 2)
  488.   ss_menuc_npan%=0              ! Plage des pannings du sous-menu Control (0 = 1-8, 1 = 9-16, etc...)
  489.   ss_menuc2_npan%=0             ! Plage des volumes du sous-menu Control (0 = 1-8, 1 = 9-16, etc...)
  490.   ss_menum%=1                   ! Numero de sous-menu du sous-menu Midi (1 ou 2)
  491.   ss_menu2%=1                   ! Numero de sous-menu de l'editeur de sample (1, ...)
  492.   ss_menu2.fl%=1                ! Num ss-menu Flanger (1 ou 2)
  493.   ss_menu2.rev%=1               ! Num ss-menu Reverb (1 ou 2)
  494.   maskblock%=0                  ! 0 = all, 1 = masque
  495.   replaceblock%=0               ! 0 = replace, 1 = transparent
  496.   trackpat%=0                   ! 0 = piste, 1 = pattern, 2 = preset
  497.   bl_flagsong!=FALSE            ! Si l'operation de bloc porte sur toute la song
  498.   bl_maska1$=STRING$(5,0)       ! 0 = n'importe quoi, F = seulement bl_maska2%
  499.   bl_maska2$=STRING$(5,0)       ! Copie si (note AND bl_maska1)=bl_maska2
  500.   bl_maskb1$=STRING$(5,255)     ! F = n'importe quoi, 0 = seulement bl_maskb2%
  501.   bl_maskb2$=STRING$(5,0)       ! Masque de remplacement
  502.   bl_echo_lines%=2              ! Echo toutes les 2 lignes
  503.   bl_echo_feedback%=50          ! 50% de feedback dans l'echo
  504.   bl_echo_fadestep%=&H40        ! - $40 de volume a chaque echo
  505.   bl_echo_cont!=FALSE           ! Ne joue l'echo que de la derniere note
  506.   bl_echo_fdbk!=TRUE            ! True = feedback, False = fade
  507.   ext_note1%=&HFFFFFF           ! F = n'importe quoi, 0 = met qqc
  508.   ext_note2%=0                  ! (Effet AND ext_note1) OR ext_note2
  509.   signe_sam%=0                  ! A ajouter au sample quand sauve/charge
  510.   drumpad_flag%=0               ! 0 = No d'instr, 1 = drumpad
  511.   freq_buffer%=8363             ! Frequence de base du buffer
  512.   snapshot_number%=0            ! Numero du dernier snapshot effectue
  513.   snapshot_format%=1            ! Format du snapshot : 0 = TGA 16 couleurs, 1 = TGA 24 bits
  514.   flag_keep_buffer!=FALSE       ! S'il est mis, les modules detruisent le buffer au minimum
  515.   flag_gt2cnf!=FALSE            ! Sauvegarde de la configuration du GT dans les modules GT2
  516.   flag_backup_modules!=TRUE     ! Sauve les modules avec back up en fichier .BAK
  517.   flag_keyboard_buffer!=FALSE   ! False = vide le buffer clavier apres chaque pression de touche
  518.   flag_cpu_display!=FALSE       ! True = affiche le temps machine tout le temps, False = seulement en Play
  519.   type_affpiste%=1              ! Affichage des pistes : 0 = note+ins, 1 = normal, 2 = +volume
  520.   env_num&=1                    ! Numero de l'enveloppe editee
  521.   env_sect&=0                   ! Section de l'enveloppe editee : 0 = attack, 1 = key off
  522.   env_copy&=1                   ! Numero de l'enveloppe a copier
  523.   midi_flag_data_in!=FALSE      ! True = MIDI In possible
  524.   midi_flag_data_out!=FALSE     ! True = MIDI Out possible
  525.   midi_flag_synchro%=0          ! 0 = pas de synchro, 1 = GT suit la synchro, 2 = GT donne la synchro
  526.   midi_polyphonic_mode!=TRUE    ! False = Monophonic, True = Polyphonic
  527.   midi_monomode_channel_nbr%=1  ! Numero de canal MIDI en mode Monophonique (1-16)
  528.   midi_monomode_instr_nbr%=0    ! Numero d'instrument en mode Monophonique. 0 = instrument courant
  529.   midi_polymode_channel_nbr%=1  ! Numero de canal MIDI en mode Polyphonique (1-16)
  530.   '
  531.   de.display_type%=0            ! Type d'affichage du pat dans le Drum Editor: 0 = pattern, 1 = info pistes
  532.   '
  533.   se.mix_master_volume%=16384   ! Master volume (/32768) pour la fonction de mixage
  534.   se.rec_input_device%=0        ! Entree digitalisation : 0 = Falcon ADC, 1 = ST Replay pro
  535.   se.rec_canal%=1               ! Canal d'entree : 1 = Left, 2 = Right, 3 = Left+Right
  536.   se.rec_adc_freq%=1            ! Frequence de digit sur l'ADC du Falcon (freq type CODEC)
  537.   se.rec_ext_freq%=44100        ! Frequence de digit avec un autre ADC (ST Replay pro)
  538.   se.rec_trigger%=6553          ! Impulsion minimum pour commencer la digit /32768
  539.   se.rec_flag_trigger!=FALSE    ! False = trigger off, true = trigger on
  540.   se.freq_nfe%=16390            ! Nouvelle frequence d'echantillonnage
  541.   se.freq_ofn%=131              ! Ancienne frequence de note
  542.   se.freq_nfn%=131              ! Nouvelle frequence de note
  543.   se.freq_iptype%=1             ! Type d'interpolation : 0 = none, 1 = Linear, 2 = 3rd degree
  544.   se.freq_fftdisp%=0            ! 0 = affichage lineaire, 1 = affichage logarithmique
  545.   se.freq_fftwin%=0             ! Fenetrage FFT : 0 = rectangulaire, 1 = Blackman
  546.   se.freq_fftnoteon!=TRUE       ! Affichage ou non de la frequence de la note sur la FFT
  547.   se.freq_fft_cflag!=TRUE       ! Calcule la note du sample avec la FFT
  548.   se.freq_fft_pnbr%=640         ! Nombre de points a calculer pour la FFT
  549.   se.delay_flags%=&X1           ! Chaque bit (0-3) = tap on/off, bit 4 = mute in, bit 5 = multi-tap mode
  550.   se.delay_feedback%=0          ! Feedback du delay (/32768)
  551.   se.delay_timefeed%=375        ! Temps de repetition (ms)
  552.   se.delay_dry%=32768           ! Niveau du son clair (/32768)
  553.   se.delay_wet%=16384           ! Niveau du delay
  554.   se.delay_source%=0            ! Sample source : 0 = buffer, 1-255 = sample
  555.   se.delay_mutein%=500          ! Temps (ms) apres lequel le signal d'entree est coupe
  556.   se.flanger_dry%=16384         ! Niveau dry du flanger (/32768)
  557.   se.flanger_wet%=16384         ! Niveau wet
  558.   se.flanger_lsource%=0         ! Sample source gauche (0 = buffer)
  559.   se.flanger_rsource%=0         ! Sample source droit   " "    "
  560.   se.flanger_time%=1000         ! Delay du flanger (µs) -> 10 ms
  561.   se.flanger_freq%=500          ! Frequence du flanger (mHz)
  562.   se.flanger_depth%=500         ! Profondeur du flanger (µs) -> 6.35 ms
  563.   se.flanger_fdbkll%=9830       ! Feedback L -> L (30%)
  564.   se.flanger_fdbklr%=9830       ! Feedback L -> R (30%)
  565.   se.flanger_fdbkrr%=9830       ! Feedback R -> R (30%)
  566.   se.flanger_fdbkrl%=9830       ! Feedback R -> L (30%)
  567.   se.flanger_phase%=0           ! Phase intitiale (0-4095)
  568.   se.flanger_wave%=0            ! 0 = sin, 1 = carre, 2 = triangle, 3 = scie descendante, 4 = scie montante
  569.   se.flanger_stereo!=FALSE      ! Flag de stereophonie du flanger
  570.   se.rev_aprdelay%=5000         ! Delay de l'All Pass Reverb, en µs. Maxi : 0.25 s
  571.   se.rev_aprg%=22937            ! Feedback de l'All Pass reverb
  572.   se.rev_adlydelay%=26540       ! Delay de l'Alignement delay, en µs. Maxi : 0.25 s
  573.   se.rev_drylevel%=16384        ! Dry level (/32768)
  574.   se.rev_revlevel%=11469        ! Reverb level (/32768)
  575.   se.rev_ereflevel%=4915        ! Early reflection level (/32768)
  576.   se.rev_nbrtaps%=7             ! Nombre de taps pour l'Early reflection
  577.   se.rev_nbrcomb%=4             ! Nombre de comb filters
  578.   se.rev_combgain%=27852        ! Gain general des comb filters (/32768)
  579.   se.rev_source%=0              ! Sample source (0 = buffer)
  580.   se.rev_tappos%=0              ! Position dans la liste des taps de l'ER
  581.   se.rev_combpos%=0             ! Position dans la liste des comb filters
  582.   se.s2d_posstart%=0            ! Position de depart d'enregistrement
  583.   se.s2d_ligstart%=0            ! Ligne de depart d'enregistrement
  584.   se.s2d_posend%=0              ! Position de fin d'enregistrement
  585.   se.s2d_ligend%=0              ! Ligne de fin d'enregistrement
  586.   se.s2d_bits%=1                ! Enregistrement en 1 : 8 bits, 2 : 16 bits
  587.   se.s2d_stereo%=1              ! Enregistrement en 1 : mono, 2 : stereo
  588.   se.s2d_maxsize%=1024          ! Taille maximum (Ko)
  589.   se.s2d_out%=1                 ! Sortie sur 1 : block, 2 : disk
  590.   se.s2d_2ndtime!=FALSE         ! False : normal, True : attend un bouclage avant d'enregistrer
  591.   se.s2d_speed%=7               ! Vitesse d'enregistrement (0 = vite, 7 = lent). Agit sur _prediv%
  592.   se.s2d_prediv%=11             ! Prediviseur pour la vitesse DMA : 1 = 50KHz, 2 = 32 KHz... Depend de _speed%
  593.   se.s2d_monitor!=FALSE         ! True = ecoute pendant l'enregistrement, False = enregistrement en differe
  594.   se.comp_source%=0             ! Sample source (0 = buffer)
  595.   se.comp_speed%=10000          ! Periode de recalcul du taux de compression (1-99999) (µs)
  596.   se.comp_level%=16384          ! Niveau de compression (vol ideal a atteindre) (/32768)
  597.   se.comp_initvolume%=se.comp_level%    ! Volume presume de depart (/32768)
  598.   se.disto_source%=0            ! Sample source (0 = buffer)
  599.   se.disto_gain%=32768          ! Gain de la disto (/32768)
  600.   se.disto_initpower%=4         ! Facteur de puissance de la disto avec un gain < 100% (min = 1)
  601. RETURN
  602. PROCEDURE init_variables_post_prefs
  603.   '
  604.   ' Variables diverses non configurables dans les preferences
  605.   ' ---------------------------------------------------------
  606.   gamme$="C-C#D-D#E-F-F#G-G#A-A#B-"
  607.   gamme2$="C C#D D#E F F#G G#A A#B "
  608.   numericpad_scancodes$=MKI$(99)+MKI$(100)+MKI$(101)+MKI$(102)+MKI$(103)+MKI$(104)+MKI$(105)+MKI$(74)
  609.   numericpad_scancodes$=numericpad_scancodes$+MKI$(106)+MKI$(107)+MKI$(108)+MKI$(78)
  610.   numericpad_scancodes$=numericpad_scancodes$+MKI$(109)+MKI$(110)+MKI$(111)+MKI$(114)
  611.   adr_background%=0             ! Adresse du malloc pour un background (si <> 0, liberer a la fin).
  612.   songpos%=0                    ! Position courante dans la song
  613.   posligne%=0                   ! Ligne courante dans le pattern
  614.   curs_x%=0                     ! 0 = note, 1-2 = instr, 3-6 = effet, 7-8 = volume
  615.   curs_col%=0                   ! Colonne du curseur
  616.   play%=0                       ! 0 = stop, 1 = play song, 2 = play pattern
  617.   edit%=0                       ! 0 = stop, 1 = edit
  618.   flag_nvl_boucle_sample%=0     ! Flag de calcul du nouveau bouclage d'un sample
  619.   num_nvl_boucle_sample%=1      ! Le numero du sample
  620.   bl_start&=0                   ! Ligne de debut du bloc
  621.   bl_end&=0                     ! Ligne de fin du bloc
  622.   bl_pat&=0                     ! Pattern 0
  623.   bl_trk&=0                     ! Voie 1
  624.   sample_list_pos%=1            ! Position dans la liste des samples
  625.   instr_list_pos%=1             ! Position dans la liste des instruments
  626.   song_list_pos%=0              ! Position dans l'arrangement des patterns
  627.   instr_note_pos%=48            ! Position dans la liste des notes
  628.   instr_note_aff%=48            ! Affichage dans la liste des notes
  629.   instr_group!=TRUE             ! On manipule tout un groupe de notes
  630.   mark_1%=0                     ! Marqueur de debut de bloc dans le sample
  631.   mark_len%=FN lon_buffer       ! Marqueur de fin de bloc
  632.   mark_2%=ADD(mark_1%,mark_len%)! Marqueur fantome de fin de bloc
  633.   mark_rep%=0                   ! Marqueur de repetition
  634.   win_pos%=mark_1%              ! Debut de la fenetre de sample
  635.   win_lon%=mark_len%            ! Longueur de la fenetre
  636.   win_bits%=1                   ! Buffer 8 bits
  637.   erreur_gfa%=0                 ! Numero d'erreur de GFA Basic
  638.   treg_str1$=" by Laurent de SORAS and the Graoumf Devteam."
  639.   treg_str2$="USER.REG"
  640.   treg_str3$="version to"
  641.   treg_str4$=" licensed to "
  642.   treg_str5$=" (license is invalid)"
  643.   ' flag_registered!=TRUE         ! false = demo, true = normal
  644.   ' flag_registered2!=TRUE        ! false = demo, true = normal
  645.   flag_registered3!=FALSE       ! Indique si on a fait ou pas le 2eme test de protection
  646.   flag_erreur_gfa!=FALSE        ! Indique s'il y a eu une erreur
  647.   flag_blague!=FALSE            ! Ne sort pas de vanne a la Julien Boeuf pour l'instant
  648.   flag_autoload!=FALSE          ! N'est pas en cours d'autochargement
  649.   erreur%=0                     ! Sert localement pour la gestion des erreurs
  650.   periode_blague%=4096          ! Periode moyenne de sortie d'une vanne
  651.   debut_temps%=TIMER            ! Valeur du Timer pour le debut du chrono
  652.   env_posaff&=0                 ! Position de l'affichage de l'enveloppe, en commandes
  653.   env_poscurs&=0                ! Position du curseur dans l'enveloppe, en commandes
  654.   env_codpos&=0                 ! Position dans la liste des codes des enveloppes
  655.   progression_xpos%=0           ! Abscisse de la boite de progression (car)
  656.   progression_ypos%=0           ! Ordonnee de la boite de progression (pix)
  657.   progression_width%=64         ! Largeur de la barre de progression (pix)
  658.   progression_len%=65536        ! Valeur maxi de la valeur de progression
  659.   progression_oldval%=0         ! Ancienne valeur de progression, sert a la mise a jour de la barre.
  660.   se.sample_editor_flag!=FALSE  ! Indique si on est ou non dans l'editeur de samples
  661.   se.volume_ok!=FALSE           ! Indique si le volume du block est valable
  662.   se.volume_spl%=0              ! Volume du-dit block (/32768)
  663.   se.volume_fade_start%=32768   ! Volume de debut de fade (/32768)
  664.   se.volume_fade_end%=32768     ! Volume de fin de fade (/32768)
  665.   se.flag_best_volume!=FALSE    ! Garde le volume du sample quitte a saturer lors d'un effet (True : cherche le meilleur volume)
  666.   se.mark_selected%=0           ! Bits representant les presets de marques selectionnes
  667.   se.mark_set!=FALSE            ! Icone SET alumee ou pas
  668.   se.freq_fftmin%=20            ! Frequence minimum de la FFT (deja calculee)
  669.   se.freq_fftmax%=SHR(freq_buffer%,1)   ! Frequence maximum de la FFT (deja calculee)
  670.   se.freq_fftech%=freq_buffer%  ! Frequence d'echantillonnage du sample lors de la FFT (deja calculee)
  671.   se.freq_fftlon%=1             ! Nombre de frequences scannees par la FFT (deja calculee)
  672.   se.freq_fft_pstart%=0         ! Frequence de debut de calcul FFT
  673.   se.freq_fft_pend%=SHR(freq_buffer%,1) ! Frequence de fin de calcul FFT
  674. RETURN
  675. PROCEDURE init_tableaux
  676.   '
  677.   ' Dimentionnement des tableaux
  678.   ' ----------------------------
  679.   DIM scancode2ascii$(2,1)      ! Ligne de touches, Type de clavier
  680.   DIM icone$(4,2)               ! Icones du haut
  681.   DIM drumpad%(31,2)            ! Numero de touche, Instruments/ Samples/ Notes du drumpad
  682.   DIM presetpad%(31)            ! Numero de touche
  683.   DIM trackpad%(31)             ! Numero de touche
  684.   DIM preset&(31,31)            ! Numeros de pistes : (colonne,preset)
  685.   DIM nbr_colonnes%(31)         ! Nombre de colonnes affichees pour chaque preset
  686.   DIM t_note%(53)
  687.   DIM fft&(1023)                ! Resultats de FFT
  688.   DIM divbn$(63,31)             ! Noms de divers boutons des sous-menus
  689.   DIM divbi&(3,63,31)           ! Leurs coordonnees et taille
  690.   DIM popup_nbrlines%(7)        ! Nombre de lignes des popups: popup
  691.   DIM popup_code%(31,7)         ! Code de retour des popups: ligne, popup
  692.   DIM popup_txt$(31,7)          ! Textes des popups: ligne, popup
  693.   DIM help$(23,15)              ! Texte d'aide
  694.   DIM blague$(99)               ! Des blagues
  695.   DIM control_old%(20)          ! Anciennes valeurs pour les updates du sous-menu Control
  696.   DIM midi_in_channel%(31)      ! Numero du canal MIDI attribue a chaque piste en Mode Polyphonique
  697.   DIM midi_in_instr%(15)        ! Numero d'instrument assigne a chaque canal en Mode Polyphonique
  698.   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
  699.   DIM se.mark%(1,9)             ! Presets de samples (start/length,numero)
  700.   DIM se.mark$(9)               ! Le nom des presets
  701.   DIM se.delaytime%(3)          ! Temps (ms) de decalage pour chaque tap
  702.   DIM se.delaylevel%(3)         ! Niveau d'entree (/32768) pour chaque tap
  703.   DIM se.rev_tapdelay%(15)      ! Delay des taps de reverb, en µs. Maxi : 0.25 s
  704.   DIM se.rev_taplevel%(15)      ! Level des taps de reverb, (/32768)
  705.   DIM se.rev_combdelay%(15)     ! Delay des comb filters de reverb, en µs. Maxi : 0.25 s
  706.   DIM se.rev_comblpf%(15)       ! Niveau de gain des lpf dans la reverb (/32768)
  707.   DIM se.rev_buffer$(10)        ! Buffers pour la reverb : 3 (early, alignement, APR) + 8 (comb filters)
  708.   DIM env_code$(255)            ! Code des mnemoniques des commandes des enveloppes
  709.   DIM env_conv&(19,2)           ! Conversion (num ds la liste,type) -> Code d'enveloppe
  710.   DIM env_valdef&(19,2)         ! Valeurs par defaut pour les parametres des commandes d'enveloppes
  711.   DIM env_codmax&(2)            ! Nombre maxi de codes pour chaque type d'enveloppe
  712.   '
  713.   ' Remplissage des tableaux
  714.   ' ------------------------
  715.   '
  716.   ' Lecure de l'Help
  717.   '
  718.   RESTORE help_text
  719.   j%=0
  720.   READ a$
  721.   REPEAT
  722.     help$(0,j%)=a$
  723.     FOR i%=1 TO 23
  724.       READ help$(i%,j%)
  725.     NEXT i%
  726.     READ a$
  727.     INC j%
  728.   UNTIL a$="***"
  729.   help_pmax%=PRED(j%)
  730.   '
  731.   ' Initialisation des Marks du S.E.
  732.   '
  733.   FOR i%=0 TO 9
  734.     se.mark%(0,i%)=0
  735.     se.mark%(1,i%)=&HFFFFFE
  736.     se.mark$(i%)=SPACE$(21)
  737.   NEXT i%
  738.   '
  739.   ' Lecture des blagues
  740.   '
  741.   RESTORE textes_blagues
  742.   i%=0
  743.   READ a$
  744.   REPEAT
  745.     flag!=FALSE
  746.     blague$(i%)=""
  747.     REPEAT
  748.       IF flag!
  749.         blague$(i%)=blague$(i%)+"|"
  750.       ENDIF
  751.       blague$(i%)=blague$(i%)+a$
  752.       flag!=TRUE
  753.       READ a$
  754.     UNTIL a$="*"
  755.     INC i%
  756.     READ a$
  757.   UNTIL a$="***"
  758.   blague_nbr%=i%
  759.   '
  760.   ' Initialisation des pads
  761.   '
  762.   FOR i%=0 TO 31
  763.     drumpad%(i%,0)=SUCC(i%)
  764.     drumpad%(i%,1)=SUCC(i%)
  765.     drumpad%(i%,2)=ADD(&H3C000000,SHL(SUCC(i%),16))
  766.     presetpad%(i%)=i%
  767.     trackpad%(i%)=i%
  768.   NEXT i%
  769.   '
  770.   ' Lecture des icones des sous-menus
  771.   '
  772.   RESTORE icones_disk
  773.   ARRAYFILL divbi&(),-1
  774.   j%=0
  775.   READ n%
  776.   WHILE n%>0
  777.     READ x%,y%
  778.     FOR i%=0 TO PRED(n%)
  779.       READ a%                   ! Sert a rien pour l'instant
  780.       READ divbn$(i%,j%),divbi&(0,i%,j%),divbi&(1,i%,j%),divbi&(2,i%,j%)
  781.       ADD divbi&(0,i%,j%),x%
  782.       ADD divbi&(1,i%,j%),y%
  783.       READ divbi&(3,i%,j%)
  784.     NEXT i%
  785.     INC j%
  786.     READ n%
  787.   WEND
  788.   '
  789.   ' Donnees des Pop Up
  790.   '
  791.   RESTORE popup_mod_ext
  792.   j%=0
  793.   READ n%
  794.   WHILE n%>0
  795.     popup_nbrlines%(j%)=n%
  796.     FOR i%=0 TO PRED(n%)
  797.       READ popup_txt$(i%,j%)
  798.       READ popup_code%(i%,j%)
  799.     NEXT i%
  800.     INC j%
  801.     READ n%
  802.   WEND
  803.   '
  804.   ' Lecture des touches
  805.   '
  806.   RESTORE touches_notes
  807.   ARRAYFILL t_note%(),-1
  808.   FOR i%=0 TO 16
  809.     READ a%
  810.     t_note%(a%)=i%
  811.   NEXT i%
  812.   FOR i%=12 TO 32
  813.     READ a%
  814.     t_note%(a%)=i%
  815.   NEXT i%
  816.   '
  817.   ' Lecture des commandes d'enveloppes
  818.   '
  819.   RESTORE enveloppe_coms
  820.   ARRAYFILL env_conv&(),-1
  821.   c%=0
  822.   READ a%,b%
  823.   FOR i%=a% TO PRED(ADD(a%,b%))
  824.     READ env_code$(i%),d%
  825.     env_conv&(c%,0)=i%
  826.     env_conv&(c%,1)=i%
  827.     env_conv&(c%,2)=i%
  828.     env_valdef&(c%,0)=d%
  829.     env_valdef&(c%,1)=d%
  830.     env_valdef&(c%,2)=d%
  831.     INC c%
  832.   NEXT i%
  833.   FOR j%=0 TO 2
  834.     d%=c%
  835.     READ a%,b%
  836.     FOR i%=a% TO PRED(ADD(a%,b%))
  837.       READ env_code$(i%),env_valdef&(d%,j%)
  838.       env_conv&(d%,j%)=i%
  839.       INC d%
  840.     NEXT i%
  841.     env_codmax&(j%)=d%
  842.   NEXT j%
  843.   '
  844.   ' Lecture des delay/levels des taps pour la reverb
  845.   '
  846.   RESTORE rev_tap_delay_level
  847.   ARRAYFILL se.rev_tapdelay%(),0
  848.   ARRAYFILL se.rev_taplevel%(),0
  849.   FOR i%=0 TO 6
  850.     READ a,b
  851.     se.rev_tapdelay%(i%)=a*1000000
  852.     se.rev_taplevel%(i%)=b*32768
  853.   NEXT i%
  854.   '
  855.   ' Lecture des delay/lpfs des comb filters pour la reverb
  856.   '
  857.   RESTORE rev_comb_delay_lpf
  858.   ARRAYFILL se.rev_combdelay%(),70000
  859.   ARRAYFILL se.rev_comblpf%(),0
  860.   FOR i%=0 TO 3
  861.     READ a,b
  862.     se.rev_combdelay%(i%)=a*1000000
  863.     se.rev_comblpf%(i%)=b*32768
  864.   NEXT i%
  865.   '
  866.   ' Init des presets
  867.   '
  868.   FOR j%=0 TO 31
  869.     FOR i%=0 TO 31
  870.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  871.     NEXT i%
  872.   NEXT j%
  873.   ARRAYFILL nbr_colonnes%(),nbr_track%
  874.   '
  875.   ' Initialise les parametres de la fonction Mix du Sample_Editor
  876.   '
  877.   FOR i%=0 TO 4
  878.     se.mix_param%(0,i%)=(i%<2) AND 1            ! +1 : ON, +3 : LOOP
  879.     se.mix_param%(1,i%)=i%                      ! Numero de sample
  880.     se.mix_param%(2,i%)=32768                   ! Volume de debut
  881.     se.mix_param%(3,i%)=32768                   ! Volume de fin
  882.   NEXT i%
  883.   '
  884.   ' Init des fonctions de delay du S.E.
  885.   '
  886.   FOR i%=0 TO 3
  887.     se.delaytime%(i%)=375
  888.     se.delaylevel%(i%)=32768
  889.   NEXT i%
  890.   '
  891.   ' Init des tableaux MIDI
  892.   '
  893.   ARRAYFILL midi_in_channel%(),0                ! Aucun canal MIDI
  894.   ARRAYFILL midi_in_instr%(),1                  ! Numero 1 par defaut
  895.   '
  896.   ' Scancode -> Ascii
  897.   '
  898.   RESTORE key_scancode_to_ascii
  899.   FOR i%=0 TO 1
  900.     FOR j%=0 TO 2
  901.       READ scancode2ascii$(j%,i%)
  902.     NEXT j%
  903.   NEXT i%
  904. RETURN
  905. PROCEDURE init_fonctions_simples
  906.   '
  907.   ' Definition des fonctions simples
  908.   ' --------------------------------
  909.   DEFFN zone_start=zone%
  910.   DEFFN zone_end=ADD(FN zone_start,place_totale%)
  911.   ' Fonctions concernant les samples
  912.   DEFFN adrsamchk(s%)=LONG{ADD(r_adr_sample%,SHL(s%,2))}
  913.   DEFFN lonsamchk(s%)=LONG{ADD(FN adrsamchk(s%),4)}
  914.   DEFFN adresse(s%)=ADD(FN adrsamchk(s%),64)
  915.   DEFFN volume(s%)=CARD{ADD(FN adrsamchk(s%),58)}
  916.   DEFFN finetune(s%)=INT{ADD(FN adrsamchk(s%),60)}
  917.   DEFFN length(s%)=LONG{ADD(FN adrsamchk(s%),46)}
  918.   DEFFN repeat(s%)=LONG{ADD(FN adrsamchk(s%),50)}
  919.   DEFFN replen(s%)=LONG{ADD(FN adrsamchk(s%),54)}
  920.   DEFFN freqech(s%)=CARD{ADD(FN adrsamchk(s%),44)}
  921.   DEFFN resol(s%)=SHR(CARD{ADD(FN adrsamchk(s%),42)},3)
  922.   DEFFN autobal(s%)=CARD{ADD(FN adrsamchk(s%),40)}
  923.   DEFFN total_length=SUB(ADD(FN adrsamchk(255),FN lonsamchk(255)),FN adrsamchk(0))      ! Memoire totale occupee par les samples
  924.   ' Fonctions concernant les pistes
  925.   DEFFN track_onoff(t%)=CARD{ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,t%))}
  926.   DEFFN track_interpol(t%)=CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,t%))}
  927.   DEFFN balance(i%)=CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,i%))}       ! Balance (0-31)
  928.   DEFFN track_volume_lin(i%)=CARD{ADD(ADD(r_info_track%,r_mix_volume_t%),MUL(r_itl%,i%))}
  929.   DEFFN track_volume_exp(i%)=CARD{ADD(ADD(r_info_track%,r_mix_volume_e_t%),MUL(r_itl%,i%))}
  930.   ' Fonctions concernant les instruments
  931.   DEFFN ivolume(i%)=SHR(instrset%(10,i%),16)
  932.   DEFFN ievol(i%)=SHR(instrset%(11,i%),16)
  933.   DEFFN ieton(i%)=instrset%(11,i%) AND &HFFFF
  934.   DEFFN iepan(i%)=SHR(instrset%(12,i%),16)
  935.   DEFFN itransp(i%,j%)=FN sbyte(BYTE{ADD(V:instrset%(15,i%),SUCC(SHL(j%,1)))})  ! Octet signe
  936.   DEFFN isample(i%,j%)=BYTE{ADD(V:instrset%(15,i%),SHL(j%,1))}
  937.   ' Fonctions concernant la song
  938.   DEFFN song_length=module&(101)
  939.   DEFFN song_repeat=module&(102)
  940.   DEFFN mod_tempo=CARD{r_mod_tempo%}
  941.   DEFFN mod_speed=CARD{r_mod_speed%}
  942.   ' Fonctions concernant les patterns
  943.   DEFFN adr_patchunk(i%)=LONG{ADD(r_adr_pattern%,SHL(i%,2))}
  944.   DEFFN lon_patchunk(i%)=LONG{ADD(FN adr_patchunk(i%),4)}
  945.   DEFFN nbr_lines(i%)=CARD{ADD(FN adr_patchunk(i%),28)}
  946.   DEFFN nbr_lines2(i%)=FN nbr_lines(song&(i%))
  947.   DEFFN nbr_lines3=FN nbr_lines(song&(songpos%))
  948.   DEFFN nbr_track(i%)=CARD{ADD(FN adr_patchunk(i%),30)}
  949.   DEFFN nbr_track2(i%)=FN nbr_track(song&(i%))
  950.   DEFFN nbr_track3=FN nbr_track(song&(songpos%))
  951.   ' adresse du pattern a%, ligne b%, piste c%
  952.   DEFFN adr_pat(a%)=ADD(FN adr_patchunk(a%),32)
  953.   DEFFN adr_line(a%,b%)=ADD(FN adr_pat(a%),MUL(MUL(nbr_track%,5),b%))
  954.   DEFFN adr_trk(a%,b%,c%)=ADD(FN adr_line(a%,b%),MUL(c%,5))
  955.   ' adresse du pattern de la position a%, ligne b%, piste c%
  956.   DEFFN adr_spat(a%)=FN adr_pat(song&(a%))
  957.   DEFFN adr_sline(a%,b%)=FN adr_line(song&(a%),b%)
  958.   DEFFN adr_strk(a%,b%,c%)=FN adr_trk(song&(a%),b%,c%)
  959.   ' Fonctions concernant le MIDI
  960.   DEFFN get_midi_flag_velocity(can%)=INT{ADD(r_midi_in_velo_flag%,SHL(PRED(can%),1))}
  961.   DEFFN get_midi_flag_note_off(can%)=INT{ADD(r_midi_in_noteoff_flag%,SHL(PRED(can%),1))}
  962.   ' Fonctions concernant le buffer de sample
  963.   DEFFN adr_buffer=ADD(FN adrsamchk(255),FN lonsamchk(255)) AND -2      ! Adresse de debut du buffer
  964.   DEFFN lon_buffer=SUB(FN zone_end,FN adr_buffer) AND -2                ! Longueur du buffer
  965.   ' Divers
  966.   DEFFN zone_free=FN lon_buffer         ! Memoire libre pour les patterns, enveloppes et samples
  967.   DEFFN zone_free2=SUB(FN zone_end,ADD(FN zone_start,80000))    ! Memoire restante quand le module est minimum (environ)
  968.   DEFFN freq2note(f)=ROUND(LOG(f/440)*12/LOG(2)+69)     ! Conversion frequence -> note (codage MIDI)
  969.   DEFFN note2freq(n)=440*2^((n-69)/12)                  ! Conversion note -> frequence
  970. RETURN
  971. PROCEDURE change_resolution
  972.   ' Passage en resolution 80 colonnes 16 couleurs
  973.   ' ---------------------------------------------
  974.   LOCAL a%,b%,c%,i%,mon%,flag!,a$
  975.   oldscreenadr%=XBIOS(2)
  976.   oldscreenmode%=XBIOS(88,-1)
  977.   oldscreensize%=XBIOS(91,oldscreenmode%)
  978.   mon%=XBIOS(&H59)
  979.   SELECT mon%
  980.   CASE 0        ! Monochrome
  981.     SHOWM
  982.     ALERT 3,"GRAOUMF TRACKER|don't work on|monochrome screen",1,"Fuck!|Chier...|Ahh??",a%
  983.     HIDEM
  984.     GOSUB br
  985.   CASE 1        ! RGB
  986.     IF grmode_overscan%=-1                      ! Overscan par defaut
  987.       grmode_overscan%=1
  988.     ENDIF
  989.   CASE 2        ! VGA
  990.     IF grmode_overscan%=-1                      ! Pas d'overscan par defaut
  991.       grmode_overscan%=0
  992.     ENDIF
  993.   CASE 3        ! TV
  994.     ALERT 2,"GRAOUMF TRACKER :|Overscan ???",1,"Yes|Dnt know|No",a%
  995.     IF a%=3 OR (a%=2 AND RND>0.5)
  996.       grmode_overscan%=0
  997.     ENDIF
  998.   ENDSELECT
  999.   '
  1000.   ' Enleve les XBRA genants
  1001.   '
  1002.   IF grmode_skipxbra%=1
  1003.     GOTO cmode.skipxbra
  1004.   ENDIF
  1005.   ~FN vire_xbra(&HB4,CVL("ACCx"),&HFFFFFF00,TRUE)       ! Accent 1, 2 et 3 du Feroce Lapin
  1006.   ~FN vire_xbra(&H70,CVL("NVDI"),-1,TRUE)               ! NVDI: VBL interrupt
  1007.   ~FN vire_xbra(&H84,CVL("NVDI"),-1,TRUE)               ! NVDI: GEMDOS
  1008.   ~FN vire_xbra(&H88,CVL("NVDI"),-1,TRUE)               ! NVDI: AES/VDI
  1009.   ~FN vire_xbra(&HB4,CVL("NVDI"),-1,TRUE)               ! NVDI: BIOS
  1010.   ~FN vire_xbra(&HB8,CVL("NVDI"),-1,TRUE)               ! NVDI: XBIOS
  1011.   flag_falcon_screen!=FN vire_xbra(&HB8,CVL("ΣFSC"),-1,FALSE)   ! Teste seulement Falcon Screen
  1012. cmode.skipxbra:
  1013.   '
  1014.   GOSUB sauve_palette                           ! Sauve la palette
  1015.   ON BREAK GOSUB br
  1016.   '
  1017.   ' Calcule le nouveau mode ecran
  1018.   '
  1019.   ' 4 plans, 80 colonnes, overscan
  1020.   newscreenmode%=oldscreenmode% AND (NOT &H80)  ! Pas de resolution compatible ST
  1021.   IF grmode_overscan%=0
  1022.     newscreenmode%=newscreenmode% AND (NOT &H40)
  1023.   ELSE IF grmode_overscan%=1
  1024.     newscreenmode%=newscreenmode% OR &H40
  1025.   ENDIF
  1026.   '
  1027.   IF grmode_80colonnes%=0
  1028.     newscreenmode%=newscreenmode% AND (NOT &H8)
  1029.   ELSE IF grmode_80colonnes%=1
  1030.     newscreenmode%=newscreenmode% OR &H8
  1031.   ENDIF
  1032.   '
  1033.   IF grmode_puissance_plans%<>-1
  1034.     newscreenmode%=(newscreenmode% AND (NOT &H7)) OR grmode_puissance_plans%
  1035.   ENDIF
  1036.   '
  1037.   IF grmode_entrelace%=0
  1038.     IF mon%=2                                   ! VGA
  1039.       newscreenmode%=newscreenmode% OR &H100
  1040.     ELSE                                        ! RVB/TV
  1041.       newscreenmode%=newscreenmode% AND (NOT &H100)
  1042.     ENDIF
  1043.   ELSE IF grmode_entrelace%=1
  1044.     IF mon%=2                                   ! VGA
  1045.       newscreenmode%=newscreenmode% AND (NOT &H100)
  1046.     ELSE                                        ! RVB/TV
  1047.       newscreenmode%=newscreenmode% OR &H100
  1048.     ENDIF
  1049.   ENDIF
  1050.   '
  1051.   IF flag_falcon_screen!                        ! Sinon la taille de l'ecran est erronnee
  1052.     ~XBIOS(88,newscreenmode%)
  1053.   ENDIF
  1054.   screensize%=ADD(XBIOS(91,newscreenmode%),4000)
  1055.   RESERVE -MAX(screensize%,system_memory%)
  1056.   adrlogscr%=ADD(GEMDOS(21,L:screensize%),255) AND -256 ! Ecran logique a 256 pres
  1057.   adrphyscr%=adrlogscr%                         ! Ecran physique
  1058.   HIDEM
  1059.   IF grmode_preserve%=0
  1060.     ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,3,newscreenmode%)
  1061.   ELSE IF grmode_preserve%=1
  1062.     ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,-1)
  1063.   ENDIF
  1064.   '  HIDEM sjx, 8776, exp
  1065.   a$=MKL$(&H48E77FFE)+MKL$(&HA0002008)+MKL$(&H4CDF7FFE)+MKI$(&H4E75)
  1066.   a%=V:a$
  1067.   b%=C:a%(0)                                    ! b% = adresse des variables line A
  1068.   scr_larg%=DPEEK(SUB(b%,12))                   ! Largeur de l'ecran en pixels
  1069.   scr_haut%=DPEEK(SUB(b%,4))                    ! Hauteur de l'ecran en pixels
  1070.   IF scr_larg%<640 OR scr_haut%<200             ! Largeur et hauteur minimum
  1071.     SHOWM
  1072.     ALERT 3,"Screen mode too small!|Graoumf Tracker needs|640x200 16 colours minimum!",1,"Damn",a%
  1073.     HIDEM
  1074.     GOSUB br
  1075.   ENDIF
  1076.   scr_ncol%=SHR(scr_larg%,3)                    ! ...et en colonnes de caracteres
  1077.   GOSUB chg_type_affpiste(type_affpiste%)       ! Nombre de pistes affichables
  1078.   haut_lig%=MIN(DIV(SUB(scr_haut%,180),6) OR 1,haut_lig%)       ! Nombre de lignes de pattern affichees
  1079.   GOSUB nouvelle_palette(color_pal$)
  1080. RETURN
  1081. PROCEDURE charge_g_routines
  1082.   ' Charge les routines graphiques (et autres routines)
  1083.   ' ---------------------------------------------------
  1084.   LOCAL a%
  1085.   DIM g_routines%(12288)         ! 48 Ko environ
  1086.   BLOAD npath_prog$+nfile_p1$,V:g_routines%(0)
  1087.   a%=ADD(V:g_routines%(0),28)
  1088.   g_relocation%=a%
  1089.   g_fabrique_fonte_ombr%=ADD(a%,4)
  1090.   g_cadre_centre%=ADD(a%,8)
  1091.   g_dessine_cadre_int%=ADD(a%,12)
  1092.   g_dessine_cadre_ext%=ADD(a%,16)
  1093.   g_affchaine_trans%=ADD(a%,20)
  1094.   g_affchaine_trans_ombr%=ADD(a%,24)
  1095.   g_affchaine_notrans%=ADD(a%,28)
  1096.   g_affcar8x6%=ADD(a%,32)
  1097.   g_affcar8x6_dec%=ADD(a%,36)
  1098.   g_affcar8x6_ombr%=ADD(a%,40)
  1099.   g_affcar8x6_ombr_dec%=ADD(a%,44)
  1100.   g_affcar8x6nt_ombr%=ADD(a%,48)
  1101.   g_affiche_pattern%=ADD(a%,52)
  1102.   g_affiche_sample%=ADD(a%,56)
  1103.   g_convert_nt_2_gtk%=ADD(a%,60)
  1104.   g_convert_669_2_gtk%=ADD(a%,64)
  1105.   g_convert_mtmv_2_gtk%=ADD(a%,68)
  1106.   g_signe_sample%=ADD(a%,72)
  1107.   g_stereo_2_mono_one%=ADD(a%,76)
  1108.   g_stereo_2_mono_ave%=ADD(a%,80)
  1109.   g_convert_mmd1_2_gtk%=ADD(a%,84)
  1110.   g_teste_icones%=ADD(a%,88)
  1111.   g_convert_s3m_2_gtk%=ADD(a%,92)
  1112.   g_intel_16_bits%=ADD(a%,96)
  1113.   g_convert_ult_2_gtk%=ADD(a%,100)
  1114.   g_convert_gtk_2_gtk_vol%=ADD(a%,104)
  1115.   g_clear_note_block%=ADD(a%,108)
  1116.   g_paste_note_block%=ADD(a%,112)
  1117.   g_atomic_35_unpack%=ADD(a%,116)
  1118.   g_swap_note_block%=ADD(a%,120)
  1119.   g_transpose_note_block%=ADD(a%,124)
  1120.   g_packice_21_unpack%=ADD(a%,128)
  1121.   g_invert_memory%=ADD(a%,132)
  1122.   g_affiche_marqueur_sample%=ADD(a%,136)
  1123.   g_efface_marqueur_sample%=ADD(a%,140)
  1124.   g_copy_sample_8_2_16%=ADD(a%,144)
  1125.   g_copy_sample_16_2_8%=ADD(a%,148)
  1126.   g_convert_gtk_2_nt%=ADD(a%,152)
  1127.   g_cherche_volume_sample%=ADD(a%,156)
  1128.   g_change_volume_sample%=ADD(a%,160)
  1129.   g_mixage_sample%=ADD(a%,164)
  1130.   g_affiche_vumetre%=ADD(a%,168)
  1131.   g_start_sample_recording%=ADD(a%,172)
  1132.   g_cherche_volume_buffer_stereo%=ADD(a%,176)
  1133.   g_change_sample_frequency%=ADD(a%,180)
  1134.   g_trans_fourier%=ADD(a%,184)
  1135.   g_fx_delay%=ADD(a%,188)
  1136.   g_convert_dtm_2_gtk%=ADD(a%,192)
  1137.   g_dtm_next_chunk%=ADD(a%,196)
  1138.   g_convert_gtk_2_s3m%=ADD(a%,200)
  1139.   g_convert_ft2_2_gtk%=ADD(a%,204)
  1140.   g_absolu_2_delta%=ADD(a%,208)
  1141.   g_delta_2_absolu%=ADD(a%,212)
  1142.   g_bmove%=ADD(a%,216)
  1143.   g_fx_stereo_flanger%=ADD(a%,220)
  1144.   g_packice_24_unpack%=ADD(a%,224)
  1145.   g_reverberation%=ADD(a%,228)
  1146.   g_grise_surface%=ADD(a%,232)
  1147.   g_convert_stereo16%=ADD(a%,236)
  1148.   g_start_song_recording%=ADD(a%,240)
  1149.   g_stop_song_recording%=ADD(a%,244)
  1150.   g_fx_compression%=ADD(a%,248)
  1151.   g_affiche_image_presentation%=ADD(a%,252)
  1152.   g_find_key_function%=ADD(a%,256)
  1153.   g_find_used_samples_and_instruments%=ADD(a%,260)
  1154.   g_speedpacker_unpack%=ADD(a%,264)
  1155.   a%=V:g_routines%(0)
  1156.   g_adrecr%=C:g_relocation%(L:a%)               ! Reloge la routine
  1157.   g_linewidth%=ADD(g_adrecr%,4)
  1158.   g_flag_sample_rec%=ADD(g_adrecr%,6)
  1159.   g_flag_sample_rec2%=ADD(g_adrecr%,8)
  1160.   g_adr_record_inf%=LONG{ADD(g_adrecr%,10)}     ! C'est directement l'adresse des infos de digit
  1161.   g_rec_sam_buffer%=LONG{ADD(g_adrecr%,14)}     ! C'est directement l'adresse du buffer 1 de digit
  1162.   g_sngrec_paramadr%=ADD(g_adrecr%,26)          ! Adresse des parametres de Song-2-Disk (DUMTRACK.PGT)
  1163.   g_progression_pos%=ADD(g_adrecr%,58)          ! Position de la progression
  1164.   g_progression_len%=ADD(g_adrecr%,62)          ! Longueur de la progression
  1165.   LPOKE g_adrecr%,adrlogscr%
  1166.   DPOKE g_linewidth%,SHR(scr_larg%,1)
  1167.   ~C:g_fabrique_fonte_ombr%(0)                  ! Fabrique la fonte ombree
  1168. RETURN
  1169. PROCEDURE charge_r_routines
  1170.   LOCAL a$,a%,b%,i%
  1171.   RESERVE 655360                                ! Il reste 640 Ko pour nous
  1172.   place_totale%=SUB(MALLOC(-1),system_memory%) AND -4   ! La place qu'il reste pour patterns+samples
  1173.   zone%=MALLOC(place_totale%)                   ! Les patterns, enveloppes et samples
  1174.   DIM module&(103)                              ! Le debut du module
  1175.   DIM song&(255)                                ! La song
  1176.   DIM instrset%(78,255)                         ! 256 * 316 octets pour les instruments
  1177.   DIM r_mod%(80000)                             ! 320 Ko pour la routine de replay
  1178.   DIM pattern_bidon%(20500)                     ! 2 * (32 + 64 * 32 * 5) : Patterns 256 et 257
  1179.   DIM module_bidon%(52)
  1180.   DIM song_bidon%(127)
  1181.   ARRAYFILL song_bidon%(),&H1010101
  1182.   song_bidon%(0)=&H1000101
  1183.   a$="GTK"+CHR$(gtk_file_vnum%)+SPACE$(192)+MKI$(255)+MKI$(nbr_lines%)+MKI$(nbr_track%)+MKI$(2)+MKI$(1)
  1184.   BMOVE V:a$,V:module_bidon%(0),208
  1185.   BLOAD npath_prog$+nfile_p2$,V:r_mod%(0)
  1186.   a%=V:r_mod%(0)
  1187.   b%=ADD(a%,28)
  1188.   rr_player_on%=ADD(b%,4)                       ! Routine d'activation du player
  1189.   rr_boucle_sample%=ADD(b%,8)                   ! Routine de bouclage d'un instrument
  1190.   rr_play_one_sample%=ADD(b%,12)                ! Routine de replay d'un sample sur une voie
  1191.   rr_play_one_note%=ADD(b%,16)                  ! Routine de replay d'une note sur une voie
  1192.   rr_songrecord_routine_no_realtime%=ADD(b%,20) ! Routine d'enregistrement d'un module
  1193.   a%=C:b%(L:a%)                                 ! On reloge
  1194.   r_itl%=DPEEK(a%)                              ! Taille des informations concernant 1 voie
  1195.   r_nbrvoies%=LPEEK(ADD(a%,2))
  1196.   r_master_vol%=LPEEK(ADD(a%,6))
  1197.   r_adr_sample%=LPEEK(ADD(a%,10))
  1198.   r_adr_module%=LPEEK(ADD(a%,14))
  1199.   r_adr_instrset%=LPEEK(ADD(a%,18))
  1200.   r_adr_song%=LPEEK(ADD(a%,22))
  1201.   r_adr_pattern%=LPEEK(ADD(a%,26))
  1202.   r_mod_nbrtrack%=LPEEK(ADD(a%,30))
  1203.   r_mix_volume_e_t%=LPEEK(ADD(a%,34))
  1204.   r_mod_songlen%=LPEEK(ADD(a%,38))
  1205.   r_mod_songrep%=LPEEK(ADD(a%,42))
  1206.   r_mod_songpos%=LPEEK(ADD(a%,46))
  1207.   r_mod_numpat%=LPEEK(ADD(a%,50))
  1208.   r_mod_linepos%=LPEEK(ADD(a%,54))
  1209.   r_mod_speed%=LPEEK(ADD(a%,58))
  1210.   r_mod_nbrvbl%=LPEEK(ADD(a%,62))
  1211.   r_info_track%=LPEEK(ADD(a%,66))
  1212.   r_repeatbuffer%=LPEEK(ADD(a%,70))
  1213.   r_flag_stop_voices%=LPEEK(ADD(a%,74))
  1214.   r_mix_volume_t%=LPEEK(ADD(a%,78))
  1215.   r_flag_the_end%=LPEEK(ADD(a%,82))
  1216.   r_onoff_t%=LPEEK(ADD(a%,86))
  1217.   r_nbits_t%=LPEEK(ADD(a%,90))
  1218.   r_fech_t%=LPEEK(ADD(a%,94))
  1219.   r_bal_t%=LPEEK(ADD(a%,98))
  1220.   r_flag_mt_display%=LPEEK(ADD(a%,102))
  1221.   r_vblsize%=LPEEK(ADD(a%,106))
  1222.   r_mod_patrep%=LPEEK(ADD(a%,110))
  1223.   r_vblnumber%=LPEEK(ADD(a%,114))
  1224.   r_adr_replay_frequency%=LONG{ADD(a%,118)}
  1225.   r_adr_evol%=LONG{ADD(a%,122)}
  1226.   r_adr_eton%=LONG{ADD(a%,126)}
  1227.   r_adr_epan%=LONG{ADD(a%,130)}
  1228.   r_songrecord_state%=LONG{ADD(a%,134)}
  1229.   r_songrecord_routine%=LONG{ADD(a%,138)}
  1230.   r_mod_tempo%=LONG{ADD(a%,142)}
  1231.   r_interpol_t%=LONG{ADD(a%,146)}
  1232.   r_adr_adr_inter%=LONG{ADD(a%,150)}
  1233.   r_current_play_mode%=LONG{ADD(a%,154)}
  1234.   r_current_edit_mode%=LONG{ADD(a%,158)}
  1235.   r_midi_in_gfa_playline%=LONG{ADD(a%,162)}
  1236.   r_midi_instr_map%=LONG{ADD(a%,166)}
  1237.   r_midi_track_state%=LONG{ADD(a%,170)}
  1238.   r_midi_ts_next%=LONG{ADD(a%,174)}
  1239.   r_new_note_buffer%=LONG{ADD(a%,178)}
  1240.   r_midi_in_noteoff_flag%=LONG{ADD(a%,182)}
  1241.   r_midi_in_velo_flag%=LONG{ADD(a%,186)}
  1242.   r_midi_in_sync_flag%=LONG{ADD(a%,190)}
  1243.   r_midi_in_sync_cpt%=LONG{ADD(a%,194)}
  1244.   r_midi_in_on%=LONG{ADD(a%,198)}
  1245.   r_cpu_time_pourcent%=LONG{ADD(a%,202)}
  1246.   r_flag_overload%=LONG{ADD(a%,206)}
  1247.   ' Initialisation du player
  1248.   garbage%=0
  1249.   GOSUB clear_patterns
  1250.   garbage%=1
  1251.   GOSUB clear_instr
  1252.   garbage%=2
  1253.   GOSUB clear_samples2
  1254.   garbage%=3
  1255.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  1256.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  1257.   b%=V:pattern_bidon%(0)
  1258.   FOR i%=256 TO 257
  1259.     CARD{ADD(V:a$,8)}=i%
  1260.     BMOVE V:a$,b%,LEN(a$)
  1261.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  1262.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  1263.     ADD b%,a%
  1264.   NEXT i%
  1265.   LPOKE r_adr_module%,V:module_bidon%(0)
  1266.   LPOKE r_adr_song%,V:song_bidon%(0)
  1267.   LPOKE r_adr_instrset%,V:instrset%(0,0)
  1268.   DPOKE r_flag_mt_display%,0
  1269.   ~C:rr_player_on%(W:1)                 ! Player active (mais ne joue rien)
  1270. RETURN
  1271. PROCEDURE teste_enregistrement
  1272.   LOCAL a%,b%,a$,c$,i%,user_nbr%
  1273.   flag_registered!=TRUE
  1274.   SHOWM
  1275.   GOSUB bee(TRUE)
  1276.   mes_registred$=treg_str1$
  1277.   IF FN exist(npath_prog$+treg_str2$)
  1278.     OPEN "i",#0,npath_prog$+treg_str2$
  1279.     IF LOF(#0)=1032
  1280.       c$=STRING$(1032,0)
  1281.       BGET #0,V:c$,1032
  1282.       a%=0                              ! Teste la somme de controle
  1283.       b%=1
  1284.       FOR i%=0 TO 1027
  1285.         a%=ADD(a%,MUL(b%,BYTE{ADD(V:c$,i%)} XOR 255))
  1286.         INC b%
  1287.       NEXT i%
  1288.       IF a%=LONG{ADD(V:c$,1028)}
  1289.         user%=LONG{ADD(V:c$,512)}
  1290.         a%=&H5BA3
  1291.         a$=""
  1292.         FOR i%=0 TO 510 STEP 2
  1293.           b%=CARD{ADD(V:c$,i%)}
  1294.           a$=a$+MKI$(b% XOR a%)
  1295.           a%=SUB(a%,b%) AND &HFFFF
  1296.         NEXT i%
  1297.         IF a$=MID$(c$,517,512) AND user%<>10
  1298.           flag_registered!=TRUE
  1299.           a%=ADD(INSTR(c$,treg_str3$),13)
  1300.           b%=INSTR(RIGHT$(c$,SUCC(SUB(LEN(c$),a%))),","+CHR$(13))
  1301.           mes_registred$=treg_str4$+MID$(c$,a%,PRED(b%))
  1302.         ELSE
  1303.           GOTO erreur_user.reg
  1304.         ENDIF
  1305.       ELSE
  1306.         GOTO erreur_user.reg
  1307.       ENDIF
  1308.     ELSE
  1309.     erreur_user.reg:
  1310.       mes_registred$=treg_str5$
  1311.     ENDIF
  1312.     CLOSE #0
  1313.   ENDIF
  1314.   GOSUB bee(FALSE)
  1315. RETURN
  1316. PROCEDURE charge_image_presentation
  1317.   LOCAL adr_img%,adr_logo%,col%,haut%,haut_img%,i%,j%,lig_aff%,lig_img%,lon_fic%,plan%,x_logo%
  1318.   LOCAL header%
  1319.   LOCAL dummy
  1320.   LOCAL pal$,logo$
  1321.   RANDOMIZE TIMER
  1322.   IF FN exist(npath_prog$+nfile_present$) AND FN exist(npath_prog$+nfile_logo$)
  1323.     logo$=STRING$(32034,0)
  1324.     BLOAD npath_prog$+nfile_logo$,V:logo$
  1325.     ~C:g_atomic_35_unpack%(L:V:logo$)           ! Au cas ou il serait packe
  1326.     OPEN "i",#0,npath_prog$+nfile_present$
  1327.     BGET #0,V:header%,4
  1328.     IF MKL$(header%)="ATM5"
  1329.       BGET #0,V:lon_fic%,4
  1330.     ELSE
  1331.       lon_fic%=LOF(#0)
  1332.     ENDIF
  1333.     SEEK #0,0
  1334.     IF lon_fic%<SUB(FRE(0),65536)
  1335.       GOSUB nouvelle_palette(STRING$(44,48))
  1336.       DIM image_presentation%(SHR(ADD(lon_fic%,3),2))
  1337.       adr_img%=V:image_presentation%(0)
  1338.       BGET #0,adr_img%,LOF(#0)
  1339.       ~C:g_atomic_35_unpack%(L:adr_img%)        ! Au cas ou il serait packe
  1340.       '
  1341.       ' Affichage de l'image puis du logo.
  1342.       '
  1343.       haut_img%=LONG{ADD(adr_img%,4)}
  1344.       IF DIV(scr_larg%,scr_haut%)<2             ! Mode video avec pixels carres
  1345.         haut%=MIN(scr_haut%,haut_img%)
  1346.         lig_img%=MIN(SUB(haut_img%,haut%),30)
  1347.         lig_aff%=SHR(SUB(scr_haut%,haut%),1)
  1348.         col%=SHR(SUB(scr_larg%,LONG{adr_img%}),4)
  1349.         VOID C:g_affiche_image_presentation%(L:adr_img%,W:col%,W:lig_aff%,W:lig_img%,W:haut%,W:FALSE)
  1350.         x_logo%=SHR(SUB(scr_larg%,320),1)
  1351.         adr_logo%=ADD(V:logo$,34)
  1352.         FOR i%=0 TO 119
  1353.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),PRED(x_logo%),i%,4
  1354.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),SUCC(x_logo%),i%,4
  1355.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),x_logo%,MAX(PRED(i%),0),4
  1356.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),x_logo%,SUCC(i%),4
  1357.         NEXT i%
  1358.         FOR i%=0 TO 119
  1359.           RC_COPY ADD(adr_logo%,MUL(i%,160)),0,0,320,1 TO XBIOS(2),x_logo%,i%,7
  1360.         NEXT i%
  1361.       ELSE                                      ! Mode video avec pixels rectangulaires
  1362.         DIV haut_img%,2
  1363.         haut%=MIN(scr_haut%,haut_img%)
  1364.         lig_img%=MIN(SUB(haut_img%,haut%),32)
  1365.         lig_aff%=SHR(SUB(scr_haut%,haut%),1)
  1366.         col%=SHR(SUB(scr_larg%,LONG{adr_img%}),4)
  1367.         VOID C:g_affiche_image_presentation%(L:adr_img%,W:col%,W:lig_aff%,W:lig_img%,W:haut%,W:TRUE)
  1368.         x_logo%=SHR(SUB(scr_larg%,320),1)
  1369.         adr_logo%=ADD(V:logo$,34)
  1370.         FOR i%=0 TO 59
  1371.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),PRED(x_logo%),i%,4
  1372.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),SUCC(x_logo%),i%,4
  1373.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),x_logo%,MAX(PRED(i%),0),4
  1374.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),x_logo%,SUCC(i%),4
  1375.         NEXT i%
  1376.         FOR i%=0 TO 59
  1377.           RC_COPY ADD(adr_logo%,MUL(i%,320)),0,0,320,1 TO XBIOS(2),x_logo%,i%,7
  1378.         NEXT i%
  1379.       ENDIF
  1380.       ERASE image_presentation%()
  1381.       '
  1382.       ' Palette de l'image
  1383.       '
  1384.       pal$=""
  1385.       dummy=RND
  1386.       IF dummy<0.85
  1387.         FOR i%=0 TO 15
  1388.           pal$=pal$+HEX$(MUL(i%,&H111),3)
  1389.         NEXT i%
  1390.       ELSE IF dummy<0.95
  1391.         FOR i%=0 TO 15
  1392.           pal$=pal$+HEX$(MUL(SUB(15,i%),&H111),3)
  1393.         NEXT i%
  1394.       ELSE IF dummy<0.975
  1395.         FOR i%=0 TO 15
  1396.           pal$=pal$+HEX$(ADD(MUL(i%,&H100),MUL(SUB(15,i%),&H10)),3)
  1397.         NEXT i%
  1398.       ELSE
  1399.         FOR i%=0 TO 15
  1400.           IF i%<8
  1401.             j%=ADD(i%,3)
  1402.           ELSE
  1403.             j%=SUB(19,i%)
  1404.           ENDIF
  1405.           pal$=pal$+HEX$(MUL(j%,&H111),3)
  1406.         NEXT i%
  1407.       ENDIF
  1408.       GOSUB nouvelle_palette(pal$)
  1409.       '
  1410.       ' Constitue le logo pour l'affichage dans le programme
  1411.       '
  1412.       graoumf_logo_mask$=MID$(logo$,35,19200)   ! 120 lignes de 160 octets
  1413.       graoumf_logo$=graoumf_logo_mask$
  1414.       FOR plan%=0 TO 3                          ! Met a 0 les bitplans non utilises, suivant la couleur
  1415.         IF NOT BTST(graoumf_logo_color%,plan%)
  1416.           adr_logo%=V:graoumf_logo$
  1417.           FOR i%=ADD(adr_logo%,SHL(plan%,1)) TO ADD(ADD(adr_logo%,SHL(plan%,1)),19192) STEP 8
  1418.             CARD{i%}=0
  1419.           NEXT i%
  1420.         ENDIF
  1421.       NEXT plan%
  1422.       attente_fin_presentation%=2               ! On laissera admirer 2 secondes l'image...
  1423.     ENDIF
  1424.     CLOSE #0
  1425.   ENDIF
  1426. RETURN
  1427. PROCEDURE sauve_palette
  1428.   LOCAL i%
  1429.   oldpalette$=""
  1430.   FOR i%=&HFFFF9800 TO &HFFFF983C STEP 4
  1431.     oldpalette$=oldpalette$+MKL$(LPEEK(i%))
  1432.   NEXT i%
  1433. RETURN
  1434. PROCEDURE nouvelle_palette(pal$)
  1435.   LOCAL a%,b%,c%
  1436.   FOR a%=0 TO 15
  1437.     ' Palette Falcon
  1438.     b%=SHL(VAL("&"+MID$(pal$,ADD(MUL(a%,3),3),1)),4)
  1439.     ADD b%,SHL(VAL("&"+MID$(pal$,ADD(MUL(a%,3),2),1)),20)
  1440.     ADD b%,SHL(VAL("&"+MID$(pal$,SUCC(MUL(a%,3)),1)),28)
  1441.     SLPOKE ADD(&HFFFF9800,SHL(a%,2)),b%
  1442.     ' Palette ST
  1443.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),3),1))
  1444.     b%=ADD(SHR(c%,1),SHL(c% AND 1,3))
  1445.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),2),1))
  1446.     ADD b%,SHL(ADD(SHR(c%,1),SHL(c% AND 1,3)),4)
  1447.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),1),1))
  1448.     ADD b%,SHL(ADD(SHR(c%,1),SHL(c% AND 1,3)),8)
  1449.     SDPOKE ADD(&HFFFF8240,SHL(a%,1)),b%
  1450.   NEXT a%
  1451. RETURN
  1452. PROCEDURE restaure_palette
  1453.   LOCAL iiiii%
  1454.   FOR iiiii%=0 TO &H3C STEP 4
  1455.     SLPOKE ADD(iiiii%,&HFFFF9800),CVL(MID$(oldpalette$,SUCC(iiiii%),4))
  1456.   NEXT iiiii%
  1457. RETURN
  1458. '
  1459. ' Affichages de base
  1460. ' ------------------
  1461. PROCEDURE resync_tv_screen
  1462.   LOCAL a%
  1463.   a%=GEMDOS(7) AND 255
  1464.   SELECT a%
  1465.   CASE "1"                                  ! Normal non entrelace
  1466.     SDPOKE &HFF8282,&H1FF
  1467.     SDPOKE &HFF8284,&H160
  1468.     SDPOKE &HFF8286,&HA7
  1469.     SDPOKE &HFF8288,&H70
  1470.     SDPOKE &HFF828A,&H120
  1471.     SDPOKE &HFF828C,&H1B4
  1472.     SDPOKE &HFF82A2,&H20D
  1473.     SDPOKE &HFF82A4,&H201
  1474.     SDPOKE &HFF82A6,&H32
  1475.     SDPOKE &HFF82A8,&H4D
  1476.     SDPOKE &HFF82AA,&H1DD
  1477.     SDPOKE &HFF82AC,&H207
  1478.   CASE "2"                                  ! Normal entrelace
  1479.     SDPOKE &HFF8282,&H1FF
  1480.     SDPOKE &HFF8284,&H160
  1481.     SDPOKE &HFF8286,&HA7
  1482.     SDPOKE &HFF8288,&H70
  1483.     SDPOKE &HFF828A,&H120
  1484.     SDPOKE &HFF828C,&H1B4
  1485.     SDPOKE &HFF82A2,&H20C
  1486.     SDPOKE &HFF82A4,&H201
  1487.     SDPOKE &HFF82A6,&H32
  1488.     SDPOKE &HFF82A8,&H4C
  1489.     SDPOKE &HFF82AA,&H1DC
  1490.     SDPOKE &HFF82AC,&H207
  1491.   CASE "4"                                  ! Overscan non entrelace
  1492.     SDPOKE &HFF8282,&H1FF
  1493.     SDPOKE &HFF8284,&H180
  1494.     SDPOKE &HFF8286,&H7F
  1495.     SDPOKE &HFF8288,&H2D
  1496.     SDPOKE &HFF828A,&H15D
  1497.     SDPOKE &HFF828C,&H1A1
  1498.     SDPOKE &HFF82A2,&H20D
  1499.     SDPOKE &HFF82A4,&H207
  1500.     SDPOKE &HFF82A6,&H25
  1501.     SDPOKE &HFF82A8,&H25
  1502.     SDPOKE &HFF82AA,&H205
  1503.     SDPOKE &HFF82AC,&H207
  1504.   CASE "5"                                  ! Overscan entrelace
  1505.     SDPOKE &HFF8282,&H1FF
  1506.     SDPOKE &HFF8284,&H180
  1507.     SDPOKE &HFF8286,&H7F
  1508.     SDPOKE &HFF8288,&H2D
  1509.     SDPOKE &HFF828A,&H15D
  1510.     SDPOKE &HFF828C,&H1A1
  1511.     SDPOKE &HFF82A2,&H20C
  1512.     SDPOKE &HFF82A4,&H207
  1513.     SDPOKE &HFF82A6,&H25
  1514.     SDPOKE &HFF82A8,&H24
  1515.     SDPOKE &HFF82AA,&H204
  1516.     SDPOKE &HFF82AC,&H207
  1517.   ENDSELECT
  1518. RETURN
  1519. PROCEDURE cadre_int(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1520.   LOCAL aaaa$,iiii%
  1521.   HIDEM
  1522.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1523.   iiii%=V:aaaa$
  1524.   ~C:g_dessine_cadre_int%(L:iiii%)
  1525. RETURN
  1526. PROCEDURE cadre_ext(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1527.   LOCAL aaaa$,iiii%
  1528.   HIDEM
  1529.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1530.   iiii%=V:aaaa$
  1531.   ~C:g_dessine_cadre_ext%(L:iiii%)
  1532. RETURN
  1533. PROCEDURE cadre_o_int(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1534.   LOCAL aaaa$,iiii%
  1535.   HIDEM
  1536.   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)
  1537.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1538.   iiii%=V:aaaa$
  1539.   ~C:g_dessine_cadre_int%(L:iiii%)
  1540. RETURN
  1541. PROCEDURE cadre_o_ext(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1542.   LOCAL aaaa$,iiii%
  1543.   HIDEM
  1544.   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)
  1545.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1546.   iiii%=V:aaaa$
  1547.   ~C:g_dessine_cadre_ext%(L:iiii%)
  1548. RETURN
  1549. PROCEDURE cadre_texte(aaaa$,xxxx%,yyyy%,llll%)
  1550.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1551.   HIDEM
  1552.   IF aaaa$=""
  1553.     aaaa$=CHR$(0)
  1554.   ENDIF
  1555.   cccc$=aaaa$+CHR$(0)
  1556.   aaaa%=V:cccc$
  1557.   bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1558.   bbbb%=V:bbbb$
  1559.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1560. RETURN
  1561. PROCEDURE cadre_texte2(aaaa$,xxxx%,yyyy%,llll%,pppp%)
  1562.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1563.   HIDEM
  1564.   IF aaaa$=""
  1565.     aaaa$=CHR$(0)
  1566.   ENDIF
  1567.   cccc$=aaaa$+CHR$(0)
  1568.   aaaa%=V:cccc$
  1569.   IF pppp%=0
  1570.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1571.   ELSE
  1572.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(8)+CHR$(10)
  1573.   ENDIF
  1574.   bbbb%=V:bbbb$
  1575.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1576. RETURN
  1577. PROCEDURE cadre_texte3(aaaa$,xxxx%,yyyy%,llll%,hhhh%,pppp%)
  1578.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1579.   HIDEM
  1580.   IF aaaa$=""
  1581.     aaaa$=CHR$(0)
  1582.   ENDIF
  1583.   cccc$=aaaa$+CHR$(0)
  1584.   aaaa%=V:cccc$
  1585.   IF pppp%=0
  1586.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1587.   ELSE
  1588.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(9)+CHR$(9)+CHR$(8)+CHR$(10)
  1589.   ENDIF
  1590.   bbbb%=V:bbbb$
  1591.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1592. RETURN
  1593. PROCEDURE cadre_texte_b(aaaa$,xxxx%,yyyy%,llll%)
  1594.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1595.   HIDEM
  1596.   IF aaaa$=""
  1597.     aaaa$=CHR$(0)
  1598.   ENDIF
  1599.   cccc$=aaaa$+CHR$(0)
  1600.   aaaa%=V:cccc$
  1601.   bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1602.   bbbb%=V:bbbb$
  1603.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1604. RETURN
  1605. PROCEDURE cadre_texte2_b(aaaa$,xxxx%,yyyy%,llll%,pppp%)
  1606.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1607.   HIDEM
  1608.   IF aaaa$=""
  1609.     aaaa$=CHR$(0)
  1610.   ENDIF
  1611.   cccc$=aaaa$+CHR$(0)
  1612.   aaaa%=V:cccc$
  1613.   IF pppp%=0
  1614.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1615.   ELSE
  1616.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(12)+CHR$(14)
  1617.   ENDIF
  1618.   bbbb%=V:bbbb$
  1619.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1620. RETURN
  1621. PROCEDURE cadre_texte3_b(aaaa$,xxxx%,yyyy%,llll%,hhhh%,pppp%)
  1622.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1623.   HIDEM
  1624.   IF aaaa$=""
  1625.     aaaa$=CHR$(0)
  1626.   ENDIF
  1627.   cccc$=aaaa$+CHR$(0)
  1628.   aaaa%=V:cccc$
  1629.   IF pppp%=0
  1630.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1631.   ELSE
  1632.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(13)+CHR$(13)+CHR$(12)+CHR$(14)
  1633.   ENDIF
  1634.   bbbb%=V:bbbb$
  1635.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1636. RETURN
  1637. PROCEDURE grise_surface(xxxx%,yyyy%,llll%,hhhh%)
  1638.   ~C:g_grise_surface%(W:xxxx%,W:yyyy%,W:llll%,W:hhhh%)
  1639. RETURN
  1640. PROCEDURE grise_icone(nnn%,ttt%,xxxd%,yyyd%)
  1641.   GOSUB grise_surface(ADD(divbi&(0,nnn%,ttt%),xxxd%),ADD(divbi&(1,nnn%,ttt%),yyyd%),divbi&(2,nnn%,ttt%),divbi&(3,nnn%,ttt%))
  1642. RETURN
  1643. PROCEDURE affchaine_notrans(aaaa$,xxxx%,yyyy%,cccc%)
  1644.   LOCAL aaaa%,bbbb$
  1645.   IF aaaa$<>""
  1646.     HIDEM
  1647.     bbbb$=aaaa$+CHR$(0)
  1648.     aaaa%=V:bbbb$
  1649.     ~C:g_affchaine_notrans%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%)
  1650.   ENDIF
  1651. RETURN
  1652. PROCEDURE affchaine_trans(aaaa$,xxxx%,yyyy%,cccc%)
  1653.   LOCAL aaaa%,bbbb$
  1654.   IF aaaa$<>""
  1655.     HIDEM
  1656.     bbbb$=aaaa$+CHR$(0)
  1657.     aaaa%=V:bbbb$
  1658.     ~C:g_affchaine_trans%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%)
  1659.   ENDIF
  1660. RETURN
  1661. PROCEDURE affchaine_trans_ombr(aaaa$,xxxx%,yyyy%,cccc%,cccc2%)
  1662.   LOCAL aaaa%,bbbb$
  1663.   IF aaaa$<>""
  1664.     HIDEM
  1665.     bbbb$=aaaa$+CHR$(0)
  1666.     aaaa%=V:bbbb$
  1667.     ~C:g_affchaine_trans_ombr%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%,W:cccc2%)
  1668.   ENDIF
  1669. RETURN
  1670. PROCEDURE affchaine_tronque(aaa$,xxx%,yyy%,ccc%,lll%)
  1671.   IF LEN(aaa$)>lll%
  1672.     aaa$=LEFT$(aaa$,PRED(lll%))+CHR$(11)
  1673.   ENDIF
  1674.   GOSUB affchaine_notrans(aaa$,xxx%,yyy%,ccc%)
  1675. RETURN
  1676. PROCEDURE affiche_icone(nnn%,ttt%,xxxd%,yyyd%,ccc%)
  1677.   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%)
  1678. RETURN
  1679. PROCEDURE affiche_icone_b(nnn%,ttt%,xxxd%,yyyd%,ccc%)
  1680.   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%)
  1681. RETURN
  1682. PROCEDURE affiche_bloc_icones(dd%,nn%,tt%,xxd%,yyd%)
  1683.   LOCAL ii%
  1684.   FOR ii%=dd% TO ADD(dd%,PRED(nn%))
  1685.     GOSUB affiche_icone(ii%,tt%,xxd%,yyd%,0)
  1686.   NEXT ii%
  1687. RETURN
  1688. PROCEDURE affiche_bloc_icones_b(dd%,nn%,tt%,xxd%,yyd%)
  1689.   LOCAL ii%
  1690.   FOR ii%=dd% TO ADD(dd%,PRED(nn%))
  1691.     GOSUB affiche_icone_b(ii%,tt%,xxd%,yyd%,0)
  1692.   NEXT ii%
  1693. RETURN
  1694. PROCEDURE affiche_pattern(pat%,lig%,pre%)
  1695.   LOCAL a%,b%,xm%,ym%,km%
  1696.   a%=V:para_affiche_pattern$
  1697.   BMOVE V:preset&(0,pre%),ADD(a%,8),64
  1698.   CARD{ADD(a%,2)}=FN nbr_lines(pat%)
  1699.   CARD{ADD(a%,4)}=MIN(nbr_colonnes%(pre%),nbr_col%)
  1700.   b%=FN adr_pat(pat%)
  1701.   MOUSE xm%,ym%,km%
  1702.   IF xm%>23 AND ym%>153 AND ym%<ADD(170,MUL(haut_lig%,6))
  1703.     HIDEM
  1704.   ELSE
  1705.     SHOWM
  1706.   ENDIF
  1707.   ~C:g_affiche_pattern%(W:lig%,L:a%,L:b%,L:adr_af_pat%,W:curs_col%,W:curs_x%)
  1708.   SHOWM
  1709. RETURN
  1710. PROCEDURE affiche_c_pattern
  1711.   LOCAL a%,b%,xm%,ym%,km%
  1712.   a%=V:para_affiche_pattern$
  1713.   BMOVE V:preset&(0,n_preset%),ADD(a%,8),64
  1714.   CARD{ADD(a%,2)}=FN nbr_lines2(songpos%)
  1715.   CARD{ADD(a%,4)}=MIN(nbr_colonnes%(n_preset%),nbr_col%)
  1716.   b%=FN adr_pat(song&(songpos%))
  1717.   MOUSE xm%,ym%,km%
  1718.   IF xm%>23 AND ym%>153 AND ym%<ADD(170,MUL(haut_lig%,6))
  1719.     HIDEM
  1720.   ELSE
  1721.     SHOWM
  1722.   ENDIF
  1723.   ~C:g_affiche_pattern%(W:posligne%,L:a%,L:b%,L:adr_af_pat%,W:curs_col%,W:curs_x%)
  1724.   SHOWM
  1725. RETURN
  1726. PROCEDURE save_background(x%,y%,l%,h%)
  1727.   LOCAL i%,size%,adrinc%
  1728.   adrinc%=SHR(ADD(l%,15) AND -16,1)
  1729.   size%=MUL(adrinc%,h%)
  1730.   IF MALLOC(-1)>ADD(size%,8)
  1731.     adr_background%=MALLOC(ADD(size%,8))
  1732.     CARD{adr_background%}=x%
  1733.     CARD{ADD(adr_background%,2)}=y%
  1734.     CARD{ADD(adr_background%,4)}=l%
  1735.     CARD{ADD(adr_background%,6)}=h%
  1736.     a%=ADD(adr_background%,8)
  1737.     HIDEM
  1738.     FOR i%=0 TO PRED(h%)
  1739.       RC_COPY XBIOS(3),x%,ADD(y%,i%),l%,1 TO a%,0,0
  1740.       ADD a%,adrinc%
  1741.     NEXT i%
  1742.   ELSE
  1743.     adr_background%=0
  1744.   ENDIF
  1745. RETURN
  1746. PROCEDURE restore_background
  1747.   LOCAL i%,x%,y%,l%,h%,adrinc%
  1748.   IF adr_background%<>0
  1749.     x%=CARD{adr_background%}
  1750.     y%=CARD{ADD(adr_background%,2)}
  1751.     l%=CARD{ADD(adr_background%,4)}
  1752.     h%=CARD{ADD(adr_background%,6)}
  1753.     a%=ADD(adr_background%,8)
  1754.     adrinc%=SHR(ADD(l%,15) AND -16,1)
  1755.     HIDEM
  1756.     FOR i%=0 TO PRED(h%)
  1757.       RC_COPY a%,0,0,l%,1 TO XBIOS(3),x%,ADD(y%,i%)
  1758.       ADD a%,adrinc%
  1759.     NEXT i%
  1760.     ~MFREE(adr_background%)
  1761.     adr_background%=0
  1762.   ELSE
  1763.     GOSUB affiche_panneau_principal
  1764.   ENDIF
  1765. RETURN
  1766. '
  1767. ' Sous-menus du tracker
  1768. ' --------------------
  1769. PROCEDURE aff_nssmenu
  1770.   LOCAL iiii%
  1771.   FOR iiii%=1 TO 7
  1772.     IF ss_menu%=iiii%
  1773.       GOSUB affiche_icone_b(ADD(iiii%,9),24,0,0,-1)
  1774.     ELSE
  1775.       GOSUB affiche_icone(ADD(iiii%,9),24,0,0,0)
  1776.     ENDIF
  1777.   NEXT iiii%
  1778. RETURN
  1779. PROCEDURE affiche_icones_commande
  1780.   GOSUB affiche_bloc_icones(0,17,24,0,0)
  1781.   GOSUB grise_icone(3,24,0,0)                   ! Prefs
  1782.   GOSUB grise_icone(4,24,0,0)                   ! Score
  1783.   GOSUB grise_icone(8,24,0,0)                   ! Drum Editor
  1784.   GOSUB aff_nssmenu
  1785. RETURN
  1786. PROCEDURE gere_icones_haut
  1787.   LOCAL a%,b%,d%,i%,srt%
  1788.   LOCAL a$
  1789.   a%=V:divbi&(0,0,0)
  1790.   srt%=C:g_teste_icones%(L:a%,W:24,W:xm%,W:ym%)
  1791.   IF srt%>=0
  1792.     GOSUB affiche_icone(srt%,24,0,0,-1)
  1793.     GOSUB wait_mouse(TRUE)
  1794.     SELECT srt%
  1795.       ' ----------------------------------------------------------------------
  1796.     CASE 0      ! Play song
  1797.       GOSUB edit_mode_off
  1798.       IF km%=2
  1799.         GOSUB play_song(TRUE)
  1800.       ELSE
  1801.         GOSUB play_song(FALSE)
  1802.       ENDIF
  1803.       ' ----------------------------------------------------------------------
  1804.     CASE 1      ! Edit
  1805.       GOSUB edit_mode_on
  1806.       SLPOKE &HFFFF983C,&HFF            ! Bleu
  1807.       GOSUB aff_ps_pp_e
  1808.       GOSUB aff_message("Edit mode activated.")
  1809.       ' ----------------------------------------------------------------------
  1810.     CASE 5      ! Play pattern
  1811.       GOSUB edit_mode_off
  1812.       IF km%=2
  1813.         GOSUB play_pattern(TRUE)
  1814.       ELSE
  1815.         GOSUB play_pattern(FALSE)
  1816.       ENDIF
  1817.       ' ----------------------------------------------------------------------
  1818.     CASE 10     ! Disk
  1819.       ss_menu%=1
  1820.       GOSUB aff_nssmenu
  1821.       GOSUB affiche_icones_disk
  1822.       ' ----------------------------------------------------------------------
  1823.     CASE 11     ! Tools
  1824.       ss_menu%=2
  1825.       GOSUB aff_nssmenu
  1826.       GOSUB affiche_icones_tools
  1827.       ' ----------------------------------------------------------------------
  1828.     CASE 12     ! Instruments
  1829.       ss_menu%=3
  1830.       GOSUB aff_nssmenu
  1831.       GOSUB affiche_icones_instr
  1832.       ' ----------------------------------------------------------------------
  1833.     CASE 13     ! Samples
  1834.       ss_menu%=4
  1835.       GOSUB aff_nssmenu
  1836.       GOSUB affiche_icones_sample
  1837.       ' ----------------------------------------------------------------------
  1838.     CASE 14     ! Envelopes
  1839.       ss_menu%=5
  1840.       GOSUB aff_nssmenu
  1841.       GOSUB affiche_icones_enveloppe
  1842.       ' ----------------------------------------------------------------------
  1843.     CASE 15     ! Control
  1844.       ss_menu%=6
  1845.       GOSUB aff_nssmenu
  1846.       GOSUB affiche_icones_control
  1847.       ' ----------------------------------------------------------------------
  1848.     CASE 16     ! Midi
  1849.       ss_menu%=7
  1850.       GOSUB aff_nssmenu
  1851.       GOSUB affiche_icones_midi
  1852.       ' ----------------------------------------------------------------------
  1853.     DEFAULT
  1854.       ' Icones normales
  1855.       SELECT srt%
  1856.         ' --------------------------------------------------------------------
  1857.       CASE 2      ! Insert position
  1858.         IF FN song_length<256
  1859.           GOSUB stop_voices
  1860.           IF songpos%<PRED(FN song_length)
  1861.             FOR i%=PRED(FN song_length) DOWNTO songpos%
  1862.               song&(SUCC(i%))=song&(i%)
  1863.             NEXT i%
  1864.           ENDIF
  1865.           INC module&(101)
  1866.           IF FN song_repeat>songpos%
  1867.             INC module&(102)
  1868.           ENDIF
  1869.           INC songpos%
  1870.           IF km%=2        ! Clic droit  : Nouveau pattern inutilise
  1871.             a%=0
  1872.             i%=0
  1873.             REPEAT
  1874.               IF a%=song&(i%)
  1875.                 INC a%
  1876.                 i%=-1
  1877.               ENDIF
  1878.               INC i%
  1879.             UNTIL i%=>FN song_length
  1880.             song&(songpos%)=a%
  1881.             IF FN nbr_lines(a%)=1               ! Initialise la hauteur du pattern s'il est vide
  1882.               GOSUB bee(TRUE)
  1883.               b%=FN adr_pat(a%)
  1884.               i%=nbr_track%
  1885.               WHILE LONG{b%}=0 AND BYTE{ADD(b%,4)}=0 AND i%>0
  1886.                 DEC i%
  1887.                 ADD b%,5
  1888.               WEND
  1889.               IF i%=0
  1890.                 GOSUB change_pattern_high(a%,default_pattern_high%)
  1891.               ENDIF
  1892.               GOSUB bee(FALSE)
  1893.             ENDIF
  1894.           ENDIF
  1895.           a$=TRIM$(FN patternname$(song&(songpos%)))
  1896.           IF a$<>""
  1897.             a$=" ("+a$+")"
  1898.           ENDIF
  1899.           GOSUB aff_message("Pattern "+HEX$(song&(songpos%),2)+a$+" inserted at position "+HEX$(songpos%,2)+".")
  1900.           GOSUB affiche_info_song
  1901.           GOSUB affiche_c_pattern
  1902.         ENDIF
  1903.         ' --------------------------------------------------------------------
  1904.       CASE 3      ! Preferences
  1905.         ' Rien
  1906.         ' GOSUB prefs
  1907.         ' --------------------------------------------------------------------
  1908.       CASE 4      ! Score
  1909.         ' Rien
  1910.         ' --------------------------------------------------------------------
  1911.       CASE 6      ! Stop
  1912.         GOSUB edit_mode_off
  1913.         GOSUB stop_voices
  1914.         SLPOKE &HFFFF983C,&HFFFF00FF      ! Blanc
  1915.         GOSUB aff_ps_pp_e
  1916.         GOSUB aff_message("Song stopped and Edit mode deactivated.")
  1917.         ' --------------------------------------------------------------------
  1918.       CASE 7      ! Delete position
  1919.         IF songpos%<PRED(FN song_length)
  1920.           FOR i%=SUCC(songpos%) TO PRED(FN song_length)
  1921.             song&(PRED(i%))=song&(i%)
  1922.           NEXT i%
  1923.           DEC module&(101)
  1924.           song&(FN song_length)=0
  1925.           IF FN song_repeat>songpos%
  1926.             DEC module&(102)
  1927.           ENDIF
  1928.           GOSUB affiche_info_song
  1929.           GOSUB affiche_c_pattern
  1930.           GOSUB aff_message("Position "+HEX$(songpos%,2)+" deleted.")
  1931.         ENDIF
  1932.         ' --------------------------------------------------------------------
  1933.         ' CASE 8            ! Help
  1934.         ' GOSUB help(0)
  1935.       CASE 8            ! Drum Editor
  1936.         GOSUB drum_editor
  1937.         GOSUB affiche_panneau_principal
  1938.         ' --------------------------------------------------------------------
  1939.       CASE 9            ! Sample Editor
  1940.         GOSUB sample_editor
  1941.         GOSUB affiche_panneau_principal
  1942.         ' --------------------------------------------------------------------
  1943.       ENDSELECT
  1944.       GOSUB affiche_icone(srt%,24,0,0,0)
  1945.       GOSUB grise_icone(3,24,0,0)               ! Prefs
  1946.       GOSUB grise_icone(4,24,0,0)               ! Score
  1947.       GOSUB grise_icone(8,24,0,0)               ! Drum Editor
  1948.     ENDSELECT
  1949.     GOSUB wait_mouse(flag_relachement!)
  1950.     GOSUB vide_buffer_clavier
  1951.   ENDIF
  1952. RETURN
  1953. PROCEDURE gere_icones_panneaup
  1954.   LOCAL a%,b%,d%,h%,i%,srt%
  1955.   LOCAL flag_relachement!
  1956.   flag_relachement!=TRUE
  1957.   a%=V:divbi&(0,0,0)
  1958.   srt%=C:g_teste_icones%(L:a%,W:16,W:xm%,W:ym%)
  1959.   IF srt%>=0
  1960.     SELECT srt%
  1961.       ' Radio-boutons, Flip-flops ou champs de texte
  1962.       ' ----------------------------------------------------------------------
  1963.     CASE 12                     ! Numero d'instrument
  1964.       IF km%=2
  1965.         instr%=sample%
  1966.         ss_menu%=3
  1967.         GOSUB aff_nssmenu
  1968.         GOSUB affiche_icones_instr
  1969.         GOSUB affiche_info_sample
  1970.       ELSE
  1971.         d%=0
  1972.         GOSUB chg_instrument
  1973.       ENDIF
  1974.       ' ----------------------------------------------------------------------
  1975.     CASE 15                     ! Numero de sample
  1976.       IF km%=2
  1977.         sample%=FN isample(instr%,instr_note_pos%)
  1978.         ss_menu%=4
  1979.         GOSUB aff_nssmenu
  1980.         GOSUB affiche_icones_sample
  1981.         GOSUB affiche_info_sample
  1982.       ELSE
  1983.         d%=0
  1984.         GOSUB chg_sample
  1985.       ENDIF
  1986.       ' ----------------------------------------------------------------------
  1987.     CASE 0,3,6,9,18             ! Autres icones: Edition des numeros
  1988.       d%=0
  1989.       ON DIV(ADD(srt%,3),3) GOSUB chg_songpos,chg_pattern,chg_songlen,chg_songrep,rien,rien,chg_linestep
  1990.       ' ----------------------------------------------------------------------
  1991.     CASE 1,4,7,10,13,16,19      ! Numero +
  1992.       d%=1
  1993.       ON DIV(ADD(srt%,2),3) GOSUB chg_songpos,chg_pattern,chg_songlen,chg_songrep,chg_instrument,chg_sample,chg_linestep
  1994.       flag_relachement!=FALSE
  1995.       ' ----------------------------------------------------------------------
  1996.     CASE 2,5,8,11,14,17,20      ! Numero -
  1997.       d%=-1
  1998.       ON DIV(ADD(srt%,1),3) GOSUB chg_songpos,chg_pattern,chg_songlen,chg_songrep,chg_instrument,chg_sample,chg_linestep
  1999.       flag_relachement!=FALSE
  2000.       ' ----------------------------------------------------------------------
  2001.     CASE 21                     ! Songname
  2002.       GOSUB edite_chaine(FN songname$,ADD(divbi&(0,srt%,16),9),ADD(divbi&(1,srt%,16),2),32,0)
  2003.       BMOVE V:bbbb$,V:module&(2),32
  2004.       GOSUB affiche_info_song
  2005.       ' ----------------------------------------------------------------------
  2006.     CASE 22                     ! Instrname
  2007.       GOSUB edite_chaine(FN instrname$(instr%),ADD(divbi&(0,srt%,16),9),ADD(divbi&(1,srt%,16),2),28,0)
  2008.       GOSUB chg_instrname(bbbb$,instr%)
  2009.       GOSUB affiche_info_song
  2010.       ' ----------------------------------------------------------------------
  2011.     CASE 23                     ! Track
  2012.       GOSUB edite_chaine(STR$(nbr_track%,2),ADD(divbi&(0,srt%,16),7),ADD(divbi&(1,srt%,16),2),2,2)
  2013.       a%=MAX(MIN(VAL(bbbb$),32),1)
  2014.       IF a%<>nbr_track%
  2015.         GOSUB change_format(a%)
  2016.       ELSE
  2017.         GOSUB affiche_panneau_principal
  2018.       ENDIF
  2019.       ' ----------------------------------------------------------------------
  2020.     CASE 24                     ! Lines
  2021.       a%=song&(songpos%)
  2022.       IF km%=1
  2023.         GOSUB edite_chaine(STR$(FN nbr_lines(a%),3),ADD(divbi&(0,srt%,16),6),ADD(divbi&(1,srt%,16),2),3,2)
  2024.         h%=MAX(MIN(VAL(bbbb$),256),1)
  2025.         GOSUB bee(TRUE)
  2026.         GOSUB change_pattern_high(song&(songpos%),h%)
  2027.       ELSE                                      ! Initialise la hauteur du pattern avec la valeur predefinie
  2028.         GOSUB bee(TRUE)
  2029.         GOSUB change_pattern_high(a%,default_pattern_high%)
  2030.       ENDIF
  2031.       GOSUB affiche_info_song
  2032.       GOSUB affiche_c_pattern
  2033.       GOSUB bee(FALSE)
  2034.       ' ----------------------------------------------------------------------
  2035.     CASE 25                     ! Horloge
  2036.       debut_temps%=TIMER
  2037.       GOSUB affiche_temps
  2038.       ' ----------------------------------------------------------------------
  2039.     CASE 27                     ! Preset
  2040.       ' Rien
  2041.       ' ----------------------------------------------------------------------
  2042.     CASE 3,4                    ! Prefs & Score
  2043.       ' Rien
  2044.       ' ----------------------------------------------------------------------
  2045.     DEFAULT
  2046.       ' Icones normales
  2047.       GOSUB affiche_icone(srt%,16,0,0,-1)
  2048.       ' GOSUB wait_mouse(TRUE)
  2049.       SELECT srt%
  2050.         ' --------------------------------------------------------------------
  2051.       CASE 26                   ! ON/OFF
  2052.         IF km%=1                        ! Bouton gauche : toutes les voies ON
  2053.           GOSUB all_track_on(TRUE)
  2054.         ELSE                            ! Bouton droit : inversion de l'etat de chaque voie
  2055.           FOR i%=0 TO PRED(nbr_track%)
  2056.             GOSUB chg_track_onoff(i%,ABS(SGN(FN track_onoff(i%))) XOR 1)
  2057.             GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  2058.           NEXT i%
  2059.         ENDIF
  2060.         GOSUB affiche_info_preset
  2061.         ' --------------------------------------------------------------------
  2062.       ENDSELECT
  2063.       GOSUB affiche_icone(srt%,16,0,0,0)
  2064.     ENDSELECT
  2065.     GOSUB wait_mouse(flag_relachement!)
  2066.     GOSUB vide_buffer_clavier
  2067.   ENDIF
  2068. RETURN
  2069. ' Disk
  2070. PROCEDURE affiche_icones_disk
  2071.   LOCAL i%
  2072.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2073.   GOSUB affiche_bloc_icones_b(0,16,0,0,0)
  2074.   GOSUB cadre_ext(ADD(divbi&(0,8,0),8),ADD(divbi&(1,8,0),2),15,5,0,13,12,14)
  2075.   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)
  2076.   GOSUB cadre_ext(ADD(divbi&(0,10,0),12),ADD(divbi&(1,10,0),2),4,5,0,13,12,14)
  2077.   GOSUB affchaine_trans("SAVE CONF",134,82,14)
  2078.   GOSUB grise_icone(4,0,0,0)
  2079.   GOSUB grise_icone(5,0,0,0)
  2080.   GOSUB grise_icone(6,0,0,0)
  2081.   GOSUB grise_icone(7,0,0,0)
  2082.   GOSUB affiche_icones_diskb
  2083. RETURN
  2084. PROCEDURE affiche_icones_diskb
  2085.   LOCAL a$,b$
  2086.   SELECT path_displayed%
  2087.   CASE 0
  2088.     a$=npath_prog$
  2089.     b$="System"
  2090.   CASE 1
  2091.     a$=npath_module$+nfile_module$
  2092.     b$="Module"
  2093.   CASE 2
  2094.     a$=npath_prefs$+nfile_prefs$
  2095.     b$="Preferences"
  2096.   CASE 3
  2097.     a$=npath_sample$+nfile_sample$
  2098.     b$="Sample # "+HEX$(sample%,2)
  2099.   CASE 4
  2100.     a$=npath_sample$
  2101.     b$="Instrument # "+HEX$(instr%,2)
  2102.   CASE 5
  2103.     a$=npath_autoload$
  2104.     b$="Autoload"
  2105.   CASE 6
  2106.     a$=npath_div$
  2107.     b$="Miscellaneous"
  2108.   ENDSELECT
  2109.   IF LEN(a$)<58
  2110.     a$=a$+SPACE$(SUB(58,LEN(a$)))
  2111.   ENDIF
  2112.   b$=b$+SPACE$(SUB(16,LEN(b$)))
  2113.   GOSUB affchaine_notrans(b$,ADD(divbi&(0,8,0),8),ADD(divbi&(1,8,0),2),1)
  2114.   GOSUB affchaine_tronque(a$,SUCC(divbi&(0,9,0)),ADD(divbi&(1,9,0),2),1,SUB(divbi&(2,9,0),1))
  2115.   a$=SPACE$(SUB(5,LEN(next_module$)))+next_module$
  2116.   GOSUB affchaine_notrans(a$,ADD(divbi&(0,10,0),12),ADD(divbi&(1,10,0),2),1)
  2117.   GOSUB affiche_icone_b(16,0,0,0,flag_gt2cnf!)
  2118. RETURN
  2119. PROCEDURE gere_icones_disk
  2120.   LOCAL a%,srt%
  2121.   LOCAL a$
  2122.   a%=V:divbi&(0,0,0)
  2123.   srt%=C:g_teste_icones%(L:a%,W:0,W:xm%,W:ym%)
  2124.   ~FRE(0)
  2125.   SELECT srt%
  2126.     ' ------------------------------------------------------------------------
  2127.   CASE 0 TO 7,11 TO 15
  2128.     GOSUB affiche_icone_b(srt%,0,0,0,1)
  2129.     GOSUB wait_mouse(TRUE)
  2130.     IF srt%<=7
  2131.       ON SUCC(srt%) GOSUB load_module,save_module,load_prefs,save_prefs,rien,rien,rien,rien
  2132.     ELSE
  2133.       ON SUB(srt%,10) GOSUB make_directory,delete_directory,rename_file,delete_file,format_disk
  2134.     ENDIF
  2135.     GOSUB affiche_icone_b(srt%,0,0,0,0)
  2136.     ' ------------------------------------------------------------------------
  2137.   CASE 8
  2138.     a%=FN popup(2,path_displayed%,MOUSEX,MOUSEY)
  2139.     IF a%>=0
  2140.       path_displayed%=a% AND &HFFFF
  2141.     ENDIF
  2142.     GOSUB affiche_icones_diskb
  2143.     ' ------------------------------------------------------------------------
  2144.   CASE 9
  2145.     ON SUCC(path_displayed%) GOSUB rien,selpath_module,selpath_prefs,selpath_sample,selpath_sample,selpath_autoload,rien
  2146.     GOSUB affiche_icones_diskb
  2147.     ' ------------------------------------------------------------------------
  2148.   CASE 10
  2149.     a$="GT2GTKMODS3MDTMMMDMTM669ULTXM  *  "
  2150.     a%=INSTR(a$,RIGHT$(next_module$,SUB(LEN(next_module$),INSTR(next_module$,"."))))
  2151.     IF a%>0
  2152.       a%=DIV(PRED(a%),3)
  2153.     ELSE
  2154.       a%=-1
  2155.     ENDIF
  2156.     a%=FN popup(0,a%,MOUSEX,MOUSEY)
  2157.     IF a%>=0
  2158.       a%=a% AND &HFFFF
  2159.       next_module$="*."+TRIM$(MID$(a$,SUCC(MUL(a%,3)),3))
  2160.     ENDIF
  2161.     GOSUB affiche_icones_diskb
  2162.     ' ------------------------------------------------------------------------
  2163.   CASE 16
  2164.     flag_gt2cnf!=NOT flag_gt2cnf!
  2165.     GOSUB affiche_icones_diskb
  2166.     GOSUB wait_mouse(TRUE)
  2167.     ' ------------------------------------------------------------------------
  2168.   ENDSELECT
  2169. RETURN
  2170. ' Tools
  2171. PROCEDURE affiche_icones_tools
  2172.   LOCAL i%
  2173.   IF ss_menut%=2
  2174.     GOSUB affiche_icones_tools2
  2175.   ELSE IF ss_menut%=3
  2176.     GOSUB affiche_icones_tools3
  2177.   ELSE
  2178.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2179.     GOSUB cadre_int(20,35,11,39,13,13,14,12)
  2180.     GOSUB cadre_int(32,35,27,39,13,13,14,12)
  2181.     GOSUB cadre_int(60,35,9,39,13,13,14,12)
  2182.     GOSUB cadre_int(70,35,9,43,13,13,14,12)
  2183.     GOSUB cadre_int(20,75,41,29,13,13,14,12)
  2184.     GOSUB affiche_bloc_icones_b(0,9,1,0,0)
  2185.     GOSUB affiche_bloc_icones_b(16,7,1,0,0)
  2186.     GOSUB cadre_ext(ADD(divbi&(0,16,1),11),ADD(divbi&(1,16,1),2),10,5,0,13,12,14)
  2187.     GOSUB cadre_ext(ADD(divbi&(0,17,1),11),ADD(divbi&(1,17,1),2),10,5,0,13,12,14)
  2188.     GOSUB cadre_ext(ADD(divbi&(0,18,1),9),ADD(divbi&(1,18,1),2),5,5,0,13,12,14)
  2189.     GOSUB affchaine_trans("BLOCK",42,37,14)
  2190.     GOSUB affchaine_trans("ACTION",106,37,14)
  2191.     GOSUB affchaine_trans("CLEAR",SHL(divbi&(0,19,1),1),SUB(divbi&(1,19,1),8),14)
  2192.     GOSUB affiche_icones_toolsb
  2193.   ENDIF
  2194. RETURN
  2195. PROCEDURE affiche_icones_toolsb
  2196.   LOCAL a%,b%,c%,d%,i%,x1%,x2%,x3%,y1%,y2%,y3%,a1%,a2%,b1%,b2%
  2197.   IF ss_menut%=2
  2198.     GOSUB affiche_icones_toolsb2
  2199.   ELSE IF ss_menut%=3
  2200.     GOSUB affiche_icones_toolsb3
  2201.   ELSE
  2202.     GOSUB affiche_icone_b(9,1,0,0,replaceblock%=0)
  2203.     GOSUB affiche_icone_b(12,1,0,0,replaceblock%=1)
  2204.     GOSUB affiche_icone_b(10,1,0,0,maskblock%=0)
  2205.     GOSUB affiche_icone_b(13,1,0,0,maskblock%=1)
  2206.     GOSUB affiche_icone_b(11,1,0,0,trackpat%=0)
  2207.     GOSUB affiche_icone_b(14,1,0,0,trackpat%=1)
  2208.     GOSUB affiche_icone_b(15,1,0,0,trackpat%=2)
  2209.     GOSUB affiche_icone_b(23,1,0,0,bl_flagsong!)
  2210.     x1%=ADD(divbi&(0,16,1),11)
  2211.     y1%=ADD(divbi&(1,16,1),2)
  2212.     x2%=ADD(divbi&(0,17,1),11)
  2213.     y2%=ADD(divbi&(1,17,1),2)
  2214.     x3%=ADD(divbi&(0,18,1),9)
  2215.     y3%=ADD(divbi&(1,18,1),2)
  2216.     a1%=V:bl_maska1$
  2217.     a2%=V:bl_maska2$
  2218.     b1%=V:bl_maskb1$
  2219.     b2%=V:bl_maskb2$
  2220.     IF BYTE{a1%}=0
  2221.       GOSUB affchaine_notrans("?  ",x1%,y1%,1)
  2222.     ELSE
  2223.       IF BYTE{a2%}=0
  2224.         GOSUB affchaine_notrans("---",x1%,y1%,1)
  2225.       ELSE
  2226.         GOSUB affchaine_notrans(MID$(gamme$,SUCC(SHL(BYTE{a2%} MOD 12,1)),2)+STR$(SUB(DIV(BYTE{a2%},12),2),1),x1%,y1%,1)
  2227.       ENDIF
  2228.     ENDIF
  2229.     IF BYTE{b1%}=255
  2230.       GOSUB affchaine_notrans("?  ",x2%,y2%,1)
  2231.     ELSE
  2232.       IF BYTE{b2%}=0
  2233.         GOSUB affchaine_notrans("---",x2%,y2%,1)
  2234.       ELSE
  2235.         GOSUB affchaine_notrans(MID$(gamme$,SUCC(SHL(BYTE{b2%} MOD 12,1)),2)+STR$(SUB(DIV(BYTE{b2%},12),2),1),x2%,y2%,1)
  2236.       ENDIF
  2237.     ENDIF
  2238.     a1%=LONG{SUCC(a1%)}
  2239.     a2%=LONG{SUCC(a2%)}
  2240.     b1%=LONG{SUCC(b1%)}
  2241.     b2%=LONG{SUCC(b2%)}
  2242.     FOR i%=0 TO 7
  2243.       IF (SHL(a1%,SHL(i%,2)) AND &HF0000000)=&H0
  2244.         GOSUB affchaine_notrans("?",ADD(ADD(x1%,i%),3),y1%,1)
  2245.       ELSE
  2246.         GOSUB affchaine_notrans(HEX$(SHR(a2%,SUB(28,SHL(i%,2))) AND 15,1),ADD(ADD(x1%,i%),3),y1%,1)
  2247.       ENDIF
  2248.       IF (SHL(b1%,SHL(i%,2)) AND &HF0000000)=&HF0000000
  2249.         GOSUB affchaine_notrans("?",ADD(ADD(x2%,i%),3),y2%,1)
  2250.       ELSE
  2251.         GOSUB affchaine_notrans(HEX$(SHR(b2%,SUB(28,SHL(i%,2))) AND 15,1),ADD(ADD(x2%,i%),3),y2%,1)
  2252.       ENDIF
  2253.       IF i%<6
  2254.         IF (SHL(ext_note1%,SHL(i%,2)) AND &HF00000)=&HF00000
  2255.           GOSUB affchaine_notrans("?",ADD(x3%,i%),y3%,1)
  2256.         ELSE
  2257.           GOSUB affchaine_notrans(HEX$(SHR(ext_note2%,SUB(20,SHL(i%,2))) AND 15,1),ADD(x3%,i%),y3%,1)
  2258.         ENDIF
  2259.       ENDIF
  2260.     NEXT i%
  2261.   ENDIF
  2262. RETURN
  2263. PROCEDURE gere_icones_tools
  2264.   LOCAL a%,b%,c%,d%,i%,srt%
  2265.   IF ss_menut%=2
  2266.     GOSUB gere_icones_tools2
  2267.   ELSE IF ss_menut%=3
  2268.     GOSUB gere_icones_tools3
  2269.   ELSE
  2270.     a%=V:divbi&(0,0,0)
  2271.     srt%=C:g_teste_icones%(L:a%,W:1,W:xm%,W:ym%)
  2272.     IF srt%=>0
  2273.       SELECT srt%
  2274.         ' --------------------------------------------------------------------
  2275.       CASE 9
  2276.         replaceblock%=0
  2277.         GOSUB affiche_icones_toolsb
  2278.         ' --------------------------------------------------------------------
  2279.       CASE 10
  2280.         maskblock%=0
  2281.         GOSUB affiche_icones_toolsb
  2282.         ' --------------------------------------------------------------------
  2283.       CASE 11
  2284.         trackpat%=0
  2285.         GOSUB affiche_icones_toolsb
  2286.         ' --------------------------------------------------------------------
  2287.       CASE 12
  2288.         replaceblock%=1
  2289.         GOSUB affiche_icones_toolsb
  2290.         ' --------------------------------------------------------------------
  2291.       CASE 13
  2292.         maskblock%=1
  2293.         GOSUB affiche_icones_toolsb
  2294.         ' --------------------------------------------------------------------
  2295.       CASE 14
  2296.         trackpat%=1
  2297.         GOSUB affiche_icones_toolsb
  2298.         ' --------------------------------------------------------------------
  2299.       CASE 15
  2300.         trackpat%=2
  2301.         GOSUB affiche_icones_toolsb
  2302.         ' --------------------------------------------------------------------
  2303.       CASE 16       ! Mask on
  2304.         GOSUB edite_mask1(bl_maska1$,bl_maska2$,ADD(divbi&(0,16,1),11),ADD(divbi&(1,16,1),2),0,0)
  2305.         bl_maska1$=zzzz1$
  2306.         bl_maska2$=zzzz2$
  2307.         ' --------------------------------------------------------------------
  2308.       CASE 17       ! Replace by
  2309.         GOSUB edite_mask1(bl_maskb1$,bl_maskb2$,ADD(divbi&(0,17,1),11),ADD(divbi&(1,17,1),2),-1,0)
  2310.         bl_maskb1$=zzzz1$
  2311.         bl_maskb2$=zzzz2$
  2312.         ' --------------------------------------------------------------------
  2313.       CASE 18       ! Ext note
  2314.         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)
  2315.         ext_note1%=LONG{SUCC(V:zzzz1$)} AND &HFFFFFF
  2316.         ext_note2%=LONG{SUCC(V:zzzz2$)} AND &HFFFFFF
  2317.         ' --------------------------------------------------------------------
  2318.       CASE 19       ! Clear song
  2319.         GOSUB dialog("CLEAR SONG","Do you really want|to do that ?","Ok|Cancel",MOUSEX,MOUSEY)
  2320.         IF bouton%=0
  2321.           GOSUB aff_message("Clearing song & patterns...")
  2322.           GOSUB bee(TRUE)
  2323.           GOSUB clear_song(TRUE)
  2324.           GOSUB aff_message("Song cleared.")
  2325.           GOSUB bee(FALSE)
  2326.           GOSUB affiche_info_song
  2327.           GOSUB affiche_info_preset
  2328.         ENDIF
  2329.         ' --------------------------------------------------------------------
  2330.       CASE 20       ! Clear instr
  2331.         GOSUB dialog("CLEAR SAMPLES","Do you really want|to clear your samples,|instruments and envelopes ?","Ok|Cancel",MOUSEX,MOUSEY)
  2332.         IF bouton%=0
  2333.           GOSUB aff_message("Clearing samples...")
  2334.           GOSUB bee(TRUE)
  2335.           GOSUB clear_instr
  2336.           GOSUB aff_message("Clearing instruments & envelopes...")
  2337.           GOSUB bee(TRUE)
  2338.           GOSUB clear_samples
  2339.           GOSUB aff_message("Samples cleared.")
  2340.           GOSUB bee(FALSE)
  2341.           GOSUB affiche_info_song
  2342.           GOSUB affiche_info_sample
  2343.         ENDIF
  2344.         ' --------------------------------------------------------------------
  2345.       CASE 21       ! Clear all
  2346.         GOSUB dialog("CLEAR ALL","Do you really want|to clear all your module ?","Ok|Cancel",MOUSEX,MOUSEY)
  2347.         IF bouton%=0
  2348.           GOSUB aff_message("Clearing song & patterns...")
  2349.           GOSUB bee(TRUE)
  2350.           GOSUB clear_song(TRUE)
  2351.           GOSUB aff_message("Clearing samples...")
  2352.           GOSUB bee(TRUE)
  2353.           GOSUB clear_samples
  2354.           GOSUB aff_message("Clearing instruments & envelopes...")
  2355.           GOSUB bee(TRUE)
  2356.           GOSUB clear_instr
  2357.           GOSUB aff_message("Module cleared.")
  2358.           GOSUB bee(FALSE)
  2359.           GOSUB affiche_info_song
  2360.           GOSUB affiche_info_sample
  2361.           GOSUB affiche_info_preset
  2362.         ENDIF
  2363.         ' --------------------------------------------------------------------
  2364.       CASE 22       ! Page suivante
  2365.         GOSUB affiche_icone_b(srt%,1,0,0,1)
  2366.         GOSUB wait_mouse(TRUE)
  2367.         ss_menut%=2
  2368.         GOSUB affiche_icones_tools2
  2369.         ' --------------------------------------------------------------------
  2370.       CASE 23       ! Operations sur la song entiere
  2371.         bl_flagsong!=NOT bl_flagsong!
  2372.         GOSUB affiche_icones_toolsb
  2373.         GOSUB wait_mouse(TRUE)      ! Flip-flop alors on attend un relâchement
  2374.         ' --------------------------------------------------------------------
  2375.       DEFAULT
  2376.         GOSUB affiche_icone_b(srt%,1,0,0,1)
  2377.         GOSUB wait_mouse(TRUE)
  2378.         SELECT srt%
  2379.           ' ------------------------------------------------------------------
  2380.         CASE 0
  2381.           GOSUB block_start
  2382.           GOSUB affiche_c_pattern
  2383.           ' ------------------------------------------------------------------
  2384.         CASE 1
  2385.           GOSUB bee(TRUE)
  2386.           GOSUB paste_block
  2387.           GOSUB bee(FALSE)
  2388.           GOSUB affiche_c_pattern
  2389.           SELECT trackpat%
  2390.           CASE 0
  2391.             GOSUB aff_message("Track pasted.")
  2392.           CASE 1
  2393.             GOSUB aff_message("Pattern pasted.")
  2394.           CASE 2
  2395.             GOSUB aff_message("Preset pasted.")
  2396.           ENDSELECT
  2397.           ' ------------------------------------------------------------------
  2398.         CASE 2
  2399.           GOSUB bee(TRUE)
  2400.           GOSUB clear_block
  2401.           GOSUB bee(FALSE)
  2402.           GOSUB affiche_c_pattern
  2403.           SELECT trackpat%
  2404.           CASE 0
  2405.             GOSUB aff_message("Track cleared.")
  2406.           CASE 1
  2407.             GOSUB aff_message("Pattern cleared.")
  2408.           CASE 2
  2409.             GOSUB aff_message("Preset cleared.")
  2410.           ENDSELECT
  2411.           ' ------------------------------------------------------------------
  2412.         CASE 3
  2413.           GOSUB bee(TRUE)
  2414.           IF km%=2
  2415.             FOR i%=0 TO 11
  2416.               GOSUB note_up_general             ! Octave Up
  2417.             NEXT i%
  2418.           ELSE
  2419.             GOSUB note_up_general
  2420.           ENDIF
  2421.           GOSUB bee(FALSE)
  2422.           GOSUB affiche_c_pattern
  2423.           ' ------------------------------------------------------------------
  2424.         CASE 4
  2425.           GOSUB block_end
  2426.           GOSUB affiche_c_pattern
  2427.           ' ------------------------------------------------------------------
  2428.         CASE 5
  2429.           GOSUB bee(TRUE)
  2430.           GOSUB insert_block
  2431.           GOSUB bee(FALSE)
  2432.           GOSUB affiche_c_pattern
  2433.           SELECT trackpat%
  2434.           CASE 0
  2435.             GOSUB aff_message("Track inserted.")
  2436.           CASE 1
  2437.             GOSUB aff_message("Pattern inserted.")
  2438.           CASE 2
  2439.             GOSUB aff_message("Preset inserted.")
  2440.           ENDSELECT
  2441.           ' ------------------------------------------------------------------
  2442.         CASE 6
  2443.           GOSUB bee(TRUE)
  2444.           GOSUB delete_block
  2445.           GOSUB bee(FALSE)
  2446.           GOSUB affiche_c_pattern
  2447.           SELECT trackpat%
  2448.           CASE 0
  2449.             GOSUB aff_message("Track deleted.")
  2450.           CASE 1
  2451.             GOSUB aff_message("Pattern deleted.")
  2452.           CASE 2
  2453.             GOSUB aff_message("Preset deleted.")
  2454.           ENDSELECT
  2455.           ' ------------------------------------------------------------------
  2456.         CASE 7
  2457.           GOSUB bee(TRUE)
  2458.           IF km%=2
  2459.             FOR i%=0 TO 11
  2460.               GOSUB note_down_general
  2461.             NEXT i%
  2462.           ELSE
  2463.             GOSUB note_down_general
  2464.           ENDIF
  2465.           GOSUB bee(FALSE)
  2466.           GOSUB affiche_c_pattern
  2467.           ' ------------------------------------------------------------------
  2468.         CASE 8
  2469.           GOSUB bee(TRUE)
  2470.           GOSUB swap_block
  2471.           GOSUB bee(FALSE)
  2472.           GOSUB affiche_c_pattern
  2473.           GOSUB aff_message("Track swapped.")
  2474.           ' ------------------------------------------------------------------
  2475.         ENDSELECT
  2476.         GOSUB affiche_icone_b(srt%,1,0,0,0)
  2477.       ENDSELECT
  2478.     ENDIF
  2479.   ENDIF
  2480. RETURN
  2481. PROCEDURE affiche_icones_tools2
  2482.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2483.   GOSUB cadre_int(20,35,19,69,13,13,14,12)
  2484.   GOSUB affiche_bloc_icones_b(0,11,11,0,0)
  2485.   GOSUB affchaine_trans("ECHO",42,37,14)
  2486.   GOSUB cadre_ext(ADD(divbi&(0,3,11),6),ADD(divbi&(1,3,11),2),1,5,0,13,12,14)
  2487.   GOSUB cadre_ext(ADD(divbi&(0,7,11),10),ADD(divbi&(1,7,11),2),2,5,0,13,12,14)
  2488.   GOSUB cadre_ext(ADD(divbi&(0,9,11),10),ADD(divbi&(1,9,11),2),2,5,0,13,12,14)
  2489.   GOSUB affiche_icones_toolsb2
  2490. RETURN
  2491. PROCEDURE affiche_icones_toolsb2
  2492.   GOSUB affiche_icone_b(2,11,0,0,bl_echo_cont!)
  2493.   GOSUB affiche_icone_b(6,11,0,0,bl_echo_fdbk!)
  2494.   GOSUB affiche_icone_b(8,11,0,0,NOT bl_echo_fdbk!)
  2495.   GOSUB affchaine_notrans(HEX$(bl_echo_lines%,2),ADD(divbi&(0,3,11),6),ADD(divbi&(1,3,11),2),1)
  2496.   GOSUB affchaine_notrans(STR$(bl_echo_feedback%,3),ADD(divbi&(0,7,11),10),ADD(divbi&(1,7,11),2),1)
  2497.   GOSUB affchaine_notrans("-"+HEX$(bl_echo_fadestep%,2),ADD(divbi&(0,9,11),10),ADD(divbi&(1,9,11),2),1)
  2498. RETURN
  2499. PROCEDURE gere_icones_tools2
  2500.   ' Les autres var. locales sont dans le tools1
  2501.   LOCAL flag_relachement!
  2502.   flag_relachement!=TRUE
  2503.   a%=V:divbi&(0,0,0)
  2504.   srt%=C:g_teste_icones%(L:a%,W:11,W:xm%,W:ym%)
  2505.   IF srt%>=0
  2506.     SELECT srt%
  2507.       ' Radio-boutons, Flip-flops ou champs de texte
  2508.       ' ----------------------------------------------------------------------
  2509.     CASE 2
  2510.       bl_echo_cont!=NOT bl_echo_cont!
  2511.       GOSUB affiche_icones_toolsb2
  2512.       ' ----------------------------------------------------------------------
  2513.     CASE 3              ! Lines
  2514.       GOSUB edite_chaine(HEX$(bl_echo_lines%,2),ADD(divbi&(0,3,11),6),ADD(divbi&(1,3,11),2),2,1)
  2515.       bl_echo_lines%=MIN(MAX(VAL("$"+bbbb$),1),&HFF)
  2516.       GOSUB affiche_icones_toolsb2
  2517.       ' ----------------------------------------------------------------------
  2518.     CASE 4,5            ! Lines +/-
  2519.       bl_echo_lines%=MIN(MAX(ADD(bl_echo_lines%,SUB(9,SHL(srt%,1))),1),&HFF)
  2520.       PAUSE SUB(6,SHL(km%,1))
  2521.       GOSUB affiche_icones_toolsb2
  2522.       flag_relachement!=FALSE
  2523.       ' ----------------------------------------------------------------------
  2524.     CASE 6              ! Flag feedback
  2525.       bl_echo_fdbk!=TRUE
  2526.       GOSUB affiche_icones_toolsb2
  2527.       ' ----------------------------------------------------------------------
  2528.     CASE 8              ! Flag fade
  2529.       bl_echo_fdbk!=FALSE
  2530.       GOSUB affiche_icones_toolsb2
  2531.       ' ----------------------------------------------------------------------
  2532.     CASE 7              ! Feedback
  2533.       GOSUB edite_chaine(STR$(bl_echo_feedback%,3),ADD(divbi&(0,7,11),10),ADD(divbi&(1,7,11),2),3,2)
  2534.       bl_echo_feedback%=MIN(MAX(VAL(bbbb$),1),100)
  2535.       GOSUB affiche_icones_toolsb2
  2536.       ' ----------------------------------------------------------------------
  2537.     CASE 9              ! Fade
  2538.       GOSUB edite_chaine(HEX$(bl_echo_fadestep%,2),ADD(divbi&(0,9,11),11),ADD(divbi&(1,9,11),2),2,1)
  2539.       bl_echo_fadestep%=MIN(MAX(VAL("$"+bbbb$),0),&HFF)
  2540.       GOSUB affiche_icones_toolsb2
  2541.       ' ----------------------------------------------------------------------
  2542.     DEFAULT
  2543.       ' Icones normales
  2544.       GOSUB affiche_icone_b(srt%,11,0,0,-1)
  2545.       GOSUB wait_mouse(TRUE)
  2546.       SELECT srt%
  2547.         ' --------------------------------------------------------------------
  2548.       CASE 0            ! .../...
  2549.         ss_menut%=3
  2550.         ' --------------------------------------------------------------------
  2551.       CASE 1            ! Echo
  2552.         GOSUB echo_block
  2553.         GOSUB affiche_c_pattern
  2554.         ' --------------------------------------------------------------------
  2555.       CASE 10           ! Volume slide
  2556.         GOSUB volume_slide(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  2557.         GOSUB affiche_c_pattern
  2558.         ' --------------------------------------------------------------------
  2559.       ENDSELECT
  2560.       GOSUB affiche_icone_b(srt%,11,0,0,0)
  2561.     ENDSELECT
  2562.     GOSUB wait_mouse(flag_relachement!)
  2563.     GOSUB vide_buffer_clavier
  2564.     IF ss_menut%=3
  2565.       GOSUB affiche_icones_tools3
  2566.     ENDIF
  2567.   ENDIF
  2568. RETURN
  2569. PROCEDURE affiche_icones_tools3
  2570.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2571.   GOSUB affiche_bloc_icones_b(0,6,18,0,0)
  2572.   GOSUB cadre_ext(divbi&(0,6,18),divbi&(1,6,18),21,59,0,13,12,14)
  2573.   GOSUB affchaine_trans("SONG",88,87,14)
  2574.   GOSUB affiche_icones_toolsb3
  2575. RETURN
  2576. PROCEDURE affiche_icones_toolsb3
  2577.   ' Var. locales de toolsb1
  2578.   song_list_pos%=MAX(MIN(song_list_pos%,SUB(FN song_length,10)),0)
  2579.   b%=song_list_pos%
  2580.   FOR a%=0 TO 9
  2581.     IF b%=songpos%
  2582.       c%=2
  2583.     ELSE
  2584.       c%=1
  2585.     ENDIF
  2586.     d%=32
  2587.     IF b%=FN song_repeat
  2588.       d%=253
  2589.     ENDIF
  2590.     IF b%<FN song_length
  2591.       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%)
  2592.     ELSE
  2593.       GOSUB affchaine_notrans(SPACE$(22),divbi&(0,ADD(a%,6),18),divbi&(1,ADD(a%,6),18),1)
  2594.     ENDIF
  2595.     INC b%
  2596.   NEXT a%
  2597. RETURN
  2598. PROCEDURE gere_icones_tools3
  2599.   ' Les autres var. locales sont dans tools1
  2600.   flag_relachement!=TRUE
  2601.   a%=V:divbi&(0,0,0)
  2602.   srt%=C:g_teste_icones%(L:a%,W:18,W:xm%,W:ym%)
  2603.   IF srt%>=0
  2604.     SELECT srt%
  2605.       ' Radio-boutons, Flip-flops ou champs de texte
  2606.       ' ----------------------------------------------------------------------
  2607.     CASE 0              ! .../...
  2608.       ' /sjx - there was a cosmetic bug here -- sorted
  2609.       GOSUB affiche_icone_b(srt%,18,0,0,-1)
  2610.       GOSUB wait_mouse(TRUE)
  2611.       ss_menut%=1
  2612.       GOSUB affiche_icones_tools
  2613.       ' ----------------------------------------------------------------------
  2614.     CASE 1              ! Up
  2615.       song_list_pos%=MAX(SUB(song_list_pos%,SUB(km%,MUL(km%=3,7))),0)       ! Pas de -1, -2 et -10
  2616.       GOSUB affiche_icones_toolsb3
  2617.       flag_relachement!=FALSE
  2618.       ' ----------------------------------------------------------------------
  2619.     CASE 2              ! Down
  2620.       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
  2621.       GOSUB affiche_icones_toolsb3
  2622.       flag_relachement!=FALSE
  2623.       ' ----------------------------------------------------------------------
  2624.     CASE 6 TO 15        ! Choix d'une position sur la liste
  2625.       IF km%=1                  ! Bouton gauche : changement de position
  2626.         songpos%=-1
  2627.         d%=MIN(ADD(song_list_pos%,SUB(srt%,5)),FN song_length)  ! songpos+1
  2628.         km%=1
  2629.         GOSUB chg_songpos
  2630.       ELSE                      ! Bonton droit : edition du nom du pattern
  2631.         a%=song&(MIN(ADD(song_list_pos%,SUB(srt%,6)),PRED(FN song_length)))
  2632.         GOSUB edite_chaine(FN patternname$(a%),ADD(divbi&(0,srt%,18),6),divbi&(1,srt%,18),16,0)
  2633.         GOSUB chg_patternname(bbbb$,a%)
  2634.         GOSUB affiche_icones_toolsb3
  2635.       ENDIF
  2636.       ' ----------------------------------------------------------------------
  2637.     DEFAULT
  2638.       ' Icones normales
  2639.       GOSUB affiche_icone_b(srt%,18,0,0,-1)
  2640.       GOSUB wait_mouse(TRUE)
  2641.       SELECT srt%
  2642.         ' --------------------------------------------------------------------
  2643.       CASE 3            ! Top
  2644.         song_list_pos%=0
  2645.         GOSUB affiche_icones_toolsb3
  2646.         ' --------------------------------------------------------------------
  2647.       CASE 4            ! Insert pos
  2648.         IF FN song_length<256
  2649.           GOSUB stop_voices
  2650.           IF songpos%<PRED(FN song_length)
  2651.             FOR i%=PRED(FN song_length) DOWNTO songpos%
  2652.               song&(SUCC(i%))=song&(i%)
  2653.             NEXT i%
  2654.           ENDIF
  2655.           INC module&(101)
  2656.           IF FN song_repeat>songpos%
  2657.             INC module&(102)
  2658.           ENDIF
  2659.           INC songpos%
  2660.           IF km%=2              ! Clic droit  : Nouveau pattern inutilise
  2661.             a%=0
  2662.             i%=0
  2663.             REPEAT
  2664.               IF a%=song&(i%)
  2665.                 INC a%
  2666.                 i%=-1
  2667.               ENDIF
  2668.               INC i%
  2669.             UNTIL i%=>FN song_length
  2670.             song&(songpos%)=a%
  2671.           ENDIF
  2672.           GOSUB affiche_info_song
  2673.           GOSUB affiche_c_pattern
  2674.         ENDIF
  2675.         ' --------------------------------------------------------------------
  2676.       CASE 5            ! Delete pos
  2677.         IF songpos%<PRED(FN song_length)
  2678.           FOR i%=SUCC(songpos%) TO PRED(FN song_length)
  2679.             song&(PRED(i%))=song&(i%)
  2680.           NEXT i%
  2681.           DEC module&(101)
  2682.           song&(FN song_length)=0
  2683.           IF FN song_repeat>songpos%
  2684.             DEC module&(102)
  2685.           ENDIF
  2686.           GOSUB affiche_info_song
  2687.           GOSUB affiche_c_pattern
  2688.         ENDIF
  2689.       ENDSELECT
  2690.       GOSUB affiche_icone_b(srt%,18,0,0,0)
  2691.       ' --------------------------------------------------------------------
  2692.     ENDSELECT
  2693.     GOSUB wait_mouse(flag_relachement!)
  2694.     GOSUB vide_buffer_clavier
  2695.   ENDIF
  2696. RETURN
  2697. ' Instrument
  2698. PROCEDURE affiche_icones_instr
  2699.   LOCAL i%
  2700.   IF ss_menui%=2
  2701.     GOSUB affiche_icones_instr2
  2702.   ELSE
  2703.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2704.     GOSUB affiche_bloc_icones_b(16,25,12,0,0)
  2705.     GOSUB affchaine_trans("ENVELOPES",130,42,14)
  2706.     GOSUB affchaine_trans("SAMPLE",41,92,14)
  2707.     GOSUB affchaine_trans("TRANSPOSE",69,92,14)
  2708.     GOSUB cadre_ext(divbi&(0,0,12),divbi&(1,0,12),1,47,0,13,12,14)
  2709.     GOSUB cadre_ext(divbi&(0,1,12),divbi&(1,1,12),11,47,0,13,12,14)
  2710.     GOSUB cadre_ext(ADD(divbi&(0,1,12),13),divbi&(1,1,12),2,47,0,13,12,14)
  2711.     GOSUB cadre_ext(ADD(divbi&(0,1,12),17),divbi&(1,1,12),2,47,0,13,12,14)
  2712.     FOR i%=18 TO 24 STEP 3
  2713.       GOSUB cadre_ext(ADD(divbi&(0,i%,12),7),ADD(divbi&(1,i%,12),2),2,5,0,13,12,14)
  2714.       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)
  2715.     NEXT i%
  2716.     GOSUB affiche_icones_instrb
  2717.   ENDIF
  2718. RETURN
  2719. PROCEDURE affiche_icones_instrb
  2720.   LOCAL a%,c%,i%,d%,a$
  2721.   IF ss_menui%=2
  2722.     GOSUB affiche_icones_instrb2
  2723.   ELSE
  2724.     instr_note_pos%=MAX(MIN(instr_note_pos%,127),24)
  2725.     instr_note_aff%=MAX(MIN(instr_note_aff%,instr_note_pos%),SUB(instr_note_pos%,7))
  2726.     GOSUB affiche_icone_b(41,12,0,0,instr_group!)
  2727.     FOR i%=0 TO 7
  2728.       d%=ADD(i%,instr_note_aff%)
  2729.       IF d%>127
  2730.         GOSUB affchaine_notrans("  ",divbi&(0,SHL(i%,1),12),divbi&(1,SHL(i%,1),12),c%)
  2731.         GOSUB affchaine_notrans(SPACE$(12),divbi&(0,SUCC(SHL(i%,1)),12),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2732.         GOSUB affchaine_notrans("   ",ADD(divbi&(0,SUCC(SHL(i%,1)),12),13),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2733.         GOSUB affchaine_notrans("   ",ADD(divbi&(0,SUCC(SHL(i%,1)),12),17),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2734.       ELSE
  2735.         IF d%=instr_note_pos%
  2736.           c%=2
  2737.         ELSE
  2738.           c%=1
  2739.         ENDIF
  2740.         a%=FN isample(instr%,d%)
  2741.         GOSUB affchaine_notrans(HEX$(a%,2),divbi&(0,SHL(i%,1),12),divbi&(1,SHL(i%,1),12),c%)
  2742.         GOSUB affchaine_notrans(LEFT$(FN samplename$(a%),12),divbi&(0,SUCC(SHL(i%,1)),12),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2743.         a%=FN itransp(instr%,d%)
  2744.         IF a%<0
  2745.           a$="-"
  2746.         ELSE
  2747.           a$="+"
  2748.         ENDIF
  2749.         a$=a$+STR$(ABS(a%),2)
  2750.         GOSUB affchaine_notrans(a$,ADD(divbi&(0,SUCC(SHL(i%,1)),12),13),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2751.         a$=MID$(gamme$,SUCC(SHL(d% MOD 12,1)),2)+STR$(SUB(DIV(d%,12),2),1)
  2752.         GOSUB affchaine_notrans(a$,ADD(divbi&(0,SUCC(SHL(i%,1)),12),17),divbi&(1,SUCC(SHL(i%,1)),12),c%)
  2753.       ENDIF
  2754.     NEXT i%
  2755.     '
  2756.     a%=MAX(FN ins_deb_zone(instr%,instr_note_pos%),24)
  2757.     a$=MID$(gamme$,SUCC(SHL(a% MOD 12,1)),2)+STR$(SUB(DIV(a%,12),2),1)
  2758.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,18,12),7),ADD(divbi&(1,18,12),2),1)
  2759.     a%=FN ins_fin_zone(instr%,instr_note_pos%)
  2760.     a$=MID$(gamme$,SUCC(SHL(a% MOD 12,1)),2)+STR$(SUB(DIV(a%,12),2),1)
  2761.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,21,12),7),ADD(divbi&(1,21,12),2),1)
  2762.     '
  2763.     GOSUB affchaine_notrans(HEX$(FN ivolume(instr%),3),ADD(divbi&(0,24,12),7),ADD(divbi&(1,24,12),2),1)
  2764.     IF FN ievol(instr%)>0
  2765.       GOSUB affchaine_notrans(HEX$(FN ievol(instr%),2),ADD(divbi&(0,27,12),7),ADD(divbi&(1,27,12),2),1)
  2766.     ELSE
  2767.       GOSUB affchaine_notrans(STRING$(2,5),ADD(divbi&(0,27,12),7),ADD(divbi&(1,27,12),2),1)
  2768.     ENDIF
  2769.     IF FN ieton(instr%)>0
  2770.       GOSUB affchaine_notrans(HEX$(FN ieton(instr%),2),ADD(divbi&(0,30,12),7),ADD(divbi&(1,30,12),2),1)
  2771.     ELSE
  2772.       GOSUB affchaine_notrans(STRING$(2,5),ADD(divbi&(0,30,12),7),ADD(divbi&(1,30,12),2),1)
  2773.     ENDIF
  2774.     IF FN iepan(instr%)>0
  2775.       GOSUB affchaine_notrans(HEX$(FN iepan(instr%),2),ADD(divbi&(0,33,12),7),ADD(divbi&(1,33,12),2),1)
  2776.     ELSE
  2777.       GOSUB affchaine_notrans(STRING$(2,5),ADD(divbi&(0,33,12),7),ADD(divbi&(1,33,12),2),1)
  2778.     ENDIF
  2779.   ENDIF
  2780. RETURN
  2781. PROCEDURE gere_icones_instr             !!!
  2782.   LOCAL a%,b%,c%,d%,i%,srt%
  2783.   LOCAL a$,b$
  2784.   LOCAL flag_relachement!
  2785.   IF ss_menui%=2
  2786.     GOSUB gere_icones_instr2
  2787.   ELSE
  2788.     flag_relachement!=TRUE
  2789.     a%=V:divbi&(0,0,0)
  2790.     srt%=C:g_teste_icones%(L:a%,W:12,W:xm%,W:ym%)
  2791.     IF srt%>=0
  2792.       SELECT srt%
  2793.         ' Radio-boutons, Flip-flops ou champs de texte
  2794.         ' --------------------------------------------------------------------
  2795.       CASE 0 TO 15      ! Numero de sample
  2796.         instr_note_pos%=MIN(ADD(instr_note_aff%,SHR(srt%,1)),127)
  2797.         GOSUB affiche_icones_instrb
  2798.         ' --------------------------------------------------------------------
  2799.       CASE 16,17        ! Haut/Bas
  2800.         a%=MUL(SUB(1,SHL(SUB(srt%,16),1)),SHL(1,PRED(km%)))
  2801.         instr_note_pos%=MAX(MIN(SUB(instr_note_pos%,a%),127),24)
  2802.         instr_note_aff%=MAX(MIN(instr_note_aff%,instr_note_pos%),SUB(instr_note_pos%,7))
  2803.         GOSUB affiche_icones_instrb
  2804.         flag_relachement!=FALSE
  2805.         ' --------------------------------------------------------------------
  2806.       CASE 18           ! From note
  2807.         '
  2808.         '
  2809.         '
  2810.         '
  2811.         ' --------------------------------------------------------------------
  2812.       CASE 19           ! +
  2813.         a%=FN ins_deb_zone(instr%,instr_note_pos%)
  2814.         IF a%>1 AND a%<instr_note_pos%
  2815.           b%=MIN(ADD(PRED(a%),SHL(1,PRED(km%))),PRED(instr_note_pos%))
  2816.           c%=FN isample(instr%,PRED(a%))
  2817.           d%=FN itransp(instr%,PRED(a%))
  2818.           FOR i%=a% TO b%
  2819.             GOSUB chg_ins_sample(instr%,i%,c%)
  2820.             GOSUB chg_ins_transp(instr%,i%,d%)
  2821.           NEXT i%
  2822.         ENDIF
  2823.         GOSUB affiche_icones_instrb
  2824.         ' --------------------------------------------------------------------
  2825.       CASE 20           ! -
  2826.         a%=FN ins_deb_zone(instr%,instr_note_pos%)
  2827.         IF a%>1
  2828.           b%=MAX(SUB(a%,SHL(1,PRED(km%))),1)
  2829.           c%=FN isample(instr%,instr_note_pos%)
  2830.           d%=FN itransp(instr%,instr_note_pos%)
  2831.           FOR i%=b% TO PRED(a%)
  2832.             GOSUB chg_ins_sample(instr%,i%,c%)
  2833.             GOSUB chg_ins_transp(instr%,i%,d%)
  2834.           NEXT i%
  2835.         ENDIF
  2836.         GOSUB affiche_icones_instrb
  2837.         ' --------------------------------------------------------------------
  2838.       CASE 21           ! To note
  2839.         '
  2840.         '
  2841.         '
  2842.         '
  2843.         ' --------------------------------------------------------------------
  2844.       CASE 22           ! +
  2845.         a%=FN ins_fin_zone(instr%,instr_note_pos%)
  2846.         IF a%<127
  2847.           b%=MIN(ADD(a%,SHL(1,PRED(km%))),127)
  2848.           c%=FN isample(instr%,instr_note_pos%)
  2849.           d%=FN itransp(instr%,instr_note_pos%)
  2850.           FOR i%=SUCC(a%) TO b%
  2851.             GOSUB chg_ins_sample(instr%,i%,c%)
  2852.             GOSUB chg_ins_transp(instr%,i%,d%)
  2853.           NEXT i%
  2854.         ENDIF
  2855.         GOSUB affiche_icones_instrb
  2856.         ' --------------------------------------------------------------------
  2857.       CASE 23           ! -
  2858.         a%=FN ins_fin_zone(instr%,instr_note_pos%)
  2859.         IF a%<127 AND a%>instr_note_pos%
  2860.           b%=MAX(SUB(SUCC(a%),SHL(1,PRED(km%))),SUCC(instr_note_pos%))
  2861.           c%=FN isample(instr%,SUCC(a%))
  2862.           d%=FN itransp(instr%,SUCC(a%))
  2863.           FOR i%=b% TO a%
  2864.             GOSUB chg_ins_sample(instr%,i%,c%)
  2865.             GOSUB chg_ins_transp(instr%,i%,d%)
  2866.           NEXT i%
  2867.         ENDIF
  2868.         GOSUB affiche_icones_instrb
  2869.         ' --------------------------------------------------------------------
  2870.       CASE 24           ! Volume
  2871.         GOSUB edite_chaine(HEX$(FN ivolume(instr%),3),ADD(divbi&(0,24,12),7),ADD(divbi&(1,24,12),2),3,1)
  2872.         GOSUB chg_ins_volume(instr%,MIN(MAX(VAL("$"+bbbb$),0),256))
  2873.         GOSUB affiche_icones_instrb
  2874.         ' --------------------------------------------------------------------
  2875.       CASE 25,26        ! +/-
  2876.         a%=MUL(SUB(1,SHL(SUB(srt%,25),1)),SHL(1,PRED(km%)))
  2877.         GOSUB chg_ins_volume(instr%,MAX(MIN(ADD(FN ivolume(instr%),a%),256),0))
  2878.         GOSUB affiche_icones_instrb
  2879.         IF km%=1
  2880.           PAUSE 6
  2881.         ENDIF
  2882.         flag_relachement!=FALSE
  2883.         ' --------------------------------------------------------------------
  2884.       CASE 27           ! Enveloppe de volume
  2885.         '
  2886.         '
  2887.         '
  2888.         '
  2889.         ' --------------------------------------------------------------------
  2890.       CASE 28,29        ! +/-
  2891.         a%=MUL(SUB(1,SHL(SUB(srt%,28),1)),SHL(1,PRED(km%)))
  2892.         GOSUB chg_ins_evol(instr%,MAX(MIN(ADD(FN ievol(instr%),a%),63),0))
  2893.         GOSUB affiche_icones_instrb
  2894.         IF km%=1
  2895.           PAUSE 6
  2896.         ENDIF
  2897.         flag_relachement!=FALSE
  2898.         ' --------------------------------------------------------------------
  2899.       CASE 30           ! Enveloppe de tonalite
  2900.         '
  2901.         '
  2902.         '
  2903.         '
  2904.         ' --------------------------------------------------------------------
  2905.       CASE 31,32        ! +/-
  2906.         a%=MUL(SUB(1,SHL(SUB(srt%,31),1)),SHL(1,PRED(km%)))
  2907.         GOSUB chg_ins_eton(instr%,MAX(MIN(ADD(FN ieton(instr%),a%),63),0))
  2908.         GOSUB affiche_icones_instrb
  2909.         IF km%=1
  2910.           PAUSE 6
  2911.         ENDIF
  2912.         flag_relachement!=FALSE
  2913.         ' --------------------------------------------------------------------
  2914.       CASE 33           ! Enveloppe de panning
  2915.         '
  2916.         '
  2917.         '
  2918.         '
  2919.         ' --------------------------------------------------------------------
  2920.       CASE 34,35        ! +/-
  2921.         a%=MUL(SUB(1,SHL(SUB(srt%,34),1)),SHL(1,PRED(km%)))
  2922.         GOSUB chg_ins_epan(instr%,MAX(MIN(ADD(FN iepan(instr%),a%),63),0))
  2923.         GOSUB affiche_icones_instrb
  2924.         IF km%=1
  2925.           PAUSE 6
  2926.         ENDIF
  2927.         flag_relachement!=FALSE
  2928.         ' --------------------------------------------------------------------
  2929.       CASE 36,37        ! +/- Sample
  2930.         a%=MUL(SUB(1,SHL(SUB(srt%,36),1)),SHL(1,PRED(km%)))
  2931.         a%=MAX(MIN(ADD(FN isample(instr%,instr_note_pos%),a%),255),1)
  2932.         IF instr_group!
  2933.           b%=FN ins_deb_zone(instr%,instr_note_pos%)
  2934.           c%=FN ins_fin_zone(instr%,instr_note_pos%)
  2935.         ELSE
  2936.           b%=instr_note_pos%
  2937.           c%=instr_note_pos%
  2938.         ENDIF
  2939.         FOR i%=b% TO c%
  2940.           GOSUB chg_ins_sample(instr%,i%,a%)
  2941.         NEXT i%
  2942.         GOSUB affiche_icones_instrb
  2943.         IF km%=1
  2944.           PAUSE 6
  2945.         ENDIF
  2946.         flag_relachement!=FALSE
  2947.         ' --------------------------------------------------------------------
  2948.       CASE 38,39        ! +/- Transpose
  2949.         a%=MUL(SUB(1,SHL(SUB(srt%,38),1)),SHL(1,PRED(km%)))
  2950.         b%=MAX(MIN(ADD(FN itransp(instr%,instr_note_pos%),a%),96),-96)
  2951.         IF instr_group!
  2952.           a%=FN ins_deb_zone(instr%,instr_note_pos%)
  2953.           c%=FN ins_fin_zone(instr%,instr_note_pos%)
  2954.         ELSE
  2955.           a%=instr_note_pos%
  2956.           c%=instr_note_pos%
  2957.         ENDIF
  2958.         FOR i%=a% TO c%
  2959.           GOSUB chg_ins_transp(instr%,i%,b%)
  2960.         NEXT i%
  2961.         GOSUB affiche_icones_instrb
  2962.         IF km%=1
  2963.           PAUSE 6
  2964.         ENDIF
  2965.         flag_relachement!=FALSE
  2966.         ' --------------------------------------------------------------------
  2967.       CASE 40           ! Liste des instruments
  2968.         GOSUB affiche_icone_b(srt%,12,0,0,-1)
  2969.         GOSUB wait_mouse(TRUE)
  2970.         ss_menui%=2
  2971.         GOSUB affiche_icones_instr
  2972.         ' --------------------------------------------------------------------
  2973.       CASE 41           ! Group
  2974.         instr_group!=NOT instr_group!
  2975.         GOSUB affiche_icones_instrb
  2976.         ' --------------------------------------------------------------------
  2977.       DEFAULT
  2978.         ' Icones normales
  2979.         GOSUB affiche_icone_b(srt%,12,0,0,-1)
  2980.         GOSUB wait_mouse(TRUE)
  2981.         SELECT srt%
  2982.         ENDSELECT
  2983.         GOSUB affiche_icone_b(srt%,12,0,0,0)
  2984.       ENDSELECT
  2985.       GOSUB wait_mouse(flag_relachement!)
  2986.       GOSUB vide_buffer_clavier
  2987.     ENDIF
  2988.   ENDIF
  2989. RETURN
  2990. PROCEDURE affiche_icones_instr2
  2991.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  2992.   GOSUB affiche_bloc_icones_b(0,7,13,0,0)
  2993.   GOSUB cadre_ext(divbi&(0,7,13),divbi&(1,7,13),30,59,0,13,12,14)
  2994.   GOSUB affchaine_trans("INSTRUMENT LIST",106,87,14)
  2995.   GOSUB affiche_icones_instrb2
  2996. RETURN
  2997. PROCEDURE affiche_icones_instrb2
  2998.   ' Var. locales de instrb1
  2999.   instr_list_pos%=MAX(MIN(instr_list_pos%,246),1)
  3000.   FOR a%=0 TO 9
  3001.     IF ADD(a%,instr_list_pos%)=instr%
  3002.       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)
  3003.     ELSE
  3004.       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)
  3005.     ENDIF
  3006.   NEXT a%
  3007. RETURN
  3008. PROCEDURE gere_icones_instr2            !!!
  3009.   ' Les autres var. locales sont dans instr1
  3010.   flag_relachement!=TRUE
  3011.   a%=V:divbi&(0,0,0)
  3012.   srt%=C:g_teste_icones%(L:a%,W:13,W:xm%,W:ym%)
  3013.   IF srt%>=0
  3014.     SELECT srt%
  3015.       ' Radio-boutons, Flip-flops ou champs de texte
  3016.       ' ----------------------------------------------------------------------
  3017.     CASE 0              ! Page 1
  3018.       GOSUB affiche_icone_b(srt%,13,0,0,-1)
  3019.       GOSUB wait_mouse(TRUE)
  3020.       ss_menui%=1
  3021.       GOSUB affiche_icones_instr
  3022.       ' ----------------------------------------------------------------------
  3023.     CASE 1              ! Up
  3024.       instr_list_pos%=MAX(SUB(instr_list_pos%,SUB(km%,MUL(km%=3,7))),1)         ! Pas de -1, -2 et -10
  3025.       GOSUB affiche_icones_instrb2
  3026.       flag_relachement!=FALSE
  3027.       ' ----------------------------------------------------------------------
  3028.     CASE 2              ! Down
  3029.       instr_list_pos%=MIN(ADD(instr_list_pos%,SUB(km%,MUL(km%=3,7))),246)       ! Pas de 1, 2 et 10
  3030.       GOSUB affiche_icones_instrb2
  3031.       flag_relachement!=FALSE
  3032.       ' ----------------------------------------------------------------------
  3033.     CASE 7 TO 16        ! Choix d'un sample sur la liste
  3034.       instr%=ADD(instr_list_pos%,SUB(srt%,7))
  3035.       GOSUB affiche_info_sample
  3036.       ' ----------------------------------------------------------------------
  3037.     DEFAULT
  3038.       ' Icones normales
  3039.       GOSUB affiche_icone_b(srt%,13,0,0,-1)
  3040.       GOSUB wait_mouse(TRUE)
  3041.       SELECT srt%
  3042.         ' --------------------------------------------------------------------
  3043.       CASE 3            ! Top
  3044.         instr_list_pos%=1
  3045.         GOSUB affiche_icones_instrb2
  3046.         ' --------------------------------------------------------------------
  3047.       CASE 4            ! Load instrument
  3048.         GOSUB stop_voices
  3049.         GOSUB load_instrument
  3050.         ' --------------------------------------------------------------------
  3051.       CASE 5            ! Load and replace samples
  3052.         GOSUB stop_voices
  3053.         b$=""
  3054.         FOR i%=1 TO 127                         ! Cherche tous les samples contenus dans l'instrument
  3055.           a%=FN isample(instr%,i%)
  3056.           IF a%<>0
  3057.             IF INSTR(b$,CHR$(a%))=0
  3058.               b$=b$+CHR$(a%)
  3059.             ENDIF
  3060.           ENDIF
  3061.         NEXT i%
  3062.         '
  3063.         '
  3064.         '
  3065.         '
  3066.         ' GOSUB chg_taille_sample(sample%,0)
  3067.         ' 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)
  3068.         ' BMOVE V:a$,FN adrsamchk(sample%),64
  3069.         '
  3070.         '
  3071.         '
  3072.         '
  3073.         ' --------------------------------------------------------------------
  3074.       CASE 6            ! Save instrument
  3075.         GOSUB save_instrument
  3076.         ' --------------------------------------------------------------------
  3077.       ENDSELECT
  3078.       GOSUB affiche_icone_b(srt%,13,0,0,0)
  3079.     ENDSELECT
  3080.     GOSUB wait_mouse(flag_relachement!)
  3081.     GOSUB vide_buffer_clavier
  3082.   ENDIF
  3083. RETURN
  3084. ' Sample
  3085. PROCEDURE affiche_icones_sample
  3086.   LOCAL i%
  3087.   IF ss_menus%=2
  3088.     GOSUB affiche_icones_sample2
  3089.   ELSE
  3090.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3091.     GOSUB affiche_bloc_icones_b(0,33,14,0,0)
  3092.     GOSUB cadre_ext(ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),1,5,0,13,12,14)
  3093.     GOSUB cadre_ext(ADD(divbi&(0,3,14),5),ADD(divbi&(1,3,14),2),27,5,0,13,12,14)
  3094.     GOSUB cadre_ext(ADD(divbi&(0,4,14),7),ADD(divbi&(1,4,14),2),5,5,0,13,12,14)
  3095.     GOSUB cadre_ext(ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),5,5,0,13,12,14)
  3096.     GOSUB cadre_ext(ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),5,5,0,13,12,14)
  3097.     GOSUB cadre_ext(ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),2,5,0,13,12,14)
  3098.     GOSUB cadre_ext(ADD(divbi&(0,16,14),9),ADD(divbi&(1,16,14),2),1,5,0,13,12,14)
  3099.     GOSUB cadre_ext(ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),2,5,0,13,12,14)
  3100.     GOSUB cadre_ext(ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),4,5,0,13,12,14)
  3101.     GOSUB cadre_ext(ADD(divbi&(0,25,14),13),ADD(divbi&(1,25,14),2),1,5,0,13,12,14)
  3102.     GOSUB cadre_ext(ADD(divbi&(0,32,14),12),ADD(divbi&(1,32,14),2),4,5,0,13,12,14)
  3103.     GOSUB affiche_icones_sampleb
  3104.     GOSUB affiche_icones_samplec
  3105.   ENDIF
  3106. RETURN
  3107. PROCEDURE affiche_icones_sampleb
  3108.   LOCAL a%,b%,c%,a$
  3109.   IF ss_menus%=2
  3110.     GOSUB affiche_icones_sampleb2
  3111.   ELSE
  3112.     GOSUB affchaine_notrans(HEX$(sample%,2),ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),1)
  3113.     GOSUB affchaine_notrans(FN samplename$(sample%),ADD(divbi&(0,3,14),5),ADD(divbi&(1,3,14),2),1)
  3114.     GOSUB affchaine_notrans(HEX$(FN length(sample%),6),ADD(divbi&(0,4,14),7),ADD(divbi&(1,4,14),2),1)
  3115.     GOSUB affchaine_notrans(HEX$(FN repeat(sample%),6),ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),1)
  3116.     GOSUB affchaine_notrans(HEX$(FN replen(sample%),6),ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),1)
  3117.     GOSUB affchaine_notrans(HEX$(FN volume(sample%),3),ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),1)
  3118.     GOSUB affchaine_notrans(STR$(FN freqech(sample%),5),ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),1)
  3119.     GOSUB affchaine_notrans(STR$(SHL(FN resol(sample%),3),2),ADD(divbi&(0,25,14),13),ADD(divbi&(1,25,14),2),1)
  3120.     a%=FN finetune(sample%)
  3121.     IF a%<0
  3122.       a$="-"+HEX$(ABS(a%),1)
  3123.     ELSE
  3124.       a$="+"+HEX$(a%,1)
  3125.     ENDIF
  3126.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,16,14),9),ADD(divbi&(1,16,14),2),1)
  3127.     IF FN autobal(sample%)>&HFFF
  3128.       a$="???"
  3129.     ELSE
  3130.       a$=HEX$(FN autobal(sample%),3)
  3131.     ENDIF
  3132.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),1)
  3133.   ENDIF
  3134. RETURN
  3135. PROCEDURE affiche_icones_samplec
  3136.   LOCAL a$
  3137.   a$=SPACE$(SUB(5,LEN(next_sample$)))+next_sample$
  3138.   GOSUB affchaine_notrans(a$,ADD(divbi&(0,32,14),12),ADD(divbi&(1,32,14),2),1)
  3139.   GOSUB affiche_icone_b(33,14,0,0,signe_sam%=0)
  3140. RETURN
  3141. PROCEDURE gere_icones_sample
  3142.   LOCAL a%,b%,c%,d%,srt%
  3143.   LOCAL a$
  3144.   LOCAL flag_relachement!
  3145.   IF ss_menus%=2
  3146.     GOSUB gere_icones_sample2
  3147.   ELSE
  3148.     flag_relachement!=TRUE
  3149.     a%=V:divbi&(0,0,0)
  3150.     srt%=C:g_teste_icones%(L:a%,W:14,W:xm%,W:ym%)
  3151.     IF srt%>=0
  3152.       SELECT srt%
  3153.         ' Radio-boutons, Flip-flops ou champs de texte
  3154.         ' --------------------------------------------------------------------
  3155.       CASE 0                      ! Sample
  3156.         d%=0
  3157.         GOSUB chg_s_sample
  3158.         ' --------------------------------------------------------------------
  3159.       CASE 1                      ! Sample +
  3160.         d%=1
  3161.         GOSUB chg_s_sample
  3162.         flag_relachement!=FALSE
  3163.         ' --------------------------------------------------------------------
  3164.       CASE 2                      ! Sample -
  3165.         d%=-1
  3166.         GOSUB chg_s_sample
  3167.         flag_relachement!=FALSE
  3168.         ' --------------------------------------------------------------------
  3169.       CASE 3                      ! Samplename
  3170.         GOSUB edite_chaine(FN samplename$(sample%),ADD(divbi&(0,3,14),5),ADD(divbi&(1,3,14),2),28,0)
  3171.         GOSUB chg_samplename(bbbb$,sample%)
  3172.         GOSUB affiche_icones_sampleb
  3173.         ' --------------------------------------------------------------------
  3174.       CASE 4,7,10,13,16,19,22     ! Edition des chiffres
  3175.         d%=0
  3176.         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
  3177.         ' --------------------------------------------------------------------
  3178.       CASE 5,8,11,14,17,20,23     ! +
  3179.         d%=1
  3180.         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
  3181.         flag_relachement!=FALSE
  3182.         ' --------------------------------------------------------------------
  3183.       CASE 6,9,12,15,18,21,24     ! -
  3184.         d%=-1
  3185.         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
  3186.         flag_relachement!=FALSE
  3187.         ' --------------------------------------------------------------------
  3188.       CASE 29                     ! List
  3189.         GOSUB affiche_icone_b(srt%,14,0,0,-1)
  3190.         GOSUB wait_mouse(TRUE)
  3191.         ss_menus%=2
  3192.         GOSUB affiche_icones_sample
  3193.         ' --------------------------------------------------------------------
  3194.       CASE 32
  3195.         a$="AVRSPLWAVVOC  *  "
  3196.         a%=INSTR(a$,RIGHT$(next_sample$,SUB(LEN(next_sample$),INSTR(next_sample$,"."))))
  3197.         IF a%>0
  3198.           a%=DIV(PRED(a%),3)
  3199.         ELSE
  3200.           a%=-1
  3201.         ENDIF
  3202.         a%=FN popup(1,a%,MOUSEX,MOUSEY)
  3203.         IF a%>=0
  3204.           a%=a% AND &HFFFF
  3205.           next_sample$="*."+TRIM$(MID$(a$,SUCC(MUL(a%,3)),3))
  3206.         ENDIF
  3207.         GOSUB affiche_icones_samplec
  3208.         ' --------------------------------------------------------------------
  3209.       CASE 33                     ! Signed
  3210.         signe_sam%=SUB(128,signe_sam%)
  3211.         GOSUB affiche_icones_samplec
  3212.         ' --------------------------------------------------------------------
  3213.       CASE 35 TO 39
  3214.         ' Rien
  3215.         ' --------------------------------------------------------------------
  3216.       DEFAULT
  3217.         ' Icones normales
  3218.         GOSUB affiche_icone_b(srt%,14,0,0,-1)
  3219.         GOSUB wait_mouse(TRUE)
  3220.         SELECT srt%
  3221.           ' ------------------------------------------------------------------
  3222.         CASE 25,26,27             ! Nbr de bits
  3223.           IF FN resol(sample%)=1      ! 8 -> 16 bits
  3224.             GOSUB dialog("CONVERT TO 16 BITS","DO YOU REALLY WANT|TO CONVERT SAMPLE #"+HEX$(sample%,2)+"|TO 16 BITS ?","YES|NO",xm%,ym%)
  3225.             IF bouton%=0
  3226.               GOSUB stop_voices
  3227.               GOSUB aff_message("Converting...")
  3228.               GOSUB bee(TRUE)
  3229.               a%=FN adresse(sample%)
  3230.               b%=FN length(sample%)
  3231.               IF b%>0
  3232.                 GOSUB chg_taille_sample(sample%,SHL(b%,1))
  3233.                 ~C:g_copy_sample_8_2_16%(L:a%,L:a%,L:b%)
  3234.                 GOSUB chg_sam_length(sample%,SHL(b%,1))
  3235.                 IF ADD(FN repeat(sample%),FN replen(sample%))>2
  3236.                   GOSUB chg_sam_repeat(sample%,SHL(FN repeat(sample%),1))
  3237.                   GOSUB chg_sam_replen(sample%,SHL(FN replen(sample%),1))
  3238.                 ENDIF
  3239.               ENDIF
  3240.               GOSUB chg_sam_nbits(sample%,2)
  3241.               ~C:rr_boucle_sample%(W:sample%)
  3242.               GOSUB aff_message("Sample # "+HEX$(sample%,2)+" converted to 16 bits.")
  3243.             ENDIF
  3244.           ELSE                        ! 16 -> 8 bits
  3245.             GOSUB dialog("CONVERT TO 8 BITS","DO YOU REALLY WANT|TO CONVERT SAMPLE #"+HEX$(sample%,2)+"|TO 8 BITS ?","YES|NO",xm%,ym%)
  3246.             IF bouton%=0
  3247.               GOSUB stop_voices
  3248.               GOSUB aff_message("Converting...")
  3249.               GOSUB bee(TRUE)
  3250.               a%=FN adresse(sample%)
  3251.               IF FN length(sample%)>0
  3252.                 b%=FN length(sample%) AND -4
  3253.                 ~C:g_copy_sample_16_2_8%(L:a%,L:a%,L:b%)
  3254.                 GOSUB chg_taille_sample(sample%,b%)
  3255.                 GOSUB chg_sam_length(sample%,SHR(b%,1) AND -2)
  3256.                 IF ADD(FN repeat(sample%),FN replen(sample%))>2
  3257.                   GOSUB chg_sam_repeat(sample%,SHR(FN repeat(sample%),1) AND -2)
  3258.                   GOSUB chg_sam_replen(sample%,SHR(FN replen(sample%),1) AND -2)
  3259.                 ENDIF
  3260.               ENDIF
  3261.               GOSUB chg_sam_nbits(sample%,1)
  3262.               ~C:rr_boucle_sample%(W:sample%)
  3263.               GOSUB aff_message("Sample # "+HEX$(sample%,2)+" converted to 8 bits.")
  3264.             ENDIF
  3265.           ENDIF
  3266.           GOSUB bee(FALSE)
  3267.           GOSUB affiche_icones_samplec
  3268.           ' ------------------------------------------------------------------
  3269.         CASE 28                   ! Kill sample
  3270.           GOSUB dialog("KILL SAMPLE","DO YOU REALLY WANT|TO KILL SAMPLE #"+HEX$(sample%,2)+" ?","YES|NO",xm%,ym%)
  3271.           IF bouton%=0
  3272.             GOSUB bee(TRUE)
  3273.             GOSUB kill_sample(sample%)
  3274.             GOSUB bee(FALSE)
  3275.             GOSUB affiche_info_sample
  3276.             GOSUB aff_message("SAMPLE #"+HEX$(sample%,2)+" KILLED BY DEATH...")
  3277.             GOSUB affiche_icones_samplec
  3278.           ENDIF
  3279.           ' ------------------------------------------------------------------
  3280.         CASE 30                   ! Load sample
  3281.           GOSUB load_sample(FALSE)
  3282.           ' ------------------------------------------------------------------
  3283.         CASE 31                   ! Save sample
  3284.           GOSUB save_sample(FALSE)
  3285.           ' ------------------------------------------------------------------
  3286.         ENDSELECT
  3287.         GOSUB affiche_icone_b(srt%,14,0,0,0)
  3288.       ENDSELECT
  3289.       GOSUB wait_mouse(flag_relachement!)
  3290.       GOSUB vide_buffer_clavier
  3291.     ENDIF
  3292.   ENDIF
  3293. RETURN
  3294. PROCEDURE affiche_icones_sample2
  3295.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3296.   GOSUB affiche_bloc_icones_b(0,5,15,0,0)
  3297.   GOSUB cadre_ext(divbi&(0,5,15),divbi&(1,5,15),30,59,0,13,12,14)
  3298.   GOSUB affchaine_trans("SAMPLE LIST",106,87,14)
  3299.   GOSUB affiche_icones_sampleb2
  3300. RETURN
  3301. PROCEDURE affiche_icones_sampleb2
  3302.   ' Var. locales de sampleb1
  3303.   sample_list_pos%=MAX(MIN(sample_list_pos%,246),1)
  3304.   b%=sample_list_pos%
  3305.   FOR a%=0 TO 9
  3306.     IF b%=sample%
  3307.       c%=2
  3308.     ELSE
  3309.       c%=1
  3310.     ENDIF
  3311.     IF FN length(b%)>0
  3312.       GOSUB affchaine_notrans(HEX$(b%,2)+CHR$(9)+FN samplename$(b%),divbi&(0,ADD(a%,5),15),divbi&(1,ADD(a%,5),15),c%)
  3313.     ELSE
  3314.       GOSUB affchaine_notrans(HEX$(b%,2)+" "+FN samplename$(b%),divbi&(0,ADD(a%,5),15),divbi&(1,ADD(a%,5),15),c%)
  3315.     ENDIF
  3316.     INC b%
  3317.   NEXT a%
  3318. RETURN
  3319. PROCEDURE gere_icones_sample2
  3320.   ' Les autres var. locales sont dans sample1
  3321.   flag_relachement!=TRUE
  3322.   a%=V:divbi&(0,0,0)
  3323.   srt%=C:g_teste_icones%(L:a%,W:15,W:xm%,W:ym%)
  3324.   IF srt%>=0
  3325.     SELECT srt%
  3326.       ' Radio-boutons, Flip-flops ou champs de texte
  3327.       ' ----------------------------------------------------------------------
  3328.     CASE 0              ! Page 1
  3329.       GOSUB affiche_icone_b(srt%,15,0,0,-1)
  3330.       GOSUB wait_mouse(TRUE)
  3331.       ss_menus%=1
  3332.       GOSUB affiche_icones_sample
  3333.       ' ----------------------------------------------------------------------
  3334.     CASE 1              ! Up
  3335.       sample_list_pos%=MAX(SUB(sample_list_pos%,SUB(km%,MUL(km%=3,7))),1)       ! Pas de -1, -2 et -10
  3336.       GOSUB affiche_icones_sampleb2
  3337.       flag_relachement!=FALSE
  3338.       ' ----------------------------------------------------------------------
  3339.     CASE 2              ! Down
  3340.       sample_list_pos%=MIN(ADD(sample_list_pos%,SUB(km%,MUL(km%=3,7))),246)     ! Pas de 1, 2 et 10
  3341.       GOSUB affiche_icones_sampleb2
  3342.       flag_relachement!=FALSE
  3343.       ' ----------------------------------------------------------------------
  3344.     CASE 5 TO 14        ! Choix d'un sample sur la liste
  3345.       sample%=ADD(sample_list_pos%,SUB(srt%,5))
  3346.       GOSUB affiche_info_sample
  3347.       ' ----------------------------------------------------------------------
  3348.     DEFAULT
  3349.       ' Icones normales
  3350.       GOSUB affiche_icone_b(srt%,15,0,0,-1)
  3351.       GOSUB wait_mouse(TRUE)
  3352.       SELECT srt%
  3353.         ' --------------------------------------------------------------------
  3354.       CASE 3            ! Top
  3355.         sample_list_pos%=1
  3356.         GOSUB affiche_icones_sampleb2
  3357.         ' --------------------------------------------------------------------
  3358.       CASE 4            ! Instrument
  3359.         IF km%=2 AND instr%<255
  3360.           a%=SUCC(instr%)
  3361.           GOSUB aff_message("Waiting : searching sample "+HEX$(sample%,2)+" from instrument "+HEX$(a%,2)+"...")
  3362.         ELSE
  3363.           a%=1
  3364.           GOSUB aff_message("Waiting : searching sample "+HEX$(sample%,2)+" from the first instrument...")
  3365.         ENDIF
  3366.         GOSUB bee(TRUE)
  3367.         b%=FN ins_cherche_sample(sample%,a%)
  3368.         GOSUB bee(FALSE)
  3369.         IF b%>0
  3370.           instr%=b%
  3371.           GOSUB aff_message("Sample "+HEX$(sample%,2)+" found in instrument "+HEX$(instr%,2)+".")
  3372.         ELSE
  3373.           GOSUB aff_message("Sample "+HEX$(sample%,2)+" not found.")
  3374.         ENDIF
  3375.         GOSUB affiche_info_sample
  3376.         ' --------------------------------------------------------------------
  3377.       ENDSELECT
  3378.       GOSUB affiche_icone_b(srt%,15,0,0,0)
  3379.     ENDSELECT
  3380.     GOSUB wait_mouse(flag_relachement!)
  3381.     GOSUB vide_buffer_clavier
  3382.   ENDIF
  3383. RETURN
  3384. ' Envelopes
  3385. PROCEDURE affiche_icones_enveloppe
  3386.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  3387.   GOSUB affiche_bloc_icones_b(30,19,17,0,0)
  3388.   GOSUB cadre_ext(divbi&(0,0,17),divbi&(1,0,17),3,59,0,13,12,14)
  3389.   GOSUB cadre_ext(divbi&(0,10,17),divbi&(1,10,17),15,59,0,13,12,14)
  3390.   GOSUB cadre_ext(divbi&(0,20,17),divbi&(1,20,17),10,59,0,13,12,14)
  3391.   GOSUB cadre_ext(ADD(divbi&(0,39,17),9),ADD(divbi&(1,39,17),2),1,5,0,13,12,14)
  3392.   GOSUB cadre_ext(SUCC(divbi&(0,43,17)),ADD(divbi&(1,43,17),2),19,5,0,13,12,14)
  3393.   GOSUB cadre_ext(SUCC(divbi&(0,46,17)),ADD(divbi&(1,46,17),2),1,5,0,13,12,14)
  3394.   GOSUB affiche_icones_enveloppeb
  3395. RETURN
  3396. PROCEDURE affiche_icones_enveloppeb
  3397.   env_num&=MIN(MAX(env_num&,0),63)
  3398.   env_copy&=MIN(MAX(env_copy&,0),63)
  3399.   GOSUB affchaine_notrans(HEX$(env_num&,2),ADD(divbi&(0,39,17),9),ADD(divbi&(1,39,17),2),1)
  3400.   GOSUB affchaine_notrans(FN envelopename$(env_num&,ss_menue%),SUCC(divbi&(0,43,17)),ADD(divbi&(1,43,17),2),1)
  3401.   GOSUB affchaine_notrans(HEX$(env_copy&,2),SUCC(divbi&(0,46,17)),ADD(divbi&(1,46,17),2),1)
  3402.   GOSUB affiche_icone_b(34,17,0,0,ss_menue%=0)
  3403.   GOSUB affiche_icone_b(35,17,0,0,ss_menue%=1)
  3404.   GOSUB affiche_icone_b(36,17,0,0,ss_menue%=2)
  3405.   GOSUB affiche_icone_b(37,17,0,0,env_sect&=0)
  3406.   GOSUB affiche_icone_b(38,17,0,0,env_sect&=1)
  3407.   GOSUB affiche_icones_enveloppec
  3408.   GOSUB affiche_icones_envelopped
  3409. RETURN
  3410. PROCEDURE affiche_icones_enveloppec
  3411.   ' Affichage de la liste des commandes
  3412.   LOCAL i%
  3413.   LOCAL a$
  3414.   env_codpos&=MIN(MAX(env_codpos&,0),PRED(env_codmax&(ss_menue%)))
  3415.   FOR i%=0 TO 9
  3416.     IF ADD(i%,env_codpos&)<env_codmax&(ss_menue%)
  3417.       a$=TRIM$(env_code$(env_conv&(ADD(i%,env_codpos&),ss_menue%)))
  3418.     ELSE
  3419.       a$=""
  3420.     ENDIF
  3421.     GOSUB affchaine_notrans(a$+SPACE$(SUB(11,LEN(a$))),divbi&(0,ADD(20,i%),17),divbi&(1,ADD(20,i%),17),1)
  3422.   NEXT i%
  3423. RETURN
  3424. PROCEDURE affiche_icones_envelopped
  3425.   LOCAL a%,b%,c%,i%,l%,p%
  3426.   LOCAL a$
  3427.   p%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,env_posaff&)
  3428.   IF p%<0
  3429.     env_posaff&=0
  3430.     env_poscurs&=0
  3431.     p%=0
  3432.   ENDIF
  3433.   a%=FN env_sectadr(env_num&,ss_menue%,env_sect&)
  3434.   l%=FN env_sectlen(env_num&,ss_menue%,env_sect&)
  3435.   env_poscurs&=MIN(MAX(env_poscurs&,env_posaff&),ADD(env_posaff&,9))
  3436.   FOR i%=0 TO 9
  3437.     IF ADD(env_posaff&,i%)=env_poscurs&
  3438.       a$=">"+STR$(ADD(env_posaff&,i%),3)
  3439.     ELSE IF p%<=l%
  3440.       a$=STR$(ADD(env_posaff&,i%),4)
  3441.     ELSE
  3442.       a$="    "
  3443.     ENDIF
  3444.     GOSUB affchaine_notrans(a$,divbi&(0,i%,17),divbi&(1,i%,17),1)
  3445.     IF p%<l%
  3446.       b%=BYTE{ADD(a%,p%)}
  3447.       c%=SUCC(ADD(a%,p%))
  3448.       a$=env_code$(b%)
  3449.       SELECT b%
  3450.       CASE &H2
  3451.         a$=a$+STR$(CARD{c%},5)
  3452.         ADD p%,3
  3453.       CASE &H1,&H2,&H4
  3454.         a$=a$+STR$(FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,CARD{c%}),3)
  3455.         ADD p%,3
  3456.       CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  3457.         a$=a$+HEX$(BYTE{c%},2)
  3458.         ADD p%,2
  3459.       CASE &H80,&HA0
  3460.         a$=a$+HEX$(CARD{c%},4)
  3461.         ADD p%,3
  3462.       CASE &HC0
  3463.         a$=a$+HEX$(CARD{c%},3)
  3464.         ADD p%,3
  3465.       CASE &H81,&HA1,&HC1
  3466.         a$=a$+FN hexasigne$(INT{c%},4)
  3467.         ADD p%,3
  3468.       DEFAULT
  3469.         INC p%
  3470.       ENDSELECT
  3471.       a$=a$+SPACE$(SUB(16,LEN(a$)))
  3472.       GOSUB affchaine_notrans(a$,divbi&(0,ADD(i%,10),17),divbi&(1,ADD(i%,10),17),1)
  3473.     ELSE
  3474.       GOSUB affchaine_notrans(SPACE$(16),divbi&(0,ADD(i%,10),17),divbi&(1,ADD(i%,10),17),1)
  3475.       INC p%
  3476.     ENDIF
  3477.   NEXT i%
  3478. RETURN
  3479. PROCEDURE gere_icones_enveloppe
  3480.   LOCAL a%,b%,c%,d%,e%,i%,srt%
  3481.   LOCAL flag_relachement!
  3482.   LOCAL a$
  3483.   flag_relachement!=TRUE
  3484.   a%=V:divbi&(0,0,0)
  3485.   srt%=C:g_teste_icones%(L:a%,W:17,W:xm%,W:ym%)
  3486.   IF srt%>=0
  3487.     SELECT srt%
  3488.       ' Radio-boutons, Flip-flops ou champs de texte
  3489.       ' ----------------------------------------------------------------------
  3490.     CASE 0 TO 9                 ! Numero de pas
  3491.       b%=FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,FN env_sectlen(env_num&,ss_menue%,env_sect&))
  3492.       env_poscurs&=MIN(MAX(ADD(env_posaff&,srt%),0),b%)
  3493.       GOSUB affiche_icones_envelopped
  3494.       ' ----------------------------------------------------------------------
  3495.     CASE 10 TO 19               ! Commande dans l'enveloppe : Edition du parametre
  3496.       a%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,ADD(env_posaff&,SUB(srt%,10)))
  3497.       IF a%>=0
  3498.         a%=ADD(FN env_sectadr(env_num&,ss_menue%,env_sect&),a%)
  3499.         b%=BYTE{a%}
  3500.         c%=ADD(divbi&(0,srt%,17),LEN(env_code$(b%)))
  3501.         d%=divbi&(1,srt%,17)
  3502.         INC a%
  3503.         SELECT b%
  3504.         CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2   ! Octet
  3505.           GOSUB edite_chaine(HEX$(BYTE{a%},2),c%,d%,2,1)
  3506.           BYTE{a%}=VAL("$"+bbbb$)
  3507.         CASE &H2                                                ! Mot decimal
  3508.           GOSUB edite_chaine(STR$(CARD{a%},5),c%,d%,5,2)
  3509.           CARD{a%}=MIN(MAX(VAL(bbbb$),0),32767)
  3510.         CASE &H1,&H4                                            ! Mot decimal (position) 999 maxi
  3511.           GOSUB edite_chaine(STR$(FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,CARD{a%}),3),c%,d%,3,2)
  3512.           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&)))
  3513.         CASE &H80,&HA0                                          ! Mot
  3514.           GOSUB edite_chaine(HEX$(CARD{a%},4),c%,d%,4,1)
  3515.           CARD{a%}=VAL("$"+bbbb$)
  3516.         CASE &HC0                                               ! Mot 3 chiffres
  3517.           GOSUB edite_chaine(HEX$(CARD{a%},3),c%,d%,3,1)
  3518.           CARD{a%}=VAL("$"+bbbb$)
  3519.         CASE &H81,&HA1,&HC1                                     ! Mot signe
  3520.           GOSUB edite_chaine(FN hexasigne$(INT{a%},4),c%,d%,5,0)
  3521.           INT{a%}=FN valhexasigne(bbbb$)
  3522.         DEFAULT
  3523.           GOTO gere_icone_env_gotopos
  3524.         ENDSELECT
  3525.       ELSE
  3526.       gere_icone_env_gotopos:
  3527.         b%=FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,FN env_sectlen(env_num&,ss_menue%,env_sect&))
  3528.         env_poscurs&=MIN(MAX(ADD(env_posaff&,SUB(srt%,10)),0),b%)
  3529.       ENDIF
  3530.       GOSUB affiche_icones_envelopped
  3531.       ' ----------------------------------------------------------------------
  3532.     CASE 20 TO 29               ! Commande dans la liste : insertion
  3533.       e%=ADD(env_codpos&,SUB(srt%,20))
  3534.       IF e%<env_codmax&(ss_menue%)
  3535.         GOSUB bee(TRUE)
  3536.         a%=env_conv&(e%,ss_menue%)              ! Numero de la commande a inserer
  3537.         b%=FN env_comlen(a%)                    ! Determination de la taille
  3538.         GOSUB chg_env_rellength(env_num&,ss_menue%,env_sect&,env_poscurs&,b%)
  3539.         d%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,env_poscurs&)
  3540.         c%=ADD(FN env_sectadr(env_num&,ss_menue%,env_sect&),d%)
  3541.         BYTE{c%}=a%
  3542.         IF b%=2
  3543.           BYTE{SUCC(c%)}=env_valdef&(e%,ss_menue%)
  3544.         ELSE IF b%=3
  3545.           CARD{SUCC(c%)}=env_valdef&(e%,ss_menue%)
  3546.         ENDIF
  3547.         GOSUB chg_env_adrjump(env_num&,ss_menue%,env_sect&,d%,b%)
  3548.         INC env_poscurs&
  3549.         env_posaff&=MAX(MIN(env_posaff&,env_poscurs&),SUB(env_poscurs&,9))
  3550.         GOSUB bee(FALSE)
  3551.         GOSUB affiche_icones_envelopped
  3552.       ENDIF
  3553.       ' ----------------------------------------------------------------------
  3554.     CASE 30,31                  ! Fleches de defilement de l'enveloppe
  3555.       a%=MUL(PRED(SHL(SUB(srt%,30),1)),SHL(1,PRED(km%)))
  3556.       b%=FN numcom_enveloppe(env_num&,ss_menue%,env_sect&,FN env_sectlen(env_num&,ss_menue%,env_sect&))
  3557.       env_poscurs&=MIN(MAX(ADD(env_poscurs&,a%),0),b%)
  3558.       env_posaff&=MAX(MIN(env_posaff&,env_poscurs&),SUB(env_poscurs&,9))
  3559.       GOSUB affiche_icones_envelopped
  3560.       flag_relachement!=FALSE
  3561.       ' ----------------------------------------------------------------------
  3562.     CASE 32,33                  ! Fleches de defilement des commandes
  3563.       env_codpos&=MIN(MAX(ADD(env_codpos&,PRED(SHL(SUB(srt%,32),1))),0),PRED(env_codmax&(ss_menue%)))
  3564.       GOSUB affiche_icones_enveloppec
  3565.       flag_relachement!=FALSE
  3566.       ' ----------------------------------------------------------------------
  3567.     CASE 34 TO 36               ! Type d'enveloppe
  3568.       ss_menue%=SUB(srt%,34)
  3569.       env_posaff&=0
  3570.       env_poscurs&=0
  3571.       env_codpos&=0
  3572.       GOSUB affiche_icones_enveloppeb
  3573.       ' ----------------------------------------------------------------------
  3574.     CASE 37,38                  ! Type de section
  3575.       env_sect&=SUB(srt%,37)
  3576.       env_posaff&=0
  3577.       env_poscurs&=0
  3578.       env_codpos&=0
  3579.       GOSUB affiche_icones_enveloppeb
  3580.       ' ----------------------------------------------------------------------
  3581.     CASE 39                     ! Numero de l'enveloppe
  3582.       GOSUB edite_chaine(HEX$(env_num&,2),ADD(divbi&(0,39,17),9),ADD(divbi&(1,39,17),2),2,1)
  3583.       env_num&=MIN(MAX(VAL("$"+bbbb$),1),63)
  3584.       env_poscurs&=0
  3585.       env_posaff&=0
  3586.       GOSUB affiche_icones_enveloppeb
  3587.       ' ----------------------------------------------------------------------
  3588.     CASE 40,41                  ! Enveloppe +/-
  3589.       env_num&=MAX(MIN(ADD(env_num&,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,40),km%))),63),1)
  3590.       env_poscurs&=0
  3591.       env_posaff&=0
  3592.       GOSUB affiche_icones_enveloppeb
  3593.       IF km%=1
  3594.         PAUSE 2
  3595.       ENDIF
  3596.       flag_relachement!=FALSE
  3597.       ' ----------------------------------------------------------------------
  3598.     CASE 43                     ! Nom de l'enveloppe
  3599.       GOSUB edite_chaine(FN envelopename$(env_num&,ss_menue%),SUCC(divbi&(0,43,17)),ADD(divbi&(1,43,17),2),20,0)
  3600.       GOSUB chg_envelopename(bbbb$,env_num&,ss_menue%)
  3601.       GOSUB affiche_icones_enveloppeb
  3602.       ' ----------------------------------------------------------------------
  3603.     CASE 46                     ! Numero de Copy
  3604.       GOSUB edite_chaine(HEX$(env_copy&,2),SUCC(divbi&(0,46,17)),ADD(divbi&(1,46,17),2),2,1)
  3605.       env_copy&=MIN(MAX(VAL("$"+bbbb$),1),63)
  3606.       GOSUB affiche_icones_enveloppeb
  3607.       ' ----------------------------------------------------------------------
  3608.     CASE 47,48                  ! Copy +/-
  3609.       env_copy&=MAX(MIN(ADD(env_copy&,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,47),km%))),63),1)
  3610.       GOSUB affiche_icones_enveloppeb
  3611.       IF km%=1
  3612.         PAUSE 2
  3613.       ENDIF
  3614.       flag_relachement!=FALSE
  3615.       ' ----------------------------------------------------------------------
  3616.     DEFAULT
  3617.       ' Icones normales
  3618.       GOSUB affiche_icone_b(srt%,17,0,0,-1)
  3619.       GOSUB wait_mouse(TRUE)
  3620.       SELECT srt%
  3621.         ' --------------------------------------------------------------------
  3622.       CASE 42                   ! Clear Envelope
  3623.         a$=MID$("volume tone   panning",SUCC(MUL(ss_menue%,7)),7)
  3624.         GOSUB dialog("CLEAR ENVELOPE","Do you want to clear|"+a$+" envelope #"+HEX$(env_num&,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  3625.         IF bouton%=0
  3626.           GOSUB bee(TRUE)
  3627.           GOSUB chg_env_length(env_num&,ss_menue%,0,1)
  3628.           GOSUB chg_env_length(env_num&,ss_menue%,1,1)
  3629.           GOSUB chg_envelopename("",env_num&,ss_menue%)
  3630.           env_poscurs&=0
  3631.           env_posaff&=0
  3632.           GOSUB bee(FALSE)
  3633.           GOSUB affiche_icones_envelopped
  3634.           GOSUB aff_message(a$+" envelope "+HEX$(env_num&,2)+" cleared.")
  3635.         ENDIF
  3636.         ' --------------------------------------------------------------------
  3637.       CASE 44                   ! Delete Command
  3638.         d%=FN pos_enveloppe(env_num&,ss_menue%,env_sect&,env_poscurs&)
  3639.         IF d%>=0
  3640.           GOSUB bee(TRUE)
  3641.           IF FN pos_enveloppe(env_num&,ss_menue%,env_sect&,1)>=0
  3642.             b%=ADD(FN env_sectadr(env_num&,ss_menue%,env_sect&),d%)
  3643.             a%=BYTE{b%}
  3644.             b%=FN env_comlen(a%)                ! Determination de la taille
  3645.             GOSUB chg_env_rellength(env_num&,ss_menue%,env_sect&,env_poscurs&,-b%)
  3646.             GOSUB chg_env_adrjump(env_num&,ss_menue%,env_sect&,d%,-b%)
  3647.           ELSE
  3648.             GOSUB chg_env_length(env_num&,ss_menue%,env_sect&,1)        ! End obligatoire si aucune commande
  3649.           ENDIF
  3650.           GOSUB bee(FALSE)
  3651.         ENDIF
  3652.         GOSUB affiche_icones_envelopped
  3653.         ' --------------------------------------------------------------------
  3654.       CASE 45                   ! Copy Envelope
  3655.         IF env_num&<>env_copy&
  3656.           a$=MID$("volume tone   panning",SUCC(MUL(ss_menue%,7)),7)
  3657.           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)
  3658.           IF bouton%=0
  3659.             GOSUB bee(TRUE)
  3660.             FOR i%=0 TO 1
  3661.               b%=FN env_sectlen(env_copy&,ss_menue%,i%)
  3662.               GOSUB chg_env_length(env_num&,ss_menue%,i%,b%)
  3663.               a%=FN env_sectadr(env_copy&,ss_menue%,i%)
  3664.               BMOVE a%,FN env_sectadr(env_num&,ss_menue%,i%),b%
  3665.             NEXT i%
  3666.             GOSUB chg_envelopename(FN envelopename$(env_copy&,ss_menue%),env_num&,ss_menue%)
  3667.             env_poscurs&=0
  3668.             env_posaff&=0
  3669.             GOSUB aff_message(a$+" envelope "+HEX$(env_copy&,2)+" copied to envelope "+HEX$(env_num&,2)+".")
  3670.             GOSUB bee(FALSE)
  3671.             GOSUB affiche_icones_envelopped
  3672.           ENDIF
  3673.         ENDIF
  3674.         ' --------------------------------------------------------------------
  3675.       ENDSELECT
  3676.       GOSUB affiche_icone_b(srt%,17,0,0,0)
  3677.     ENDSELECT
  3678.     GOSUB wait_mouse(flag_relachement!)
  3679.     GOSUB vide_buffer_clavier
  3680.   ENDIF
  3681. RETURN
  3682. ' Control
  3683. PROCEDURE affiche_icones_control
  3684.   LOCAL i%
  3685.   IF ss_menuc%=2
  3686.     GOSUB affiche_icones_control2
  3687.   ELSE
  3688.     GOSUB cadre_int(20,35,14,69,13,13,14,12)
  3689.     GOSUB cadre_int(35,35,15,39,13,13,14,12)
  3690.     GOSUB cadre_int(35,75,15,29,13,13,14,12)
  3691.     GOSUB cadre_int(51,35,28,69,13,13,14,12)
  3692.     GOSUB affchaine_trans("PANNING",72,42,14)
  3693.     GOSUB affiche_bloc_icones_b(0,2,25,0,0)
  3694.     GOSUB affiche_bloc_icones_b(8,6,25,0,0)
  3695.     GOSUB cadre_ext(ADD(divbi&(0,8,25),6),ADD(divbi&(1,8,25),2),2,5,0,13,12,14)
  3696.     GOSUB cadre_ext(ADD(divbi&(0,11,25),6),ADD(divbi&(1,11,25),2),2,5,0,13,12,14)
  3697.     FOR i%=18 TO 46 STEP 4
  3698.       GOSUB cadre_ext(divbi&(0,i%,25),divbi&(1,i%,25),divbi&(2,i%,25),divbi&(3,i%,25),0,13,12,14)
  3699.       GOSUB affiche_bloc_icones_b(SUCC(i%),2,25,0,0)
  3700.       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)
  3701.     NEXT i%
  3702.     GOSUB affiche_icones_controlb
  3703.   ENDIF
  3704. RETURN
  3705. PROCEDURE affiche_icones_controlb
  3706.   LOCAL i%,n%,t%
  3707.   IF ss_menuc%=2
  3708.     GOSUB affiche_icones_controlb2
  3709.   ELSE
  3710.     FOR i%=0 TO 3
  3711.       GOSUB affiche_icone_b(ADD(14,i%),25,0,0,i%=ss_menuc_npan%)
  3712.     NEXT i%
  3713.     FOR i%=0 TO 7
  3714.       n%=ADD(MUL(i%,4),21)
  3715.       t%=ADD(SHL(ss_menuc_npan%,3),i%)
  3716.       GOSUB cadre_int(divbi&(0,n%,25),divbi&(1,ADD(18,MUL(i%,4)),25),1,5,13,13,13,13)
  3717.       GOSUB affchaine_trans(STR$(SUCC(t%),2),SHL(divbi&(0,n%,25),1),divbi&(1,ADD(18,MUL(i%,4)),25),14)
  3718.     NEXT i%
  3719.     GOSUB affiche_icones_controlc(TRUE)
  3720.     GOSUB affiche_icones_controld(TRUE)
  3721.   ENDIF
  3722. RETURN
  3723. PROCEDURE affiche_icones_controlc(update!)
  3724.   LOCAL a%
  3725.   a%=FN mod_tempo
  3726.   IF a%<>control_old%(8) OR update!
  3727.     GOSUB affchaine_notrans(STR$(a%,3),ADD(divbi&(0,8,25),6),ADD(divbi&(1,8,25),2),1)
  3728.     control_old%(8)=a%
  3729.   ENDIF
  3730.   a%=CARD{r_mod_speed%}
  3731.   IF a%<>control_old%(9) OR update!
  3732.     GOSUB affchaine_notrans(STR$(a%,3),ADD(divbi&(0,11,25),6),ADD(divbi&(1,11,25),2),1)
  3733.     control_old%(9)=a%
  3734.   ENDIF
  3735. RETURN
  3736. PROCEDURE affiche_icones_controld(update!)
  3737.   '
  3738.   ' Les pannings
  3739.   ' ------------
  3740.   LOCAL i%,n%,p%
  3741.   FOR i%=0 TO 7
  3742.     p%=FN balance(ADD(SHL(ss_menuc_npan%,3),i%))
  3743.     IF p%<>control_old%(i%) OR update!
  3744.       n%=ADD(MUL(i%,4),21)
  3745.       GOSUB affchaine_notrans(HEX$(p%,3),divbi&(0,SUB(n%,3),25),divbi&(1,SUB(n%,3),25),1)
  3746.       GOSUB affiche_slider_h(divbi&(0,n%,25),divbi&(1,n%,25),divbi&(2,n%,25),p%,4095)
  3747.       control_old%(i%)=p%
  3748.     ENDIF
  3749.   NEXT i%
  3750. RETURN
  3751. PROCEDURE gere_icones_control
  3752.   LOCAL a%,b%,c%,srt%
  3753.   LOCAL flag_relachement!
  3754.   LOCAL a$
  3755.   IF ss_menuc%=2
  3756.     GOSUB gere_icones_control2
  3757.   ELSE
  3758.     flag_relachement!=TRUE
  3759.     a%=V:divbi&(0,0,0)
  3760.     srt%=C:g_teste_icones%(L:a%,W:25,W:xm%,W:ym%)
  3761.     IF srt%>=0
  3762.       SELECT srt%
  3763.         ' Radio-boutons, Flip-flops ou champs de texte
  3764.         ' ----------------------------------------------------------------------
  3765.       CASE 8      ! Tempo
  3766.         a%=FN mod_tempo
  3767.         GOSUB edite_chaine(STR$(a%,3),ADD(divbi&(0,srt%,25),6),ADD(divbi&(1,srt%,25),2),3,2)
  3768.         a%=MIN(MAX(VAL(bbbb$),1),999)
  3769.         GOSUB chg_tempo(a%)
  3770.         GOSUB affiche_icones_controlc(TRUE)
  3771.         ' ----------------------------------------------------------------------
  3772.       CASE 9,10   ! Tempo +/-
  3773.         a%=FN mod_tempo
  3774.         a%=MAX(MIN(ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%))),999),1)
  3775.         GOSUB chg_tempo(a%)
  3776.         GOSUB affiche_icones_controlc(TRUE)
  3777.         IF km%=1
  3778.           PAUSE 8
  3779.         ENDIF
  3780.         flag_relachement!=FALSE
  3781.         ' ----------------------------------------------------------------------
  3782.       CASE 11     ! Speed
  3783.         a%=FN mod_speed
  3784.         GOSUB edite_chaine(STR$(a%,3),ADD(divbi&(0,srt%,25),6),ADD(divbi&(1,srt%,25),2),3,2)
  3785.         a%=MIN(MAX(VAL(bbbb$),1),255)
  3786.         GOSUB chg_speed(a%)
  3787.         GOSUB affiche_icones_controlc(TRUE)
  3788.         ' ----------------------------------------------------------------------
  3789.       CASE 12,13  ! Speed +/-
  3790.         a%=FN mod_speed
  3791.         a%=MAX(MIN(ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,12),km%))),255),1)
  3792.         GOSUB chg_speed(a%)
  3793.         GOSUB affiche_icones_controlc(TRUE)
  3794.         IF km%=1
  3795.           PAUSE 8
  3796.         ENDIF
  3797.         flag_relachement!=FALSE
  3798.         ' ----------------------------------------------------------------------
  3799.       CASE 14 TO 17       ! Numero de plage des pannings
  3800.         ss_menuc_npan%=SUB(srt%,14)
  3801.         GOSUB affiche_icones_controlb
  3802.         ' ----------------------------------------------------------------------
  3803.       CASE 18,22,26,30,34,38,42,46                                ! Valeur Panning
  3804.         b%=ADD(SHL(ss_menuc_npan%,3),DIV(SUB(srt%,18),4))
  3805.         a%=FN balance(b%)
  3806.         GOSUB edite_chaine(HEX$(a%,3),divbi&(0,srt%,25),divbi&(1,srt%,25),3,1)
  3807.         a%=MIN(MAX(VAL("$"+bbbb$),0),4095)
  3808.         GOSUB chg_t_balance(b%,a%)
  3809.         GOSUB affiche_icones_controld(TRUE)
  3810.         ' ----------------------------------------------------------------------
  3811.       CASE 19,20,23,24,27,28,31,32,35,36,39,40,43,44,47,48        ! Panning +/-
  3812.         SELECT km%
  3813.         CASE 1
  3814.           c%=1
  3815.         CASE 2
  3816.           c%=&H10
  3817.         CASE 3
  3818.           c%=&H80
  3819.         ENDSELECT
  3820.         b%=ADD(SHL(ss_menuc_npan%,3),DIV(SUB(srt%,19),4))
  3821.         a%=FN balance(b%)
  3822.         a%=MAX(MIN(ADD(a%,SUB(MUL(SUB(srt%,19) MOD 4,SHL(c%,1)),c%)),4095),0)
  3823.         GOSUB chg_t_balance(b%,a%)
  3824.         GOSUB affiche_icones_controlc(TRUE)
  3825.         IF km%=1
  3826.           PAUSE 6
  3827.         ENDIF
  3828.         flag_relachement!=FALSE
  3829.         GOSUB affiche_icones_controld(FALSE)
  3830.         ' ----------------------------------------------------------------------
  3831.       CASE 21,25,29,33,37,41,45,49                                ! Slider Panning
  3832.         a%=MIN(4095,MUL(4095,SUB(xm%,SHL(divbi&(0,srt%,25),3)))/ADD(SHL(divbi&(2,srt%,25),3),6)+0.999)
  3833.         b%=ADD(SHL(ss_menuc_npan%,3),DIV(SUB(srt%,21),4))
  3834.         GOSUB chg_t_balance(b%,a%)
  3835.         GOSUB affiche_icones_controld(FALSE)
  3836.         flag_relachement!=FALSE
  3837.         ' ----------------------------------------------------------------------
  3838.       CASE 2 TO 7       ! Rien de rien...
  3839.         ' ----------------------------------------------------------------------
  3840.       DEFAULT
  3841.         ' Icones normales
  3842.         GOSUB affiche_icone_b(srt%,25,0,0,-1)
  3843.         GOSUB wait_mouse(TRUE)
  3844.         SELECT srt%
  3845.           ' --------------------------------------------------------------------
  3846.         CASE 0    ! Page suivante
  3847.           ss_menuc%=2
  3848.           GOSUB affiche_icones_control
  3849.           ' --------------------------------------------------------------------
  3850.         CASE 1    ! Reset des balances
  3851.           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)
  3852.           IF bouton%=0
  3853.             GOSUB balance_reset
  3854.           ELSE IF bouton%=1
  3855.             a$=STRING$(32,MKI$(&H800))
  3856.             GOSUB set_balance(a$)
  3857.           ENDIF
  3858.           GOSUB affiche_icones_controlb
  3859.           ' --------------------------------------------------------------------
  3860.         ENDSELECT
  3861.         IF ss_menuc%=1
  3862.           GOSUB affiche_icone_b(srt%,25,0,0,0)
  3863.         ENDIF
  3864.       ENDSELECT
  3865.       GOSUB wait_mouse(flag_relachement!)
  3866.       GOSUB vide_buffer_clavier
  3867.     ENDIF
  3868.   ENDIF
  3869. RETURN
  3870. PROCEDURE affiche_icones_control2
  3871.   LOCAL i%
  3872.   GOSUB cadre_int(20,35,9,69,13,13,14,12)
  3873.   GOSUB cadre_int(30,35,4,69,13,13,14,12)
  3874.   GOSUB cadre_int(35,35,19,39,13,13,14,12)
  3875.   GOSUB cadre_int(35,75,19,29,13,13,14,12)
  3876.   GOSUB cadre_int(55,35,24,69,13,13,14,12)
  3877.   GOSUB affchaine_trans("L    R",44,37,14)
  3878.   GOSUB affchaine_trans("M",64,37,14)
  3879.   GOSUB affchaine_trans("VOLUME",72,42,14)
  3880.   FOR i%=2 TO 7
  3881.     GOSUB cadre_ext(divbi&(0,i%,31),divbi&(1,i%,31),divbi&(2,i%,31),divbi&(3,i%,31),0,13,12,14)
  3882.   NEXT i%
  3883.   GOSUB affiche_bloc_icones_b(0,2,31,0,0)
  3884.   FOR i%=12 TO 19
  3885.     GOSUB cadre_ext(divbi&(0,i%,31),divbi&(1,i%,31),divbi&(2,i%,31),divbi&(3,i%,31),0,13,12,14)
  3886.   NEXT i%
  3887.   GOSUB affiche_icones_controlb
  3888. RETURN
  3889. PROCEDURE affiche_icones_controlb2
  3890.   LOCAL i%,n%,t%
  3891.   FOR i%=0 TO 3
  3892.     GOSUB affiche_icone_b(ADD(8,i%),31,0,0,i%=ss_menuc2_nvol%)
  3893.   NEXT i%
  3894.   FOR i%=0 TO 7
  3895.     n%=ADD(i%,12)
  3896.     t%=ADD(SHL(ss_menuc2_nvol%,3),i%)
  3897.     GOSUB cadre_int(divbi&(0,n%,31),SUB(divbi&(1,n%,31),8),1,5,13,13,13,13)
  3898.     GOSUB affchaine_trans(STR$(SUCC(t%),2),SHL(divbi&(0,n%,31),1),SUB(divbi&(1,n%,31),8),14)
  3899.   NEXT i%
  3900.   GOSUB affiche_icones_controlc2(TRUE)
  3901.   GOSUB affiche_icones_controld2(TRUE)
  3902. RETURN
  3903. PROCEDURE affiche_icones_controlc2(update!)
  3904.   '
  3905.   ' Les volumes generaux
  3906.   ' --------------------
  3907.   LOCAL v%
  3908.   ' Left du CoDec
  3909.   v%=SUB(15,PEEK(&HFFFF893A) AND 15)
  3910.   IF v%<>control_old%(10) OR update!
  3911.     GOSUB affchaine_notrans(STR$(v%,3),divbi&(0,3,25),divbi&(1,3,25),1)
  3912.     GOSUB affiche_slider_v(divbi&(0,2,25),divbi&(1,2,25),divbi&(2,2,25),divbi&(3,2,25),v%,15)
  3913.     control_old%(10)=v%
  3914.   ENDIF
  3915.   ' Right du CoDec
  3916.   v%=SUB(15,SHR(PEEK(&HFFFF893B),4))
  3917.   IF v%<>control_old%(11) OR update!
  3918.     GOSUB affchaine_notrans(STR$(v%,3),divbi&(0,5,25),divbi&(1,5,25),1)
  3919.     GOSUB affiche_slider_v(divbi&(0,4,25),divbi&(1,4,25),divbi&(2,4,25),divbi&(3,4,25),v%,15)
  3920.     control_old%(11)=v%
  3921.   ENDIF
  3922.   ' Master du sountracker
  3923.   v%=CARD{r_master_vol%}
  3924.   IF v%<>control_old%(12) OR update!
  3925.     GOSUB affchaine_notrans(HEX$(v%,3),divbi&(0,7,25),divbi&(1,7,25),1)
  3926.     GOSUB affiche_slider_v(divbi&(0,6,25),divbi&(1,6,25),divbi&(2,6,25),divbi&(3,6,25),v%,4095)
  3927.     control_old%(12)=v%
  3928.   ENDIF
  3929. RETURN
  3930. PROCEDURE affiche_icones_controld2(update!)
  3931.   '
  3932.   ' Les volumes exponentiels de chaque voie
  3933.   ' ---------------------------------------
  3934.   ' Affichage entre $800 et $E00
  3935.   LOCAL i%,n%,p%,v%,v2%
  3936.   FOR i%=0 TO 7
  3937.     v%=FN track_volume_exp(ADD(SHL(ss_menuc2_nvol%,3),i%))
  3938.     p%=ADD(i%,12)
  3939.     IF v%<>control_old%(ADD(i%,13)) OR update!
  3940.       v2%=MAX(MIN(SUB(v%,&H800),&H600),0)
  3941.       n%=ADD(MUL(i%,4),21)
  3942.       GOSUB affiche_slider_v(divbi&(0,p%,31),divbi&(1,p%,31),divbi&(2,p%,31),divbi&(3,p%,31),v2%,&H600)
  3943.       control_old%(ADD(i%,13))=v%
  3944.     ENDIF
  3945.   NEXT i%
  3946. RETURN
  3947. PROCEDURE gere_icones_control2
  3948.   LOCAL a%,b%,c%,srt%
  3949.   LOCAL flag_relachement!
  3950.   LOCAL a$
  3951.   flag_relachement!=TRUE
  3952.   a%=V:divbi&(0,0,0)
  3953.   srt%=C:g_teste_icones%(L:a%,W:31,W:xm%,W:ym%)
  3954.   IF srt%>=0
  3955.     SELECT srt%
  3956.       ' Radio-boutons, Flip-flops ou champs de texte
  3957.       ' ----------------------------------------------------------------------
  3958.     CASE 2      ! Slider Left amplification
  3959.       a%=MUL(15,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  3960.       SPOKE &HFFFF893A,SUB(15,a%)
  3961.       GOSUB affiche_icones_controlc2(FALSE)
  3962.       flag_relachement!=FALSE
  3963.       ' ----------------------------------------------------------------------
  3964.     CASE 3      ! Valeur Left amplification
  3965.       a%=SUB(15,PEEK(&HFFFF893A) AND 15)
  3966.       GOSUB edite_chaine(STR$(a%,3),divbi&(0,srt%,31),divbi&(1,srt%,31),3,2)
  3967.       a%=MIN(MAX(VAL(bbbb$),0),15)
  3968.       SPOKE &HFFFF893A,SUB(15,a%)
  3969.       GOSUB affiche_icones_controlc2(TRUE)
  3970.       ' ----------------------------------------------------------------------
  3971.     CASE 4      ! Slider Right amplification
  3972.       a%=MUL(15,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  3973.       SPOKE &HFFFF893B,SHL(SUB(15,a%),4)
  3974.       GOSUB affiche_icones_controlc2(FALSE)
  3975.       flag_relachement!=FALSE
  3976.       ' ----------------------------------------------------------------------
  3977.     CASE 5      ! Valeur Right amplification
  3978.       a%=SUB(15,SHR(PEEK(&HFFFF893B),4))
  3979.       GOSUB edite_chaine(STR$(a%,3),divbi&(0,srt%,31),divbi&(1,srt%,31),3,2)
  3980.       a%=MIN(MAX(VAL(bbbb$),0),15)
  3981.       SPOKE &HFFFF893B,SHL(SUB(15,a%),4)
  3982.       GOSUB affiche_icones_controlc2(TRUE)
  3983.       ' ----------------------------------------------------------------------
  3984.     CASE 6      ! Slider Master volume
  3985.       a%=MUL(4095,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  3986.       CARD{r_master_vol%}=a%
  3987.       GOSUB affiche_icones_controlc2(FALSE)
  3988.       flag_relachement!=FALSE
  3989.       ' ----------------------------------------------------------------------
  3990.     CASE 7      ! Valeur Master volume
  3991.       a%=CARD{r_master_vol%}
  3992.       GOSUB edite_chaine(HEX$(a%,3),divbi&(0,srt%,31),divbi&(1,srt%,31),3,1)
  3993.       a%=MIN(MAX(VAL("$"+bbbb$),0),4095)
  3994.       CARD{r_master_vol%}=a%
  3995.       GOSUB affiche_icones_controlc2(TRUE)
  3996.       ' ----------------------------------------------------------------------
  3997.     CASE 8 TO 11        ! Numero de plage des volumes
  3998.       ss_menuc2_nvol%=SUB(srt%,8)
  3999.       GOSUB affiche_icones_controlb
  4000.       ' ----------------------------------------------------------------------
  4001.     CASE 12 TO 19       ! Slider volume d'une voie ou entree a la main
  4002.       b%=ADD(SHL(ss_menuc2_nvol%,3),SUB(srt%,12))
  4003.       IF km%=2          ! Entree de la valeur
  4004.       ELSE              ! Slider: entre $800 et $E00
  4005.         a%=MUL(&H600,SUB(divbi&(3,srt%,31),SUB(ym%,divbi&(1,srt%,31))))/divbi&(3,srt%,31)+0.999
  4006.         ADD a%,&H800
  4007.         GOSUB chg_t_mix_volume_e(b%,a%)
  4008.         flag_relachement!=FALSE
  4009.       ENDIF
  4010.       GOSUB affiche_icones_controld2(FALSE)
  4011.       ' ----------------------------------------------------------------------
  4012.     DEFAULT
  4013.       ' Icones normales
  4014.       GOSUB affiche_icone_b(srt%,31,0,0,-1)
  4015.       GOSUB wait_mouse(TRUE)
  4016.       SELECT srt%
  4017.         ' --------------------------------------------------------------------
  4018.       CASE 0    ! Page precedente
  4019.         ss_menuc%=1
  4020.         GOSUB affiche_icones_control
  4021.         ' --------------------------------------------------------------------
  4022.       CASE 1    ! Reset des volumes
  4023.         GOSUB dialog("VOLUME RESET","Reset all the|track volumes.","OK|Cancel",MOUSEX,MOUSEY)
  4024.         IF bouton%=0
  4025.           GOSUB track_volume_reset
  4026.         ENDIF
  4027.         GOSUB affiche_icones_controlb
  4028.         ' --------------------------------------------------------------------
  4029.       ENDSELECT
  4030.       IF ss_menuc%=2
  4031.         GOSUB affiche_icone_b(srt%,31,0,0,0)
  4032.       ENDIF
  4033.     ENDSELECT
  4034.     GOSUB wait_mouse(flag_relachement!)
  4035.     GOSUB vide_buffer_clavier
  4036.   ENDIF
  4037. RETURN
  4038. ' Midi
  4039. PROCEDURE affiche_icones_midi
  4040.   IF ss_menum%=2
  4041.     GOSUB affiche_icones_midi2
  4042.   ELSE
  4043.     GOSUB cadre_int(20,35,59,69,13,13,14,12)
  4044.     GOSUB cadre_int(20,35,14,29,13,13,14,12)
  4045.     GOSUB cadre_int(35,35,11,39,13,13,14,12)
  4046.     GOSUB cadre_int(47,35,19,39,13,13,14,12)
  4047.     GOSUB cadre_int(20,65,14,39,13,13,14,12)
  4048.     GOSUB affiche_bloc_icones_b(8,7,27,0,0)
  4049.     GOSUB affchaine_trans("MIDI",42,41,14)
  4050.     GOSUB affchaine_trans("SYNC",42,53,14)
  4051.     GOSUB affchaine_trans("OPTIONS",72,40,14)
  4052.     GOSUB affchaine_trans("MONOPHONIC MODE",96,40,14)
  4053.     GOSUB affchaine_trans("REC. MODE",42,70,14)
  4054.     GOSUB cadre_ext(ADD(divbi&(0,8,27),11),ADD(divbi&(1,8,27),2),1,5,0,13,12,14)
  4055.     GOSUB cadre_ext(ADD(divbi&(0,11,27),11),ADD(divbi&(1,11,27),2),1,5,0,13,12,14)
  4056.     GOSUB affiche_icones_midib
  4057.   ENDIF
  4058. RETURN
  4059. PROCEDURE affiche_icones_midib
  4060.   LOCAL a$
  4061.   GOSUB affiche_icone_b(0,27,0,0,midi_flag_data_in!)
  4062.   GOSUB affiche_icone_b(1,27,0,0,midi_flag_data_out!)
  4063.   GOSUB affiche_icone_b(2,27,0,0,midi_flag_synchro%=1)
  4064.   GOSUB affiche_icone_b(3,27,0,0,midi_flag_synchro%=2)
  4065.   GOSUB affiche_icone_b(6,27,0,0,NOT midi_polyphonic_mode!)
  4066.   GOSUB affiche_icone_b(7,27,0,0,midi_polyphonic_mode!)
  4067.   GOSUB affchaine_notrans(STR$(midi_monomode_channel_nbr%,2),ADD(divbi&(0,8,27),11),ADD(divbi&(1,8,27),2),1)
  4068.   IF midi_monomode_instr_nbr%=0
  4069.     a$="C."
  4070.   ELSE
  4071.     a$=HEX$(midi_monomode_instr_nbr%,2)
  4072.   ENDIF
  4073.   GOSUB affchaine_notrans(a$,ADD(divbi&(0,11,27),11),ADD(divbi&(1,11,27),2),1)
  4074.   '
  4075.   GOSUB grise_icone(1,27,0,0)
  4076.   GOSUB grise_icone(3,27,0,0)
  4077.   GOSUB grise_icone(6,27,0,0)
  4078. RETURN
  4079. PROCEDURE gere_icones_midi              !!!
  4080.   LOCAL a%,b%,c%,d%,e%,i%,srt%
  4081.   LOCAL flag_relachement!
  4082.   LOCAL a$
  4083.   IF ss_menum%=2
  4084.     GOSUB gere_icones_midi2
  4085.   ELSE
  4086.     flag_relachement!=TRUE
  4087.     a%=V:divbi&(0,0,0)
  4088.     srt%=C:g_teste_icones%(L:a%,W:27,W:xm%,W:ym%)
  4089.     IF srt%>=0
  4090.       SELECT srt%
  4091.         ' Radio-boutons, Flip-flops ou champs de texte
  4092.         ' ----------------------------------------------------------------------
  4093.       CASE 0            ! In  On/Off
  4094.         GOSUB chg_midi_flag_data_in(NOT midi_flag_data_in!)
  4095.         IF midi_flag_synchro%=1
  4096.           IF midi_flag_data_in!
  4097.             GOSUB chg_tempo2(500)
  4098.           ELSE
  4099.             GOSUB chg_tempo(FN mod_tempo)
  4100.           ENDIF
  4101.         ENDIF
  4102.         GOSUB affiche_icones_midib
  4103.         ' ----------------------------------------------------------------------
  4104.       CASE 1            ! Out On/Off
  4105.         ' GOSUB chg_midi_flag_data_in(NOT midi_flag_data_in!)
  4106.         ' GOSUB affiche_icones_midib
  4107.         '
  4108.         '
  4109.         '
  4110.         '
  4111.         ' ----------------------------------------------------------------------
  4112.       CASE 2            ! Synchro In
  4113.         IF midi_flag_synchro%<>1
  4114.           midi_flag_synchro%=1
  4115.         ELSE
  4116.           midi_flag_synchro%=0
  4117.         ENDIF
  4118.         CARD{r_midi_in_sync_flag%}=SGN(midi_flag_synchro%)
  4119.         IF midi_flag_synchro%=1
  4120.           GOSUB chg_tempo2(500)                 ! 500 BPM pour une synchro midi correcte
  4121.         ELSE
  4122.           GOSUB chg_tempo(FN mod_tempo)         ! Remet l'ancienne valeur quand plus de sync
  4123.         ENDIF
  4124.         GOSUB affiche_icones_midib
  4125.         ' ----------------------------------------------------------------------
  4126.       CASE 3            ! Synchro Out
  4127.         ' IF midi_flag_synchro%<>2
  4128.         '   midi_flag_synchro%=2
  4129.         ' ELSE
  4130.         '   midi_flag_synchro%=0
  4131.         ' ENDIF
  4132.         ' CARD{r_midi_out_sync_flag%}=SGN(midi_flag_synchro%)
  4133.         ' GOSUB chg_tempo(FN mod_tempo)
  4134.         ' GOSUB affiche_icones_midib
  4135.         '
  4136.         '
  4137.         '
  4138.         '
  4139.         ' ----------------------------------------------------------------------
  4140.       CASE 6            ! Monophonic mode
  4141.         '
  4142.         '
  4143.         '
  4144.         '
  4145.         ' ----------------------------------------------------------------------
  4146.       CASE 7            ! Polyphonic mode
  4147.         '
  4148.         '
  4149.         '
  4150.         '
  4151.         ' ----------------------------------------------------------------------
  4152.       CASE 8            ! MIDI Channel (monophonic mode)
  4153.         GOSUB edite_chaine(STR$(midi_monomode_channel_nbr%,2),ADD(divbi&(0,srt%,27),11),ADD(divbi&(1,srt%,27),2),2,2)
  4154.         GOSUB chg_midi_monomode_channel_nbr(MIN(MAX(VAL(bbbb$),1),16))
  4155.         GOSUB affiche_icones_midib
  4156.         ' ----------------------------------------------------------------------
  4157.       CASE 9,10         ! MIDI Channel +/-
  4158.         a%=midi_monomode_channel_nbr%
  4159.         a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%)))
  4160.         GOSUB chg_midi_monomode_channel_nbr(MIN(MAX(a%,1),16))
  4161.         GOSUB affiche_icones_midib
  4162.         IF km%=1
  4163.           PAUSE 8
  4164.         ENDIF
  4165.         flag_relachement!=FALSE
  4166.         ' ----------------------------------------------------------------------
  4167.       CASE 11           ! Instrument (monophonic mode)
  4168.         IF midi_monomode_instr_nbr%=0
  4169.           a$="C."
  4170.         ELSE
  4171.           a$=HEX$(midi_monomode_instr_nbr%,2)
  4172.         ENDIF
  4173.         GOSUB edite_chaine(a$,ADD(divbi&(0,srt%,27),11),ADD(divbi&(1,srt%,27),2),2,1)
  4174.         GOSUB chg_midi_monomode_instr_nbr(MIN(MAX(VAL("$"+bbbb$),0),255))
  4175.         GOSUB affiche_icones_midib
  4176.         ' ----------------------------------------------------------------------
  4177.       CASE 12,13        ! Instrument +/-
  4178.         a%=midi_monomode_instr_nbr%
  4179.         a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,12),km%)))
  4180.         GOSUB chg_midi_monomode_instr_nbr(MIN(MAX(a%,0),255))
  4181.         GOSUB affiche_icones_midib
  4182.         IF km%=1
  4183.           PAUSE 8
  4184.         ENDIF
  4185.         flag_relachement!=FALSE
  4186.         ' ----------------------------------------------------------------------
  4187.       CASE 14           ! Page 2
  4188.         GOSUB affiche_icone_b(srt%,27,0,0,-1)
  4189.         GOSUB wait_mouse(TRUE)
  4190.         ss_menum%=2
  4191.         GOSUB affiche_icones_midi
  4192.         ' ----------------------------------------------------------------------
  4193.       CASE 4,5          ! Rien
  4194.       DEFAULT
  4195.         ' Icones normales
  4196.         GOSUB affiche_icone_b(srt%,27,0,0,TRUE)
  4197.         GOSUB wait_mouse(TRUE)
  4198.         SELECT srt%
  4199.           ' --------------------------------------------------------------------
  4200.         ENDSELECT
  4201.         GOSUB affiche_icone_b(srt%,27,0,0,FALSE)
  4202.       ENDSELECT
  4203.       GOSUB wait_mouse(flag_relachement!)
  4204.       GOSUB vide_buffer_clavier
  4205.     ENDIF
  4206.   ENDIF
  4207. RETURN
  4208. PROCEDURE affiche_icones_midi2
  4209.   LOCAL a%,i%,j%
  4210.   GOSUB cadre_int(20,35,59,69,13,13,14,12)
  4211.   GOSUB affiche_bloc_icones_b(32,10,28,0,0)
  4212.   GOSUB cadre_ext(ADD(divbi&(0,32,28),15),ADD(divbi&(1,32,28),2),1,5,0,13,12,14)
  4213.   GOSUB cadre_ext(ADD(divbi&(0,35,28),15),ADD(divbi&(1,35,28),2),1,5,0,13,12,14)
  4214.   FOR i%=0 TO 3
  4215.     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)
  4216.     GOSUB cadre_ext(divbi&(0,MUL(i%,8),28),ADD(divbi&(1,MUL(i%,8),28),9),23,5,0,13,12,14)
  4217.     GOSUB affchaine_trans("TRACK",SHL(SUB(divbi&(0,MUL(i%,8),28),8),1),ADD(divbi&(1,MUL(i%,8),28),2),14)
  4218.     GOSUB affchaine_trans("CHANNEL",SHL(SUB(divbi&(0,MUL(i%,8),28),8),1),ADD(divbi&(1,MUL(i%,8),28),9),14)
  4219.     FOR j%=0 TO 7
  4220.       a%=ADD(MUL(i%,8),j%)
  4221.       GOSUB cadre_texte3_b(divbn$(a%,28),divbi&(0,a%,28),ADD(divbi&(1,a%,28),1),divbi&(2,a%,28),7,0)
  4222.     NEXT j%
  4223.   NEXT i%
  4224.   GOSUB affiche_icones_midib2
  4225. RETURN
  4226. PROCEDURE affiche_icones_midib2
  4227.   LOCAL track%,channel%
  4228.   GOSUB affchaine_notrans(STR$(midi_polymode_channel_nbr%,2),ADD(divbi&(0,32,28),15),ADD(divbi&(1,32,28),2),1)
  4229.   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)
  4230.   FOR track%=0 TO 31
  4231.     IF track%<nbr_track%
  4232.       channel%=midi_in_channel%(track%)
  4233.       IF channel%>0
  4234.         GOSUB affchaine_notrans(STR$(channel%,2),divbi&(0,track%,28),ADD(divbi&(1,track%,28),9),1)
  4235.       ELSE
  4236.         GOSUB affchaine_notrans(MKI$(&H2005),divbi&(0,track%,28),ADD(divbi&(1,track%,28),9),1)
  4237.       ENDIF
  4238.     ELSE
  4239.       GOSUB affchaine_notrans(SPACE$(2),divbi&(0,track%,28),ADD(divbi&(1,track%,28),9),1)
  4240.     ENDIF
  4241.   NEXT track%
  4242. RETURN
  4243. PROCEDURE gere_icones_midi2
  4244.   flag_relachement!=TRUE
  4245.   a%=V:divbi&(0,0,0)
  4246.   srt%=C:g_teste_icones%(L:a%,W:28,W:xm%,W:ym%)
  4247.   IF srt%>=0
  4248.     SELECT srt%
  4249.       ' Radio-boutons, Flip-flops ou champs de texte
  4250.       ' ----------------------------------------------------------------------
  4251.     CASE 0 TO 31        ! Piste
  4252.       IF SUB(ym%,divbi&(1,srt%,28))<9           ! Partie haute: le numero de piste
  4253.         IF midi_in_channel%(srt%)<>midi_polymode_channel_nbr%
  4254.           GOSUB chg_midi_polymode_channel(srt%,midi_polymode_channel_nbr%)
  4255.         ELSE
  4256.           GOSUB chg_midi_polymode_channel(srt%,0)
  4257.         ENDIF
  4258.       ELSE                                      ! Partie basse: le numero de canal MIDI
  4259.         IF midi_in_channel%(srt%)<>0
  4260.           a%=midi_in_channel%(srt%)
  4261.           IF km%=1
  4262.             a%=MIN(SUCC(a%),16)
  4263.           ELSE IF km%=2
  4264.             a%=MAX(PRED(a%),1)
  4265.           ENDIF
  4266.           GOSUB chg_midi_polymode_channel(srt%,a%)
  4267.         ELSE
  4268.           GOSUB chg_midi_polymode_channel(srt%,midi_polymode_channel_nbr%)
  4269.         ENDIF
  4270.       ENDIF
  4271.       GOSUB affiche_icones_midib2
  4272.       ' ----------------------------------------------------------------------
  4273.     CASE 32             ! Numero de canal
  4274.       ' IF km%=2
  4275.       popup_code%(1,4)=popup_code%(1,4) AND (NOT &H20000)
  4276.       popup_code%(2,4)=popup_code%(2,4) AND (NOT &H20000)
  4277.       popup_code%(4,4)=popup_code%(4,4) AND (NOT &H20000)
  4278.       popup_code%(5,4)=popup_code%(5,4) AND (NOT &H20000)
  4279.       popup_code%(7,4)=popup_code%(7,4) AND (NOT &H20000)
  4280.       popup_code%(8,4)=popup_code%(8,4) AND (NOT &H20000)
  4281.       IF FN get_midi_flag_velocity(midi_polymode_channel_nbr%)<>0
  4282.         popup_code%(7,4)=popup_code%(7,4) OR &H20000
  4283.       ELSE
  4284.         popup_code%(8,4)=popup_code%(8,4) OR &H20000
  4285.       ENDIF
  4286.       a%=FN get_midi_flag_note_off(midi_polymode_channel_nbr%)
  4287.       IF a%=0
  4288.         popup_code%(2,4)=popup_code%(2,4) OR &H20000
  4289.         popup_code%(5,4)=popup_code%(5,4) OR &H20000
  4290.       ELSE
  4291.         popup_code%(1,4)=popup_code%(1,4) OR &H20000
  4292.         IF a%=-1
  4293.           popup_code%(4,4)=popup_code%(4,4) OR &H20000
  4294.         ELSE
  4295.           popup_code%(5,4)=popup_code%(5,4) OR &H20000
  4296.         ENDIF
  4297.       ENDIF
  4298.       a%=FN popup(4,-1,xm%,ym%)
  4299.       IF a%>=0
  4300.         a%=a% AND &HFFFF
  4301.         SELECT a%
  4302.         CASE 0          ! Melody
  4303.           GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,-1)
  4304.         CASE 1          ! Drums
  4305.           GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,0)
  4306.         CASE 10         ! Note Off transcribed
  4307.           GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,-1)
  4308.         CASE 11         ! Note Off ignored
  4309.           IF FN get_midi_flag_note_off(midi_polymode_channel_nbr%)<>0
  4310.             GOSUB chg_midi_flag_note_off(midi_polymode_channel_nbr%,1)
  4311.           ENDIF
  4312.         CASE 20         ! Velocity transcribed
  4313.           GOSUB chg_midi_flag_velocity(midi_polymode_channel_nbr%,TRUE)
  4314.         CASE 21         ! Velocity ignored
  4315.           GOSUB chg_midi_flag_velocity(midi_polymode_channel_nbr%,FALSE)
  4316.         ENDSELECT
  4317.       ENDIF
  4318.       ' ELSE
  4319.       '   GOSUB edite_chaine(STR$(midi_polymode_channel_nbr%,2),ADD(divbi&(0,srt%,28),15),ADD(divbi&(1,srt%,28),2),2,2)
  4320.       '   midi_polymode_channel_nbr%=MIN(MAX(VAL(bbbb$),1),16)
  4321.       ' ENDIF
  4322.       GOSUB affiche_icones_midib2
  4323.       ' ----------------------------------------------------------------------
  4324.     CASE 33,34          ! Numero de canal +/-
  4325.       a%=midi_polymode_channel_nbr%
  4326.       a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,33),km%)))
  4327.       midi_polymode_channel_nbr%=MIN(MAX(a%,1),16)
  4328.       GOSUB affiche_icones_midib2
  4329.       IF km%=1
  4330.         PAUSE 6
  4331.       ENDIF
  4332.       flag_relachement!=FALSE
  4333.       ' ----------------------------------------------------------------------
  4334.     CASE 35             ! Numero d'instrument
  4335.       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)
  4336.       GOSUB chg_midi_in_instr(PRED(midi_polymode_channel_nbr%),MIN(MAX(VAL("$"+bbbb$),1),255))
  4337.       GOSUB affiche_icones_midib2
  4338.       ' ----------------------------------------------------------------------
  4339.     CASE 36,37          ! Numero d'instrument +/-
  4340.       a%=midi_in_instr%(PRED(midi_polymode_channel_nbr%))
  4341.       a%=ADD(a%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,36),km%)))
  4342.       GOSUB chg_midi_in_instr(PRED(midi_polymode_channel_nbr%),MIN(MAX(a%,1),255))
  4343.       GOSUB affiche_icones_midib2
  4344.       IF km%=1
  4345.         PAUSE 6
  4346.       ENDIF
  4347.       flag_relachement!=FALSE
  4348.       ' ----------------------------------------------------------------------
  4349.     CASE 41             ! Page 1
  4350.       GOSUB affiche_icone_b(srt%,28,0,0,-1)
  4351.       GOSUB wait_mouse(TRUE)
  4352.       ss_menum%=1
  4353.       GOSUB affiche_icones_midi
  4354.       ' ----------------------------------------------------------------------
  4355.     DEFAULT
  4356.       ' Icones normales
  4357.       GOSUB affiche_icone_b(srt%,28,0,0,TRUE)
  4358.       GOSUB wait_mouse(TRUE)
  4359.       SELECT srt%
  4360.         ' --------------------------------------------------------------------
  4361.       CASE 38           ! Select current preset
  4362.         FOR i%=0 TO PRED(nbr_colonnes%(n_preset%))
  4363.           ' IF i%<nbr_col%
  4364.           a%=preset&(i%,n_preset%)
  4365.           IF a%<nbr_track%
  4366.             GOSUB chg_midi_polymode_channel(a%,midi_polymode_channel_nbr%)
  4367.           ENDIF
  4368.           ' ENDIF
  4369.         NEXT i%
  4370.         GOSUB affiche_icones_midib2
  4371.         ' --------------------------------------------------------------------
  4372.       CASE 39           ! Remove MIDI channel
  4373.         FOR i%=0 TO PRED(nbr_track%)
  4374.           IF midi_in_channel%(i%)=midi_polymode_channel_nbr%
  4375.             GOSUB chg_midi_polymode_channel(i%,0)
  4376.           ENDIF
  4377.         NEXT i%
  4378.         GOSUB affiche_icones_midib2
  4379.         ' --------------------------------------------------------------------
  4380.       CASE 40           ! Reset
  4381.         IF midi_polyphonic_mode!
  4382.           GOSUB reset_all_midi_track_state
  4383.           GOSUB affiche_icones_midib2
  4384.         ELSE
  4385.           GOSUB dialog("RESET TRACKS","You can't do this because you're|not in polyphonic mode.","Cancel",MOUSEX,MOUSEY)
  4386.         ENDIF
  4387.         ' --------------------------------------------------------------------
  4388.       ENDSELECT
  4389.       GOSUB affiche_icone_b(srt%,28,0,0,FALSE)
  4390.     ENDSELECT
  4391.     GOSUB wait_mouse(flag_relachement!)
  4392.     GOSUB vide_buffer_clavier
  4393.   ENDIF
  4394. RETURN
  4395. '
  4396. ' Affichages divers
  4397. ' -----------------
  4398. PROCEDURE affiche_info_sample
  4399.   LOCAL a%
  4400.   IF NOT se.sample_editor_flag!
  4401.     HIDEM
  4402.     GOSUB affchaine_notrans(" "+HEX$(instr%,2),ADD(divbi&(0,12,16),11),ADD(divbi&(1,12,16),2),1)
  4403.     GOSUB affchaine_notrans(" "+HEX$(sample%,2),ADD(divbi&(0,15,16),11),ADD(divbi&(1,15,16),2),1)
  4404.     GOSUB affchaine_notrans(FN instrname$(instr%),ADD(divbi&(0,22,16),9),ADD(divbi&(1,22,16),2),1)
  4405.   ENDIF
  4406.   IF ss_menu%=3
  4407.     GOSUB affiche_icones_instrb
  4408.   ELSE IF ss_menu%=4
  4409.     GOSUB affiche_icones_sampleb
  4410.   ENDIF
  4411. RETURN
  4412. PROCEDURE affiche_info_song
  4413.   LOCAL a$
  4414.   IF NOT se.sample_editor_flag!
  4415.     HIDEM
  4416.     GOSUB affchaine_notrans(" "+HEX$(songpos%,2),ADD(divbi&(0,0,16),11),ADD(divbi&(1,0,16),2),1)
  4417.     GOSUB affchaine_notrans(" "+HEX$(song&(songpos%),2),ADD(divbi&(0,3,16),11),ADD(divbi&(1,3,16),2),1)
  4418.     IF module&(101)<256
  4419.       GOSUB affchaine_notrans(" "+HEX$(module&(101),2),ADD(divbi&(0,6,16),11),ADD(divbi&(1,6,16),2),1)
  4420.     ELSE
  4421.       GOSUB affchaine_notrans(HEX$(module&(101),3),ADD(divbi&(0,6,16),11),ADD(divbi&(1,6,16),2),1)
  4422.     ENDIF
  4423.     GOSUB affchaine_notrans(" "+HEX$(module&(102),2),ADD(divbi&(0,9,16),11),ADD(divbi&(1,9,16),2),1)
  4424.     GOSUB affchaine_notrans(FN songname$,ADD(divbi&(0,21,16),9),ADD(divbi&(1,21,16),2),1)
  4425.     GOSUB affchaine_notrans(STR$(nbr_track%,2),ADD(divbi&(0,23,16),7),ADD(divbi&(1,23,16),2),1)
  4426.     GOSUB affchaine_notrans(STR$(FN nbr_lines3,3),ADD(divbi&(0,24,16),6),ADD(divbi&(1,24,16),2),1)
  4427.     posligne%=MAX(MIN(posligne%,PRED(FN nbr_lines3)),0)
  4428.     SELECT line_step%
  4429.     CASE -255 TO -1
  4430.       a$="-"+HEX$(ABS(line_step%),1)
  4431.     CASE 0 TO 255
  4432.       a$=HEX$(line_step%,2)
  4433.     CASE 256
  4434.       a$="NL"
  4435.     CASE 257
  4436.       a$="NN"
  4437.     CASE 258
  4438.       a$="NF"
  4439.     CASE 259
  4440.       a$="NV"
  4441.     ENDSELECT
  4442.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,18,16),5),ADD(divbi&(1,18,16),2),1)
  4443.     IF ss_menu%=2 AND ss_menut%=3
  4444.       GOSUB affiche_icones_toolsb3
  4445.     ENDIF
  4446.   ENDIF
  4447. RETURN
  4448. PROCEDURE affiche_info_preset
  4449.   LOCAL iii%,aaa%
  4450.   SELECT type_affpiste%
  4451.   CASE 0
  4452.     aaa%=6
  4453.   CASE 2
  4454.     aaa%=12
  4455.   DEFAULT
  4456.     aaa%=10
  4457.   ENDSELECT
  4458.   HIDEM
  4459.   GOSUB cadre_texte2(STR$(SUCC(n_preset%)),ADD(MUL(n_preset%,2),8),130,1,1)
  4460.   FOR iii%=0 TO PRED(nbr_col%)
  4461.     IF iii%<nbr_colonnes%(n_preset%)
  4462.       GOSUB affchaine_notrans(STR$(SUCC(preset&(iii%,n_preset%)),2),ADD(MUL(iii%,aaa%),6),162,1)
  4463.       IF FN track_onoff(preset&(iii%,n_preset%))<>0
  4464.         GOSUB affchaine_notrans(CHR$(6),ADD(MUL(iii%,aaa%),5),162,1)
  4465.       ELSE
  4466.         GOSUB affchaine_notrans(CHR$(5),ADD(MUL(iii%,aaa%),5),162,1)
  4467.       ENDIF
  4468.     ELSE
  4469.       GOSUB affchaine_notrans("   ",ADD(MUL(iii%,aaa%),5),162,1)
  4470.       GOSUB cadre_ext(ADD(MUL(iii%,aaa%),4),170,SUB(aaa%,2),PRED(MUL(haut_lig%,6)),0,9,8,10)
  4471.     ENDIF
  4472.   NEXT iii%
  4473.   GOSUB affiche_c_pattern
  4474. RETURN
  4475. PROCEDURE affiche_barre_info
  4476.   GOSUB cadre_int(1,140,70,7,9,9,9,9)           ! Efface ce qu'il y avait avant
  4477.   GOSUB affchaine_trans("OCT",2,142,10)
  4478.   GOSUB affchaine_trans(STR$(SUCC(octave%),1),10,142,8)
  4479.   GOSUB affchaine_trans("BLK",20,142,10)
  4480.   GOSUB affchaine_trans("/  :  -",32,142,8)
  4481.   GOSUB affchaine_trans(STR$(SUCC(bl_trk&),2),28,142,8)
  4482.   GOSUB affchaine_trans(HEX$(bl_pat&,2),34,142,8)
  4483.   GOSUB affchaine_trans(HEX$(bl_start&,2),40,142,8)
  4484.   GOSUB affchaine_trans(HEX$(bl_end&,2),46,142,8)
  4485.   GOSUB affchaine_trans("NUMPAD",58,142,10)
  4486.   IF drumpad_flag%=0
  4487.     GOSUB affchaine_trans("INSTRUM",72,142,8)
  4488.   ELSE IF drumpad_flag%=1
  4489.     GOSUB affchaine_trans("SAMPLES",72,142,8)
  4490.   ELSE
  4491.     GOSUB affchaine_trans("DRUMKIT",72,142,8)
  4492.   ENDIF
  4493.   GOSUB affchaine_trans("FREE       Kb",94,142,10)
  4494.   GOSUB affchaine_trans(STR$(SHR(FN zone_free,10),5),104,142,8)
  4495. RETURN
  4496. PROCEDURE aff_message(a$)
  4497.   GOSUB cadre_int(0,149,PRED(scr_ncol%),8,13,13,12,14)  ! Efface ce qu'il y avait avant
  4498.   GOSUB affchaine_trans(LEFT$(a$,MIN(LEN(a$),scr_ncol%)),2,151,12)
  4499. RETURN
  4500. PROCEDURE affiche_temps
  4501.   LOCAL a%,m$,s$
  4502.   a%=DIV(SUB(TIMER,debut_temps%),200)
  4503.   s$=STR$(a% MOD 60)
  4504.   m$=STR$(DIV(a%,60) MOD 60)
  4505.   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)
  4506. RETURN
  4507. PROCEDURE affiche_cpu_time_pourcent
  4508.   ' Temps machine
  4509.   GOSUB cadre_int(75,140,3,7,9,9,9,9)
  4510.   IF CARD{r_flag_overload%}<>0
  4511.     GOSUB cadre_int(76,142,2,5,2,2,2,2)
  4512.     CARD{r_flag_overload%}=0
  4513.   ELSE
  4514.     GOSUB affchaine_trans(STR$(CARD{r_cpu_time_pourcent%},3)+"%",150,142,8)
  4515.   ENDIF
  4516. RETURN
  4517. PROCEDURE aff_ps_pp_e
  4518.   HIDEM
  4519.   GOSUB affiche_icone(0,24,0,0,play%=1)
  4520.   GOSUB affiche_icone(5,24,0,0,play%=2)
  4521.   GOSUB affiche_icone(1,24,0,0,edit%)
  4522.   SHOWM
  4523. RETURN
  4524. PROCEDURE affiche_slider_h(xxx%,yyy%,lll%,qqq%,mmm%)
  4525.   LOCAL iii%,ppp%
  4526.   GOSUB cadre_int(xxx%,yyy%,lll%,5,0,0,0,0)
  4527.   ppp%=DIV(MUL(qqq%,ADD(SHL(lll%,3),6)),mmm%)
  4528.   FOR iii%=ppp% TO SUCC(ppp%)
  4529.     GOSUB affchaine_trans(CHR$(ADD(iii% AND 7,16)),SHL(ADD(xxx%,SHR(iii%,3)),1),yyy%,1)
  4530.   NEXT iii%
  4531. RETURN
  4532. PROCEDURE affiche_slider_v(xxx%,yyy%,lll%,hhh%,qqq%,mmm%)
  4533.   LOCAL iii%,ppp%
  4534.   ppp%=DIV(MUL(qqq%,hhh%),mmm%)
  4535.   IF ppp%<hhh%
  4536.     GOSUB cadre_int(xxx%,yyy%,lll%,PRED(SUB(hhh%,ppp%)),0,0,0,0)
  4537.   ENDIF
  4538.   GOSUB cadre_int(xxx%,ADD(yyy%,SUB(hhh%,ppp%)),lll%,ppp%,1,1,1,1)
  4539. RETURN
  4540. PROCEDURE affiche_cadre_voies
  4541.   LOCAL iii%,aaa%
  4542.   GOSUB cadre_ext(1,170,1,PRED(MUL(haut_lig%,6)),0,9,8,10)
  4543.   SELECT type_affpiste%
  4544.   CASE 0
  4545.     aaa%=6
  4546.   CASE 1
  4547.     aaa%=10
  4548.   CASE 2
  4549.     aaa%=12
  4550.   ENDSELECT
  4551.   FOR iii%=0 TO PRED(nbr_col%)
  4552.     GOSUB cadre_ext(ADD(MUL(iii%,aaa%),4),170,SUB(aaa%,2),PRED(MUL(haut_lig%,6)),0,9,8,10)
  4553.     IF type_affpiste%>0
  4554.       GOSUB cadre_int(ADD(MUL(iii%,aaa%),4),160,8,9,9,9,10,8)
  4555.       GOSUB cadre_texte(CHR$(1),ADD(MUL(iii%,aaa%),9),160,1)
  4556.       GOSUB cadre_texte(CHR$(2),ADD(MUL(iii%,aaa%),11),160,1)
  4557.     ELSE
  4558.       GOSUB cadre_int(ADD(MUL(iii%,aaa%),4),160,4,9,9,9,10,8)
  4559.     ENDIF
  4560.     GOSUB cadre_ext(ADD(MUL(iii%,aaa%),5),162,2,5,0,9,8,10)
  4561.   NEXT iii%
  4562. RETURN
  4563. PROCEDURE affiche_panneau_principal
  4564.   LOCAL i%,a$
  4565.   IF NOT se.sample_editor_flag!
  4566.     DEFMOUSE 0
  4567.     HIDEM
  4568.     GOSUB cadre_int(0,0,PRED(scr_ncol%),PRED(scr_haut%),9,9,10,8)
  4569.     ' GOSUB affiche_graoumf_logo
  4570.     GOSUB affiche_bloc_icones(0,28,16,0,0)
  4571.     FOR i%=0 TO 15 STEP 3
  4572.       GOSUB cadre_ext(ADD(divbi&(0,i%,16),11),ADD(divbi&(1,i%,16),2),2,5,0,9,8,10)
  4573.     NEXT i%
  4574.     GOSUB cadre_ext(ADD(divbi&(0,18,16),5),ADD(divbi&(1,18,16),2),1,5,0,9,8,10)
  4575.     GOSUB cadre_ext(ADD(divbi&(0,21,16),9),ADD(divbi&(1,21,16),2),31,5,0,9,8,10)
  4576.     GOSUB cadre_ext(ADD(divbi&(0,22,16),9),ADD(divbi&(1,22,16),2),27,5,0,9,8,10)
  4577.     GOSUB cadre_ext(ADD(divbi&(0,23,16),7),ADD(divbi&(1,23,16),2),1,5,0,9,8,10)
  4578.     GOSUB cadre_ext(ADD(divbi&(0,24,16),6),ADD(divbi&(1,24,16),2),2,5,0,9,8,10)
  4579.     GOSUB cadre_ext(ADD(divbi&(0,25,16),1),ADD(divbi&(1,25,16),2),4,5,0,9,8,10)
  4580.     FOR i%=0 TO 31
  4581.       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)
  4582.       GOSUB cadre_texte(STR$(SUCC(i%)),ADD(divbi&(0,27,16),ADD(SHL(i%,1),8)),divbi&(1,27,16),1)
  4583.     NEXT i%
  4584.     GOSUB affiche_icones_commande
  4585.     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
  4586.     GOSUB affiche_cadre_voies
  4587.     GOSUB affiche_info_song
  4588.     GOSUB affiche_info_sample
  4589.     GOSUB affiche_info_preset
  4590.     GOSUB affiche_barre_info
  4591.     GOSUB affchaine_trans("CPU",144,142,10)
  4592.     IF play%=0
  4593.       debut_temps%=TIMER
  4594.     ENDIF
  4595.     GOSUB affiche_temps
  4596.     SHOWM
  4597.     GOSUB bee(FALSE)
  4598.   ELSE
  4599.     GOSUB affiche_panneau_sample
  4600.     IF NOT se.pas_sous_menu!
  4601.       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
  4602.     ENDIF
  4603.   ENDIF
  4604. RETURN
  4605. PROCEDURE affiche_please_register
  4606.   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)
  4607. RETURN
  4608. PROCEDURE affiche_graoumf_logo
  4609.   LOCAL high%,nbr_l%,nbr_h%,width%,x_logo%,x_cpt%,x_offset%,y_logo%,y_cpt%,y_offset%
  4610.   IF LEN(graoumf_logo$)>0
  4611.     nbr_l%=DIV(scr_larg%,320)
  4612.     nbr_h%=DIV(scr_haut%,120)
  4613.     width%=DIV(scr_larg%,nbr_l%)
  4614.     high%=DIV(scr_haut%,nbr_h%)
  4615.     x_offset%=SHR(SUB(width%,320),1)
  4616.     y_offset%=SHR(SUB(high%,120),1)
  4617.     FOR y_cpt%=0 TO PRED(nbr_h%)
  4618.       FOR x_cpt%=0 TO PRED(nbr_l%)
  4619.         x_logo%=ADD(MUL(x_cpt%,width%),x_offset%)
  4620.         y_logo%=ADD(MUL(y_cpt%,high%),y_offset%)
  4621.         IF ADD(y_logo%,120)<160 OR y_logo%>=ADD(170,MUL(haut_lig%,6))
  4622.           GOSUB affiche_one_graoumf_logo(x_logo%,y_logo%)
  4623.         ENDIF
  4624.       NEXT x_cpt%
  4625.     NEXT y_cpt%
  4626.   ENDIF
  4627. RETURN
  4628. PROCEDURE affiche_one_graoumf_logo(x_logo%,y_logo%)
  4629.   LOCAL adr_ecran%,adr_logo%,adr_mask%,lig%
  4630.   IF LEN(graoumf_logo$)>0
  4631.     adr_ecran%=XBIOS(2)
  4632.     adr_logo%=V:graoumf_logo$
  4633.     adr_mask%=V:graoumf_logo_mask$
  4634.     FOR lig%=0 TO 119
  4635.       RC_COPY adr_mask%,0,0,320,1 TO adr_ecran%,x_logo%,y_logo%,4
  4636.       RC_COPY adr_logo%,0,0,320,1 TO adr_ecran%,x_logo%,y_logo%,7
  4637.       ADD adr_mask%,160
  4638.       ADD adr_logo%,160
  4639.       INC y_logo%
  4640.     NEXT lig%
  4641.   ENDIF
  4642. RETURN
  4643. PROCEDURE affiche_panneau_progression(mes$,p_len%,x%,y%)
  4644.   ' mes$: Titre de la boite de progression
  4645.   ' p_len%: valeur maximum de la variable de progression
  4646.   ' x%, y%: coordonnees de la boite (car, pix). -1 = milieu de l'ecran
  4647.   LOCAL box_width%,box_height%
  4648.   '
  4649.   box_width%=MAX(ADD(LEN(mes$),2),32)
  4650.   box_height%=30                                ! 4 +6 +4 +6*2 +4
  4651.   IF x%<0
  4652.     x%=SHR(SUB(scr_ncol%,box_width%),1)
  4653.   ENDIF
  4654.   IF y%<0
  4655.     y%=SHR(SUB(scr_haut%,box_height%),1)
  4656.   ENDIF
  4657.   x%=MAX(MIN(x%,SUB(scr_ncol%,box_width%)),0)
  4658.   y%=MAX(MIN(y%,SUB(scr_haut%,box_height%)),0)
  4659.   progression_xpos%=x%
  4660.   progression_ypos%=y%
  4661.   progression_width%=SHL(SUB(box_width%,2),3)
  4662.   progression_len%=p_len%
  4663.   progression_oldval%=-1
  4664.   '
  4665.   GOSUB cadre_o_int(x%,y%,PRED(box_width%),PRED(box_height%),9,9,10,8)
  4666.   GOSUB cadre_ext(SUCC(x%),ADD(y%,14),SUB(box_width%,3),11,9,9,8,10)
  4667.   GOSUB affchaine_trans(mes$,SHL(SUCC(x%),1),ADD(y%,4),8)
  4668.   GOSUB affiche_progression(0)
  4669. RETURN
  4670. PROCEDURE affiche_progression(newval%)
  4671.   ' newval entre 0 et progression_len%
  4672.   '
  4673.   LOCAL i%,oldpos%,newpos%,carxpos%,pixxpos%,pixypos%,pixypos2%
  4674.   '
  4675.   IF progression_oldval%<0
  4676.     oldpos%=-1
  4677.   ELSE
  4678.     oldpos%=progression_oldval%*progression_width%/progression_len%
  4679.   ENDIF
  4680.   newpos%=newval%*progression_width%/progression_len%
  4681.   IF newpos%>oldpos%
  4682.     oldpos%=MAX(SUCC(oldpos%),0)
  4683.     carxpos%=SHL(ADD(SUCC(progression_xpos%),SHR(oldpos%,3)),1)
  4684.     pixxpos%=ADD(oldpos% AND 7,16)
  4685.     pixypos%=ADD(progression_ypos%,14)
  4686.     pixypos2%=ADD(pixypos%,6)
  4687.     FOR i%=oldpos% TO newpos%
  4688.       GOSUB affchaine_trans(CHR$(pixxpos%),carxpos%,pixypos%,8)
  4689.       GOSUB affchaine_trans(CHR$(pixxpos%),carxpos%,pixypos2%,8)
  4690.       INC pixxpos%
  4691.       IF pixxpos%>23
  4692.         SUB pixxpos%,8
  4693.         ADD carxpos%,2
  4694.       ENDIF
  4695.     NEXT i%
  4696.   ENDIF
  4697.   progression_oldval%=MAX(newval%,progression_oldval%)
  4698. RETURN
  4699. '
  4700. ' Chargements/sauvegardes/disk
  4701. ' ----------------------------
  4702. PROCEDURE save_sample(buf!)
  4703.   LOCAL a$
  4704.   IF flag_registered!
  4705.     IF km%=2 AND nfile_sample$<>""
  4706.       a$=npath_sample$+nfile_sample$
  4707.     ELSE
  4708.       CLS
  4709.       GOSUB cadre_texte("SAVE SAMPLE",0,0,PRED(scr_ncol%))
  4710.       FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  4711.     ENDIF
  4712.     IF a$<>""
  4713.       CLS
  4714.       GOSUB cadre_texte("WAITING : SAVING SAMPLE "+a$+"...",0,0,PRED(scr_ncol%))
  4715.       GOSUB save_sample2(buf!)
  4716.       IF erreur%=0
  4717.         GOSUB separe_nom_chemin(a$)
  4718.         nfile_sample$=nfile_$
  4719.         npath_sample$=npath_$
  4720.       ENDIF
  4721.     ENDIF
  4722.   ELSE
  4723.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  4724.   ENDIF
  4725.   GOSUB affiche_panneau_principal
  4726. RETURN
  4727. PROCEDURE save_sample2(buf!)
  4728.   ' Fournir a$ nom du sample, sample% numero du sample
  4729.   LOCAL a%,b$,i%,j%,k%,lon%,signe%
  4730.   erreur%=0
  4731.   warning%=0
  4732.   GOSUB bee(TRUE)
  4733.   IF NOT buf!
  4734.     lon%=FN length(sample%)
  4735.   ELSE
  4736.     lon%=mark_len%
  4737.   ENDIF
  4738.   IF lon%>0
  4739.     OPEN "o",#0,a$
  4740.     SEEK #0,0
  4741.     IF next_sample$="*.SPL"
  4742.       signe%=128
  4743.     ELSE
  4744.       signe%=signe_sam%
  4745.     ENDIF
  4746.     IF next_sample$="*.AVR"
  4747.       ' Entete du format .AVR
  4748.       GOSUB separe_nom_chemin(a$)       ! Recupere le nom
  4749.       b$=LEFT$(nfile_$,8)
  4750.       IF INSTR(b$,".")>1
  4751.         b$=LEFT$(b$,PRED(INSTR(b$,".")))
  4752.         IF LEN(b$)<8
  4753.           b$=b$+STRING$(SUB(8,LEN(b$)),0)
  4754.         ENDIF
  4755.       ENDIF
  4756.       IF NOT buf!
  4757.         b$="2BIT"+b$+MKI$(0)+MKI$(SHL(FN resol(sample%),3))+MKI$(signe%=0)
  4758.         IF FN repeat(sample%)>0 OR FN replen(sample%)>2
  4759.           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%)))
  4760.         ELSE
  4761.           b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(FN freqech(sample%))+MKL$(DIV(lon%,FN resol(sample%)))+MKL$(0)+MKL$(0)
  4762.         ENDIF
  4763.       ELSE
  4764.         b$="2BIT"+b$+MKI$(0)+MKI$(SHL(win_bits%,3))+MKI$(signe%=0)
  4765.         b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(freq_buffer%)+MKL$(DIV(lon%,win_bits%))+MKL$(0)+MKL$(0)
  4766.       ENDIF
  4767.       b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  4768.       b$=b$+STRING$(SUB(128,LEN(b$)),0)
  4769.       BPUT #0,V:b$,128
  4770.     ENDIF
  4771.     ' Sauvegarde des donnees du sample
  4772.     b$=STRING$(1024,0)  ! Buffer de signature
  4773.     i%=0
  4774.     IF NOT buf!
  4775.       k%=FN resol(sample%)
  4776.     ELSE
  4777.       k%=win_bits%
  4778.     ENDIF
  4779.     REPEAT
  4780.       j%=MIN(1024,SUB(lon%,i%))
  4781.       IF NOT buf!
  4782.         BMOVE ADD(FN adresse(sample%),i%),V:b$,j%*(-flag_registered2!)    ! *** 2eme protection
  4783.       ELSE
  4784.         BMOVE ADD(ADD(FN adr_buffer,mark_1%),i%),V:b$,j%*(-flag_registered2!)    ! *** 2eme protection
  4785.       ENDIF
  4786.       IF signe%<>0
  4787.         a%=V:b$
  4788.         ~C:g_signe_sample%(L:a%,L:j%,W:k%)
  4789.       ENDIF
  4790.       BPUT #0,V:b$,j%
  4791.       ADD i%,j%
  4792.     UNTIL i%=>lon%
  4793.     CLOSE #0
  4794.   ENDIF
  4795. RETURN
  4796. PROCEDURE load_sample(buf!)
  4797.   LOCAL a$
  4798.   IF km%=2 AND nfile_sample$<>""
  4799.     a$=npath_sample$+nfile_sample$
  4800.   ELSE
  4801.     CLS
  4802.     GOSUB cadre_texte("LOAD SAMPLE",0,0,PRED(scr_ncol%))
  4803.     FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  4804.   ENDIF
  4805.   IF a$<>""
  4806.     IF FN exist(a$)
  4807.       CLS
  4808.       GOSUB cadre_texte("WAITING : LOADING SAMPLE "+a$+"...",0,0,PRED(scr_ncol%))
  4809.       GOSUB load_sample2(buf!)
  4810.       IF erreur%=0
  4811.         GOSUB separe_nom_chemin(a$)
  4812.         nfile_sample$=nfile_$
  4813.         npath_sample$=npath_$
  4814.       ENDIF
  4815.     ENDIF
  4816.   ENDIF
  4817.   GOSUB bee(FALSE)
  4818.   SELECT erreur%
  4819.   CASE 1
  4820.     GOSUB dialog("FILE","Error:|Not enough memory|to load this sample!","Cancel",MOUSEX,MOUSEY)
  4821.   CASE 2
  4822.     GOSUB dialog("FILE","Error:|Unknown format version.","Cancel",MOUSEX,MOUSEY)
  4823.   ENDSELECT
  4824.   GOSUB affiche_panneau_principal
  4825. RETURN
  4826. PROCEDURE load_sample2(buf!)
  4827.   ' Fournir a$ nom du sample, sample% numero du sample
  4828.   LOCAL adsam%,freq%,lonfic%,lonsam%,res%,signe%
  4829.   LOCAL buffer$
  4830.   ~FRE(0)
  4831.   GOSUB bee(TRUE)
  4832.   IF NOT buf!
  4833.     GOSUB chg_taille_sample(sample%,0)
  4834.   ENDIF
  4835.   erreur%=0
  4836.   warning%=0
  4837.   res%=FN resol(sample%)
  4838.   freq%=FN freqech(sample%)
  4839.   signe%=signe_sam%
  4840.   buffer$=STRING$(128,0)
  4841.   OPEN "i",#0,a$
  4842.   lonfic%=LOF(#0)                               ! Taille du fichier
  4843.   BGET #0,V:buffer$,MIN(LOF(#0),128)
  4844.   ' Compacte ? Si, oui, cherche la vraie longueur
  4845.   IF LEFT$(buffer$,4)="ATM5"
  4846.     lonsam%=LONG{ADD(V:buffer$,4)}
  4847.   ELSE IF LEFT$(buffer$,4)="Ice!"
  4848.     lonsam%=LONG{ADD(V:buffer$,4)}
  4849.   ELSE IF LEFT$(buffer$,4)="ICE!"
  4850.     lonsam%=LONG{ADD(V:buffer$,8)}
  4851.   ELSE IF LEFT$(buffer$,4)="SPv3"
  4852.     lonsam%=LONG{ADD(V:buffer$,12)}
  4853.   ELSE
  4854.     lonsam%=LOF(#0)
  4855.   ENDIF
  4856.   IF (buf! AND lonsam%<mark_len%) OR (NOT buf! AND MAX(lonsam%,lonfic%)<FN zone_free)          ! Assez de memoire pour charger ?
  4857.     IF NOT buf!
  4858.       GOSUB chg_taille_sample(sample%,SUCC(MAX(lonsam%,lonfic%)) AND -2)
  4859.       adsam%=FN adresse(sample%)
  4860.     ELSE
  4861.       adsam%=FN adr_buffer+mark_1%
  4862.     ENDIF
  4863.     SEEK #0,0
  4864.     BGET #0,adsam%,lonfic%
  4865.     ~C:g_atomic_35_unpack%(L:adsam%)
  4866.     ~C:g_packice_21_unpack%(L:adsam%)
  4867.     ~C:g_packice_24_unpack%(L:adsam%)
  4868.     ~C:g_speedpacker_unpack%(L:adsam%)
  4869.     BMOVE adsam%,V:buffer$,MIN(lonsam%,128)
  4870.     IF LONG{adsam%}=&H32424954                  ! '2BIT' : Format AVR
  4871.       GOSUB load_sample_avr(buf!)
  4872.     ELSE IF LONG{adsam%}=&H52494646             ! 'RIFF' : Format WAV
  4873.       GOSUB load_sample_wav(buf!)
  4874.     ELSE IF LEFT$(buffer$,19)="Creative Voice File"     ! Format VOC
  4875.       GOSUB load_sample_voc(buf!)
  4876.     ELSE                                        ! Format inconnu : donnees brutes
  4877.       GOSUB load_sample_raw(buf!)
  4878.     ENDIF
  4879.   ELSE
  4880.     erreur%=1                                   ! Pas assez de memoire pour charger le fichier
  4881.   ENDIF
  4882.   CLOSE #0
  4883.   IF NOT buf!
  4884.     IF erreur%=0
  4885.       ~C:rr_boucle_sample%(W:sample%)
  4886.     ELSE
  4887.       GOSUB kill_sample(sample%)
  4888.     ENDIF
  4889.   ENDIF
  4890.   ~FRE(0)
  4891. RETURN
  4892. PROCEDURE load_sample_raw(buf!)
  4893.   ' Besoin (Load_Sample2): a$, freq%, res%, signe%, adsam% et lonsam%
  4894.   LOCAL len%
  4895.   LOCAL b$
  4896.   len%=lonsam% AND -2
  4897.   GOSUB chg_sam_balance(sample%,&HFFFF)
  4898.   GOSUB chg_sam_volume(sample%,&H100)
  4899.   GOSUB chg_sam_finetune(sample%,0)
  4900.   GOSUB chg_sam_length(sample%,len%)
  4901.   GOSUB chg_sam_repeat(sample%,0)
  4902.   GOSUB chg_sam_replen(sample%,2)
  4903.   IF len%>0
  4904.     IF (NOT buf!)
  4905.       a%=FN adresse(sample%)
  4906.     ELSE
  4907.       a%=FN adr_buffer+mark_1%
  4908.     ENDIF
  4909.     IF signe%<>0 OR next_sample$="*.SPL"
  4910.       ~C:g_signe_sample%(L:a%,L:len%,W:res%)            ! Signature
  4911.     ENDIF
  4912.   ENDIF
  4913.   IF (NOT buf!)
  4914.     GOSUB chg_taille_sample(sample%,len%)
  4915.   ELSE
  4916.     mark_2%=ADD(mark_1%,len%)
  4917.   ENDIF
  4918.   b$=a$
  4919.   WHILE INSTR(b$,"\")>0
  4920.     a%=INSTR(b$,"\")
  4921.     b$=RIGHT$(b$,SUB(LEN(b$),a%))
  4922.   WEND
  4923.   IF NOT buf!
  4924.     GOSUB chg_samplename(b$,sample%)
  4925.   ENDIF
  4926.   ~FRE(0)
  4927. RETURN
  4928. PROCEDURE load_sample_avr(buf!)
  4929.   ' Besoin (Load_Sample2): a$, adsam% et lonsam%
  4930.   ' Change (Load_Sample2): freq%, res%, signe%
  4931.   LOCAL a%,b%,c%,len%,loop%,rep_avr%,rep2_avr%,stereo%
  4932.   LOCAL b$
  4933.   res%=MAX(MIN(SHR(CARD{ADD(adsam%,14)},3),2),1)        ! Nbr d'octets/sample
  4934.   a%=CARD{ADD(adsam%,12)}
  4935.   IF a%=0
  4936.     stereo%=1
  4937.   ELSE
  4938.     stereo%=2
  4939.   ENDIF
  4940.   freq%=MAX(CARD{ADD(adsam%,24)},2000)                  ! Frequence d'echantillonnage du sample
  4941.   signe%=128
  4942.   IF CARD{ADD(adsam%,16)}<>0
  4943.     signe%=0
  4944.   ENDIF
  4945.   len%=MAX(0,MIN(MUL(LONG{ADD(adsam%,&H1A)},MUL(res%,stereo%)),SUB(lonsam%,128)) AND -2)
  4946.   rep_avr%=MUL(LONG{ADD(adsam%,&H1E)},MUL(res%,stereo%)) AND -2
  4947.   rep2_avr%=MUL(LONG{ADD(adsam%,&H22)},MUL(res%,stereo%)) AND -2
  4948.   loop%=CARD{ADD(adsam%,18)}
  4949.   IF stereo%<>1                                 ! Stereo
  4950.     GOSUB dialog("STEREO","Sample stereo.|What must I load ?","Left|Right|Mix|Cancel",MOUSEX,MOUSEY)
  4951.     IF bouton%=3                                ! Cancel
  4952.       IF NOT buf!
  4953.         GOSUB chg_taille_sample(sample%,0)
  4954.       ENDIF
  4955.       GOTO fin_load_sample_avr
  4956.     ENDIF
  4957.     GOSUB bee(TRUE)
  4958.     len%=len% AND -4
  4959.     a%=ADD(adsam%,128)
  4960.     b%=a%
  4961.     IF bouton%=0                                ! 1 seul canal: gauche
  4962.       ~C:g_stereo_2_mono_one%(L:b%,L:a%,L:len%,W:res%)
  4963.     ELSE IF bouton%=1                           ! 1 seul canal: droit
  4964.       ADD b%,res%
  4965.       ~C:g_stereo_2_mono_one%(L:b%,L:a%,L:len%,W:res%)
  4966.     ELSE                                        ! Mixage des deux canaux
  4967.       ~C:g_stereo_2_mono_ave%(L:b%,L:a%,L:len%,W:res%)
  4968.     ENDIF
  4969.     len%=SHR(len%,1)
  4970.   ENDIF
  4971.   IF NOT buf!
  4972.     a%=FN adresse(sample%)
  4973.   ELSE
  4974.     a%=adsam%
  4975.   ENDIF
  4976.   BMOVE ADD(adsam%,128),a%,len%
  4977.   IF NOT buf!
  4978.     GOSUB chg_taille_sample(sample%,len%)
  4979.   ELSE
  4980.     mark_2%=ADD(mark_1%,len%)
  4981.   ENDIF
  4982.   IF signe%<>0
  4983.     ~C:g_signe_sample%(L:a%,L:len%,W:res%)      ! Signature
  4984.   ENDIF
  4985.   rep_avr%=MAX(0,MIN(SUB(len%,2),rep_avr%))
  4986.   IF NOT buf!
  4987.     GOSUB chg_sam_balance(sample%,&HFFFF)
  4988.     GOSUB chg_sam_nbits(sample%,res%)
  4989.     GOSUB chg_sam_freq(sample%,freq%)
  4990.     GOSUB chg_sam_volume(sample%,&H100)
  4991.     GOSUB chg_sam_finetune(sample%,0)
  4992.     GOSUB chg_sam_length(sample%,len%)
  4993.     IF loop%=0                                    ! Non boucle
  4994.       GOSUB chg_sam_repeat(sample%,0)
  4995.       GOSUB chg_sam_replen(sample%,2)
  4996.     ELSE                                          ! Boucle
  4997.       GOSUB chg_sam_repeat(sample%,rep_avr%)
  4998.       GOSUB chg_sam_replen(sample%,MAX(SUB(rep2_avr%,rep_avr%),2))
  4999.     ENDIF
  5000.   ELSE
  5001.     freq_buffer%=freq%
  5002.   ENDIF
  5003.   IF NOT buf!
  5004.     ' Le nom
  5005.     b$=a$
  5006.     WHILE INSTR(b$,"\")>0
  5007.       a%=INSTR(b$,"\")
  5008.       b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5009.     WEND
  5010.     GOSUB chg_samplename(b$,sample%)
  5011.   ENDIF
  5012. fin_load_sample_avr:
  5013.   ~FRE(0)
  5014. RETURN
  5015. PROCEDURE load_sample_wav(buf!)
  5016.   ' Besoin (Load_Sample2): a$, adsam% et lonsam%
  5017.   ' Change (Load_Sample2): freq%, res%
  5018.   ' *** Ne tient pas compte exactement de la structure en chunks
  5019.   LOCAL a%,b%,len%,nchannels%
  5020.   LOCAL b$
  5021.   GOSUB intel_l(ADD(adsam%,24))
  5022.   GOSUB intel_l(ADD(adsam%,40))
  5023.   GOSUB intel_w(ADD(adsam%,22))
  5024.   GOSUB intel_w(ADD(adsam%,34))
  5025.   nchannels%=CARD{ADD(adsam%,34)}
  5026.   res%=SHR(CARD{ADD(adsam%,34)},3)
  5027.   len%=MAX(MIN(LONG{ADD(adsam%,40)},SUB(lonsam%,44)),0) AND -2
  5028.   freq%=LONG{ADD(adsam%,24)}
  5029.   ncanal%=0
  5030.   IF NOT buf!
  5031.     GOSUB chg_sam_balance(sample%,&HFFFF)
  5032.     GOSUB chg_sam_nbits(sample%,res%)
  5033.     GOSUB chg_sam_freq(sample%,freq%)
  5034.     GOSUB chg_sam_volume(sample%,&H100)
  5035.     GOSUB chg_sam_finetune(sample%,0)
  5036.     GOSUB chg_sam_length(sample%,len%)
  5037.     GOSUB chg_sam_repeat(sample%,0)
  5038.     GOSUB chg_sam_replen(sample%,2)
  5039.   ELSE
  5040.     freq_buffer%=freq%
  5041.   ENDIF
  5042.   IF len%>0
  5043.     IF NOT buf!
  5044.       a%=FN adresse(sample%)
  5045.     ELSE
  5046.       a%=adsam%
  5047.     ENDIF
  5048.     BMOVE ADD(adsam%,44),a%,len%
  5049.     IF res%=2                      ! 16 bits
  5050.       ~C:g_intel_16_bits%(L:a%,L:len%)
  5051.     ENDIF
  5052.     IF res%=1
  5053.       ~C:g_signe_sample%(L:a%,L:len%,W:res%)    ! Signature seulement pour le 8 bits
  5054.     ENDIF
  5055.     IF nchannels%=2                             ! Stereo
  5056.       GOSUB dialog("STEREO","Sample stereo.|What must I load ?","Left|Right|Mix|Cancel",MOUSEX,MOUSEY)
  5057.       IF bouton%=3                              ! Cancel
  5058.         IF NOT buf!
  5059.           GOSUB chg_taille_sample(sample%,0)
  5060.         ENDIF
  5061.         GOTO fin_load_sample_wav
  5062.       ENDIF
  5063.       GOSUB bee(TRUE)
  5064.       len%=len% AND -4
  5065.       b%=adsam%
  5066.       IF bouton%=0                              ! 1 seul canal: gauche
  5067.         ~C:g_stereo_2_mono_one%(L:b%,L:adsam%,L:len%,W:res%)
  5068.       ELSE IF bouton%=1                         ! 1 seul canal: droit
  5069.         ADD b%,res%
  5070.         ~C:g_stereo_2_mono_one%(L:b%,L:adsam%,L:len%,W:res%)
  5071.       ELSE                                      ! Mixage des deux canaux
  5072.         ~C:g_stereo_2_mono_ave%(L:b%,L:adsam%,L:len%,W:res%)
  5073.       ENDIF
  5074.       len%=SHR(len%,1)
  5075.     ENDIF
  5076.   ENDIF
  5077.   IF NOT buf!
  5078.     GOSUB chg_taille_sample(sample%,len%)
  5079.   ELSE
  5080.     mark_2%=ADD(mark_1%,len%)
  5081.   ENDIF
  5082.   ' Le nom
  5083.   IF NOT buf!
  5084.     b$=a$
  5085.     WHILE INSTR(b$,"\")>0
  5086.       a%=INSTR(b$,"\")
  5087.       b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5088.     WEND
  5089.     GOSUB chg_samplename(b$,sample%)
  5090.   ENDIF
  5091. fin_load_sample_wav:
  5092.   ~FRE(0)
  5093. RETURN
  5094. PROCEDURE load_sample_voc(buf!)
  5095.   ' Besoin (Load_Sample2): a$, adsam% et lonsam%
  5096.   ' Change (Load_Sample2): signe%, freq%, res%
  5097.   ' *** Attention, gere tres incompletement le type 9 (pas de stereo)
  5098.   LOCAL i%,total_len%,total_len2%,offset%,adr_block%,type%,sect_nbr%
  5099.   LOCAL block_len%,block_adr%,new_block_adr%
  5100.   LOCAL sname$,offset$,size$
  5101.   LOCAL ok!,first!
  5102.   IF BYTE{ADD(adsam%,23)}=1                     ! Pourquoi ???
  5103.     GOSUB intel_w(ADD(adsam%,20))
  5104.     offset%=CARD{ADD(adsam%,20)}
  5105.     '
  5106.     ' Cherche la taille du sample et des differents blocs qui le composent
  5107.     '
  5108.     signe%=0
  5109.     adr_block%=ADD(adsam%,offset%)
  5110.     total_len%=0                                ! La longueur finale du sample
  5111.     sect_nbr%=0
  5112.     sname$=""
  5113.     offset$=""
  5114.     size$=""
  5115.     type$=""
  5116.     ok!=TRUE
  5117.     first!=TRUE
  5118.     REPEAT
  5119.       type%=BYTE{adr_block%}
  5120.       INC adr_block%
  5121.       type$=type$+CHR$(type%)
  5122.       SELECT type%
  5123.       CASE 0
  5124.         ok!=FALSE
  5125.       CASE 1,2                                  ! Bloc de donnees
  5126.         GOSUB intel_3(adr_block%)
  5127.         block_len%=SHR(LONG{adr_block%},8)
  5128.         ADD adr_block%,3
  5129.         IF type%=1
  5130.           IF first!
  5131.             freq%=DIV(1000000,SUB(256,BYTE{adr_block%}))
  5132.             first!=FALSE
  5133.           ENDIF
  5134.           ADD adr_block%,2
  5135.           SUB block_len%,2
  5136.         ENDIF
  5137.         offset$=offset$+MKL$(SUB(adr_block%,adsam%))
  5138.         size$=size$+MKL$(block_len%)
  5139.         INC sect_nbr%
  5140.         ADD total_len%,block_len%
  5141.         ADD adr_block%,block_len%
  5142.       CASE 3                                    ! Blanc
  5143.         block_len%=SHR(LONG{adr_block%},8)
  5144.         ADD adr_block%,6
  5145.         offset$=offset$+MKL$(total_len%)
  5146.         size$=size$+MKL$(block_len%)
  5147.         INC sect_nbr%
  5148.         ADD total_len%,block_len%
  5149.       CASE 5                                    ! Le nom
  5150.         GOSUB intel_3(adr_block%)
  5151.         block_len%=SHR(LONG{adr_block%},8)
  5152.         ADD adr_block%,3
  5153.         sname$=STRING$(block_len%,0)
  5154.         BMOVE adr_block%,V:sname$,block_len%
  5155.         ADD adr_block%,block_len%
  5156.       CASE 9                                    ! *** Flou total...
  5157.         GOSUB intel_3(adr_block%)
  5158.         block_len%=SUB(SHR(LONG{adr_block%},8),12)
  5159.         ADD adr_block%,3
  5160.         GOSUB intel_w(adr_block%)
  5161.         freq%=CARD{adr_block%}
  5162.         res%=SHR(BYTE{ADD(adr_block%,4)},3)
  5163.         ' Nombre de voies en + 05.b ?
  5164.         signe%=BTST(BYTE{ADD(adr_block%,6)},2)
  5165.         ADD adr_block%,12
  5166.         offset$=offset$+MKL$(SUB(adr_block%,adsam%))
  5167.         size$=size$+MKL$(block_len%)
  5168.         INC sect_nbr%
  5169.         ADD total_len%,block_len%
  5170.         ADD adr_block%,block_len%
  5171.       ENDSELECT
  5172.     UNTIL (NOT ok!) OR adr_block%>=ADD(adsam%,lonsam%)
  5173.     total_len%=total_len% AND -2
  5174.     '
  5175.     ' Recompose correctement le sample
  5176.     '
  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%,total_len%)
  5184.       GOSUB chg_sam_repeat(sample%,0)
  5185.       GOSUB chg_sam_replen(sample%,2)
  5186.     ELSE
  5187.       freq_buffer%=freq%
  5188.     ENDIF
  5189.     IF total_len%>0
  5190.       IF total_len%>lonsam%
  5191.         IF NOT buf!
  5192.           GOSUB chg_taille_sample(sample%,total_len%)
  5193.         ENDIF
  5194.       ENDIF
  5195.       ' Passe 1: On ne garde que les donnees brutes
  5196.       new_block_adr%=adsam%
  5197.       FOR i%=0 TO PRED(sect_nbr%)
  5198.         SELECT BYTE{ADD(V:type$,i%)}
  5199.         CASE 1,2,9
  5200.           block_adr%=ADD(adsam%,LONG{ADD(V:offset$,SHL(i%,2))})
  5201.           block_len%=LONG{ADD(V:size$,SHL(i%,2))}
  5202.           block_len%=MIN(block_len%,SUB(ADD(adsam%,total_len%),new_block_adr%)) ! Si on a arrondi total_len%, ne pas depasser!
  5203.           BMOVE block_adr%,new_block_adr%,block_len%
  5204.           ADD new_block_adr%,block_len%
  5205.         ENDSELECT
  5206.       NEXT i%
  5207.       ' Passe 2: On insere les blancs s'il y en a
  5208.       FOR i%=0 TO PRED(sect_nbr%)
  5209.         SELECT BYTE{ADD(V:type$,i%)}
  5210.         CASE 3
  5211.           block_adr%=ADD(adsam%,LONG{ADD(V:offset$,SHL(i%,2))})
  5212.           new_block_adr%=ADD(block_adr%,LONG{ADD(V:size$,SHL(i%,2))})
  5213.           block_len%=SUB(ADD(adsam%,total_len%),new_block_adr%)
  5214.           IF block_len%>0
  5215.             BMOVE block_adr%,new_block_adr%,block_len%
  5216.             GOSUB clear_mem(block_adr%,SUB(new_block_adr%,block_adr%))
  5217.           ENDIF
  5218.         ENDSELECT
  5219.       NEXT i%
  5220.       IF res%=2                    ! 16 bits
  5221.         ~C:g_intel_16_bits%(L:adsam%,L:total_len%)
  5222.       ENDIF
  5223.       IF signe%=0                               ! Signature
  5224.         ~C:g_signe_sample%(L:adsam%,L:total_len%,W:res%)
  5225.       ENDIF
  5226.     ENDIF
  5227.     IF total_len%<lonsam%
  5228.       IF NOT buf!
  5229.         GOSUB chg_taille_sample(sample%,total_len%)
  5230.       ELSE
  5231.         mark_2%=ADD(mark_1%,total_len%)
  5232.       ENDIF
  5233.     ENDIF
  5234.     ' Le nom
  5235.     IF NOT buf!
  5236.       IF LEN(sname$)>0
  5237.         GOSUB chg_samplename(sname$,sample%)
  5238.       ELSE
  5239.         b$=a$
  5240.         WHILE INSTR(b$,"\")>0
  5241.           a%=INSTR(b$,"\")
  5242.           b$=RIGHT$(b$,SUB(LEN(b$),a%))
  5243.         WEND
  5244.         GOSUB chg_samplename(b$,sample%)
  5245.       ENDIF
  5246.     ENDIF
  5247.   ELSE
  5248.     erreur%=2
  5249.   ENDIF
  5250.   ~FRE(0)
  5251. RETURN
  5252. PROCEDURE save_module
  5253.   LOCAL time_taken%,erreur%
  5254.   LOCAL a$
  5255.   erreur%=0
  5256.   IF flag_registered!
  5257.     IF km%=2 AND nfile_module$<>""
  5258.       a$=npath_module$+nfile_module$
  5259.     ELSE
  5260.       CLS
  5261.       IF next_module$="*.MOD"
  5262.         GOSUB cadre_texte("EXPORT MODULE .MOD",0,0,PRED(scr_ncol%))
  5263.         FILESELECT npath_module$+"*.MOD",nfile_module$,a$
  5264.       ELSE IF next_module$="*.S3M"
  5265.         GOSUB cadre_texte("EXPORT MODULE .S3M",0,0,PRED(scr_ncol%))
  5266.         FILESELECT npath_module$+"*.S3M",nfile_module$,a$
  5267.       ELSE IF next_module$="*.GTK"
  5268.         GOSUB cadre_texte("SAVE OLD MODULE",0,0,PRED(scr_ncol%))
  5269.         FILESELECT npath_module$+"*.GTK",nfile_module$,a$
  5270.       ELSE
  5271.         GOSUB cadre_texte("SAVE MODULE",0,0,PRED(scr_ncol%))
  5272.         FILESELECT npath_module$+"*.GT2",nfile_module$,a$
  5273.       ENDIF
  5274.     ENDIF
  5275.     IF a$<>""
  5276.       CLS
  5277.       GOSUB cadre_texte("WAITING : BACK UP OF THE MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  5278.       IF flag_backup_modules!
  5279.         e%=FN backup_file(a$)
  5280.         IF e%<0
  5281.           GOSUB dialog("ERROR","Error during the backup of the file|"+a$,"Continue",MOUSEX,MOUSEY)
  5282.         ENDIF
  5283.       ENDIF
  5284.       CLS
  5285.       GOSUB cadre_texte("WAITING : SAVING MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  5286.       GOSUB rec_result("Saving module "+a$+"...",TRUE)
  5287.       time_taken%=TIMER
  5288.       GOSUB save_module2
  5289.       time_taken%=SUB(TIMER,time_taken%)
  5290.       GOSUB separe_nom_chemin(a$)
  5291.       nfile_module$=nfile_$
  5292.       npath_module$=npath_$
  5293.     ENDIF
  5294.     SELECT erreur%
  5295.     CASE 0
  5296.       GOSUB rec_result("Complete. Time for saving: "+FN time_hmsd$(time_taken%),TRUE)
  5297.     CASE -1
  5298.       GOSUB rec_result("Error: Disk full"+STR$(erreur%),TRUE)
  5299.       GOSUB dialog("FILE","Error:|Disk full","Cancel",MOUSEX,MOUSEY)
  5300.     DEFAULT
  5301.       GOSUB rec_result("Disk error: "+STR$(erreur%),TRUE)
  5302.       GOSUB dialog("FILE","Error:|"+STR$(erreur%),"Cancel",MOUSEX,MOUSEY)
  5303.     ENDSELECT
  5304.   ELSE
  5305.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  5306.   ENDIF
  5307.   GOSUB affiche_panneau_principal
  5308. RETURN
  5309. PROCEDURE save_module2
  5310.   ' Fournir a$ nom du module
  5311.   LOCAL i%,a%
  5312.   LOCAL handle_fichier%,code_erreur_fichier%
  5313.   LOCAL filename$
  5314.   ~FRE(0)
  5315.   erreur%=0
  5316.   warning%=0
  5317.   GOSUB bee(TRUE)
  5318.   module&(1)=ADD(&H4B00,gtk_file_vnum%)
  5319.   filename$=a$+CHR$(0)
  5320.   handle_fichier%=GEMDOS(60,L:V:filename$,W:0)
  5321.   IF handle_fichier%>=0
  5322.     IF next_module$="*.MOD"
  5323.       GOSUB save_module_mod
  5324.     ELSE IF next_module$="*.S3M"
  5325.       GOSUB save_module_s3m
  5326.     ELSE IF next_module$="*.GTK"
  5327.       GOSUB save_module_gtk
  5328.     ELSE
  5329.       GOSUB save_module_gt2
  5330.     ENDIF
  5331.     code_erreur_fichier%=GEMDOS(62,W:handle%)
  5332.     IF code_erreur_fichier%<0
  5333.       erreur%=code_erreur_fichier%
  5334.     ENDIF
  5335.   ELSE
  5336.     erreur%=handle_fichier%
  5337.   ENDIF
  5338.   GOSUB bee(FALSE)
  5339. RETURN
  5340. PROCEDURE save_module_gt2
  5341.   ' Variables utilisees pour la sauvegarde:
  5342.   ' handle_fichier%, code_erreur_fichier%, erreur%
  5343.   LOCAL a%,i%,j%,nbs%,nbi%,nbe%,total_len%
  5344.   LOCAL loopend1%,loopend2%
  5345.   LOCAL ok!
  5346.   LOCAL a$,chk$,lsam$,lins$,lenv$
  5347.   ~FRE(0)
  5348.   GOSUB rec_result("  Saving in GT2 format (Graoumf Tracker module).",TRUE)
  5349.   '
  5350.   ' Travail preparatoire
  5351.   '
  5352.   ' Recherche les samples et les instruments utilises
  5353.   GOSUB rec_result("  Instruments used... ",FALSE)
  5354.   lsam$=STRING$(256,0)
  5355.   lins$=STRING$(256,0)
  5356.   a%=C:g_find_used_samples_and_instruments%(L:r_adr_sample%,L:V:instrset%(0,0),L:V:lsam$,L:V:lins$)
  5357.   nbi%=a% AND &HFFFF
  5358.   nbs%=SWAP(a%) AND &HFFFF
  5359.   GOSUB rec_result(STR$(nbi%)+".",TRUE)
  5360.   GOSUB rec_result("  Samples used... ",FALSE)
  5361.   GOSUB rec_result(STR$(nbs%)+".",TRUE)
  5362.   ' Recherche des enveloppes utilisees
  5363.   GOSUB rec_result("  Envelopes used:... ",FALSE)
  5364.   lenv$=STRING$(192,0)
  5365.   nbe%=0
  5366.   FOR i%=1 TO 63
  5367.     FOR j%=0 TO 2                       ! Critere : longueur d'une section > 1
  5368.       IF FN env_sectlen(i%,j%,0)>1 OR FN env_sectlen(i%,j%,1)>1
  5369.         BYTE{ADD(V:lenv$,ADD(MUL(i%,3),j%))}=1
  5370.         INC nbe%
  5371.       ENDIF
  5372.     NEXT j%
  5373.   NEXT i%
  5374.   GOSUB rec_result(STR$(nbe%)+".",TRUE)
  5375.   '
  5376.   ' Chunk d'informations generales
  5377.   '
  5378.   GOSUB rec_result("  Saving header chunk... ",FALSE)
  5379.   a$=DATE$
  5380.   a%=FN mod_tempo                       ! Tempo
  5381.   chk$="GT2"+CHR$(gt2_file_vnum%)+MKL$(0)+FN songname$+FN songcomment$
  5382.   chk$=chk$+CHR$(VAL(LEFT$(a$,2)))+CHR$(VAL(MID$(a$,4,2)))+MKI$(VAL(RIGHT$(a$,4)))
  5383.   chk$=chk$+"Graoumf Tracker v"+STR$(gtk_version%/10000)        ! Nom du Tracker
  5384.   chk$=chk$+SPACE$(SUB(228,LEN(chk$)))
  5385.   chk$=chk$+MKI$(CARD{r_mod_speed%})+MKI$(a%)+MKI$(CARD{r_master_vol%})+MKI$(nbr_track%)
  5386.   FOR i%=0 TO PRED(nbr_track%)                                  ! Les balances
  5387.     chk$=chk$+MKI$(CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,i%))})
  5388.   NEXT i%
  5389.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5390.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5391.   IF code_erreur_fichier%<0
  5392.     erreur%=code_erreur_fichier%
  5393.     GOTO sav_module_gt2_erreur
  5394.   ENDIF
  5395.   GOSUB rec_result("done.",TRUE)
  5396.   '
  5397.   ' Chunk des volumes des pistes
  5398.   '
  5399.   GOSUB rec_result("  Saving track volume chunk... ",FALSE)
  5400.   chk$="TVOL"+MKL$(0)+MKI$(nbr_track%)
  5401.   FOR i%=0 TO PRED(nbr_track%)
  5402.     chk$=chk$+MKI$(FN track_volume_lin(i%))
  5403.   NEXT i%
  5404.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5405.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5406.   IF code_erreur_fichier%<0
  5407.     erreur%=code_erreur_fichier%
  5408.     GOTO sav_module_gt2_erreur
  5409.   ENDIF
  5410.   GOSUB rec_result("done.",TRUE)
  5411.   '
  5412.   ' Chunk de configuration du tracker
  5413.   '
  5414.   IF flag_gt2cnf!
  5415.     GOSUB rec_result("  Saving config. chunk... ",FALSE)
  5416.     chk$="TCN1"+MKL$(2660)+MKI$(0)+MKI$(songpos%)+MKI$(posligne%)+MKI$(n_preset%)
  5417.     chk$=chk$+MKI$(type_affpiste%)+MKI$(curs_col%)+MKI$(curs_x%)+MKI$(ADD(play%,SHL(edit%,2)))
  5418.     chk$=chk$+MKI$(octave%)+MKI$(line_step%)+MKI$(instr%)+MKI$(sample%)
  5419.     FOR i%=0 TO 31
  5420.       chk$=chk$+MKI$(nbr_colonnes%(i%))
  5421.     NEXT i%
  5422.     FOR i%=0 TO 31
  5423.       chk$=chk$+SPACE$(16)                      ! *** Faire de vrais noms
  5424.     NEXT i%
  5425.     a$=STRING$(2048,0)
  5426.     BMOVE V:preset&(0,0),V:a$,2048
  5427.     chk$=chk$+a$
  5428.     a%=0
  5429.     FOR i%=0 TO 31
  5430.       IF FN track_onoff(i%)<>0
  5431.         a%=a% OR SHL(1,i%)
  5432.       ENDIF
  5433.     NEXT i%
  5434.     chk$=chk$+MKL$(a%)
  5435.     LONG{ADD(V:chk$,4)}=LEN(chk$)
  5436.     code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5437.     IF code_erreur_fichier%<0
  5438.       erreur%=code_erreur_fichier%
  5439.       GOTO sav_module_gt2_erreur
  5440.     ENDIF
  5441.     GOSUB rec_result("done.",TRUE)
  5442.   ENDIF
  5443.   '
  5444.   ' Chunk de sequence de patterns
  5445.   '
  5446.   GOSUB rec_result("  Saving song chunk... ",FALSE)
  5447.   chk$="SONG"+MKL$(ADD(FN song_length,12))+MKI$(FN song_length)+MKI$(FN song_repeat)
  5448.   FOR i%=0 TO PRED(FN song_length)
  5449.     chk$=chk$+MKI$(song&(i%))
  5450.   NEXT i%
  5451.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5452.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5453.   IF code_erreur_fichier%<0
  5454.     erreur%=code_erreur_fichier%
  5455.     GOTO sav_module_gt2_erreur
  5456.   ENDIF
  5457.   GOSUB rec_result("done.",TRUE)
  5458.   '
  5459.   ' Chunk d'ensemble de patterns
  5460.   '
  5461.   GOSUB rec_result("  Saving pattern chunks... ",FALSE)
  5462.   chk$="PATS"+MKL$(12)+MKI$(nbr_track%)+MKI$(SUCC(FN last_pat_util))
  5463.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5464.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5465.   IF code_erreur_fichier%<0
  5466.     erreur%=code_erreur_fichier%
  5467.     GOTO sav_module_gt2_erreur
  5468.   ENDIF
  5469.   '
  5470.   ' Chunks des patterns
  5471.   '
  5472.   loopend1%=FN last_pat_util
  5473.   i%=0
  5474.   WHILE i%<=loopend1%
  5475.     a%=MAX(FN adr_patchunk(i%)*(-flag_registered2!),&H1498)     ! A cause de la 2eme protection
  5476.     code_erreur_fichier%=FN fwrite(handle_fichier%,FN lon_patchunk(i%),a%)
  5477.     IF code_erreur_fichier%<0
  5478.       erreur%=code_erreur_fichier%
  5479.       GOTO sav_module_gt2_erreur
  5480.     ENDIF
  5481.     INC i%
  5482.   WEND
  5483.   GOSUB rec_result("done.",TRUE)
  5484.   '
  5485.   ' Chunk d'ensemble d'instruments
  5486.   '
  5487.   GOSUB rec_result("  Saving instrument chunks... ",FALSE)
  5488.   chk$="ORCH"+MKL$(10)+MKI$(nbi%)
  5489.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  5490.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5491.   IF code_erreur_fichier%<0
  5492.     erreur%=code_erreur_fichier%
  5493.     GOTO sav_module_gt2_erreur
  5494.   ENDIF
  5495.   '
  5496.   ' Chunks des instruments
  5497.   '
  5498.   i%=1
  5499.   WHILE i%<=255
  5500.     IF BYTE{ADD(V:lins$,i%)}<>0
  5501.       a%=MAX(V:instrset%(0,i%)*(-flag_registered2!),&H1264)     ! A cause de la 2eme protection
  5502.       code_erreur_fichier%=FN fwrite(handle_fichier%,instrset%(1,i%),a%)
  5503.       IF code_erreur_fichier%<0
  5504.         erreur%=code_erreur_fichier%
  5505.         GOTO sav_module_gt2_erreur
  5506.       ENDIF
  5507.     ENDIF
  5508.     INC i%
  5509.   WEND
  5510.   GOSUB rec_result("done.",TRUE)
  5511.   '
  5512.   ' Chunks des samples
  5513.   '
  5514.   GOSUB rec_result("  Saving sample chunks... ",FALSE)
  5515.   i%=1
  5516.   WHILE i%<=255
  5517.     IF BYTE{ADD(V:lsam$,i%)}<>0
  5518.       a%=MAX(FN adrsamchk(i%)*(-flag_registered2!),&H1529)      ! A cause de la 2eme protection
  5519.       code_erreur_fichier%=FN fwrite(handle_fichier%,FN lonsamchk(i%),a%)
  5520.       IF code_erreur_fichier%<0
  5521.         erreur%=code_erreur_fichier%
  5522.         GOTO sav_module_gt2_erreur
  5523.       ENDIF
  5524.     ENDIF
  5525.     INC i%
  5526.   WEND
  5527.   GOSUB rec_result("done.",TRUE)
  5528.   '
  5529.   ' Chunks des enveloppes
  5530.   '
  5531.   GOSUB rec_result("  Saving envelope chunks... ",FALSE)
  5532.   i%=1
  5533.   WHILE i%<=63
  5534.     ' 8776 - attempted correction of envelope bug - /sjx.
  5535.     '    j%=2
  5536.     j%=0
  5537.     WHILE j%<=2
  5538.       IF BYTE{ADD(V:lenv$,ADD(MUL(i%,3),j%))}<>0
  5539.         ' /sjx - wtf *was* this boobytrap shit, anyway?
  5540.         a%=FN env_chunkadr(i%,j%)
  5541.         code_erreur_fichier%=FN fwrite(handle_fichier%,FN env_chunklen(i%,j%),a%)
  5542.         IF code_erreur_fichier%<0
  5543.           erreur%=code_erreur_fichier%
  5544.           GOTO sav_module_gt2_erreur
  5545.         ENDIF
  5546.       ENDIF
  5547.       INC j%
  5548.     WEND
  5549.     INC i%
  5550.   WEND
  5551.   GOSUB rec_result("done.",TRUE)
  5552.   '
  5553.   ' Chunk de fin
  5554.   '
  5555.   GOSUB rec_result("  Saving end chunks... ",FALSE)
  5556.   chk$="ENDC"+MKL$(12)+MKL$(0)
  5557.   total_len%=0          ! *********** Trouver la vraie longueur!!!
  5558.   LONG{ADD(V:chk$,8)}=total_len%
  5559.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(chk$),V:chk$)
  5560.   IF code_erreur_fichier%<0
  5561.     erreur%=code_erreur_fichier%
  5562.     GOTO sav_module_gt2_erreur
  5563.   ENDIF
  5564.   GOSUB rec_result("done.",TRUE)
  5565.   '
  5566. sav_module_gt2_erreur:
  5567.   ~FRE(0)
  5568. RETURN
  5569. PROCEDURE save_module_gtk
  5570.   LOCAL a%,i%,j%,nblm%
  5571.   LOCAL loopend1%
  5572.   LOCAL a$
  5573.   GOSUB rec_result("  Saving in GTK format (old Graoumf Tracker module).",TRUE)
  5574.   '
  5575.   ' Le header du module
  5576.   '
  5577.   GOSUB rec_result("  Saving module header... ",FALSE)
  5578.   nblm%=FN nbr_lines_maxi
  5579.   a$=STRING$(206,0)
  5580.   BMOVE V:module&(0),V:a$,206
  5581.   CARD{ADD(V:a$,198)}=nblm%
  5582.   code_erreur_fichier%=FN fwrite(handle_fichier%,206,V:a$)
  5583.   IF code_erreur_fichier%<0
  5584.     erreur%=code_erreur_fichier%
  5585.     GOTO sav_module_gtk_erreur
  5586.   ENDIF
  5587.   GOSUB rec_result("done.",TRUE)
  5588.   '
  5589.   ' Les headers des samples
  5590.   '
  5591.   GOSUB rec_result("  Saving sample headers... ",FALSE)
  5592.   j%=1
  5593.   loopend1%=module&(98)
  5594.   WHILE j%<=loopend1%
  5595.     i%=FN isample(j%,48)
  5596.     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%))
  5597.     code_erreur_fichier%=FN fwrite(handle_fichier%,64,V:a$)
  5598.     IF code_erreur_fichier%<0
  5599.       erreur%=code_erreur_fichier%
  5600.       GOTO sav_module_gtk_erreur
  5601.     ENDIF
  5602.     INC j%
  5603.   WEND
  5604.   GOSUB rec_result("done.",TRUE)
  5605.   '
  5606.   ' La song
  5607.   '
  5608.   GOSUB rec_result("  Saving song... ",FALSE)
  5609.   code_erreur_fichier%=FN fwrite(handle_fichier%,512,V:song&(0))
  5610.   IF code_erreur_fichier%<0
  5611.     erreur%=code_erreur_fichier%
  5612.     GOTO sav_module_gtk_erreur
  5613.   ENDIF
  5614.   GOSUB rec_result("done.",TRUE)
  5615.   '
  5616.   ' Les patterns
  5617.   '
  5618.   GOSUB rec_result("  Saving patterns... ",FALSE)
  5619.   loopend1%=FN last_pat_util
  5620.   i%=0
  5621.   WHILE i%<=loopend1%
  5622.     nbl%=FN nbr_lines(i%)
  5623.     a$=STRING$(MIN(MUL(MUL(nbr_track%,nblm%),5),32767),0)
  5624.     BMOVE FN adr_pat(i%),V:a$,MUL(MUL(nbr_track%,nbl%),5)
  5625.     IF nbl%<nblm%
  5626.       CARD{ADD(V:a$,SUB(MUL(MUL(nbr_track%,nbl%),5),3))}=&HD00
  5627.     ENDIF
  5628.     IF EXP(flag_registered2!)=1                 ! *** 2eme protection
  5629.       a$=STRING$(LEN(a$),0)
  5630.     ENDIF
  5631.     code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(a$),V:a$)
  5632.     IF code_erreur_fichier%<0
  5633.       erreur%=code_erreur_fichier%
  5634.       GOTO sav_module_gtk_erreur
  5635.     ENDIF
  5636.     INC i%
  5637.   WEND
  5638.   GOSUB rec_result("done.",TRUE)
  5639.   '
  5640.   ' Les samples
  5641.   '
  5642.   GOSUB rec_result("  Saving samples... ",FALSE)
  5643.   j%=1
  5644.   loopend1%=module&(98)
  5645.   WHILE j%<=loopend1%
  5646.     i%=FN isample(j%,48)
  5647.     IF FN length(i%)>0
  5648.       a%=MAX(FN adresse(i%)*(-flag_registered2!),&H1895)        ! *** 2eme protection
  5649.       code_erreur_fichier%=FN fwrite(handle_fichier%,FN length(i%),a%)
  5650.       IF code_erreur_fichier%<0
  5651.         erreur%=code_erreur_fichier%
  5652.         GOTO sav_module_gtk_erreur
  5653.       ENDIF
  5654.     ENDIF
  5655.     INC j%
  5656.   WEND
  5657.   GOSUB rec_result("done.",TRUE)
  5658.   '
  5659. sav_module_gtk_erreur:
  5660.   ~FRE(0)
  5661. RETURN
  5662. PROCEDURE save_module_mod
  5663.   ' Sauve un module au format .MOD
  5664.   LOCAL a%,b%,c%,d%,e%,i%,i2%,j%,k%,n%,nblm%
  5665.   LOCAL ss%,st%
  5666.   LOCAL loopend1%,loopend2%
  5667.   LOCAL a&,b&
  5668.   LOCAL flag_fast!
  5669.   LOCAL a$,lig$,sam$,sam2$
  5670.   LOCAL mod_header$
  5671.   ~FRE(0)
  5672.   GOSUB rec_result("  Saving in MOD format (ProTracker module).",TRUE)
  5673.   nblm%=FN nbr_lines_maxi
  5674.   IF nblm%=64 AND nbr_track%<>4                 ! On doit le sauver au format FastTracker ?
  5675.     flag_fast!=TRUE
  5676.   ELSE
  5677.     flag_fast!=FALSE
  5678.   ENDIF
  5679.   mod_header$=LEFT$(FN songname$,20)
  5680.   mod_header$=mod_header$+SPACE$(SUB(20,LEN(mod_header$)))
  5681.   '
  5682.   ' Rearrange les samples pour qu'ils puissent tous tenir
  5683.   '
  5684.   GOSUB rec_result("  Saving sample headers... ",FALSE)
  5685.   sam$=STRING$(256,0)                           ! Correspondance des samples pour la conversion des patterns
  5686.   sam2$=""
  5687.   FOR i%=1 TO 31
  5688.     sam2$=sam2$+CHR$(i%)
  5689.   NEXT i%
  5690.   BMOVE V:sam2$,SUCC(V:sam$),31
  5691.   i%=32
  5692.   j%=0
  5693.   REPEAT
  5694.     WHILE FN length(FN isample(BYTE{ADD(V:sam2$,j%)},48))<>0 AND j%<31
  5695.       INC j%
  5696.     WEND                                        ! On a trouve un emplacement libre
  5697.     EXIT IF j%>=31                              ! C'etait le dernier ? On sort alors...
  5698.     IF FN length(FN isample(i%,48))>0           ! Si on a un sample >32, on le met la.
  5699.       BYTE{ADD(V:sam$,i%)}=SUCC(j%)
  5700.       BYTE{ADD(V:sam2$,j%)}=i%
  5701.       INC j%
  5702.     ENDIF
  5703.     INC i%
  5704.   UNTIL i%>255
  5705.   ss%=MIN(j%,31)
  5706.   st%=0
  5707.   FOR i%=1 TO 255
  5708.     IF FN length(FN isample(BYTE{ADD(V:sam2$,j%)},48))<>0
  5709.       INC st%
  5710.     ENDIF
  5711.   NEXT i%
  5712.   '
  5713.   ' Sauve les headers de sample
  5714.   '
  5715.   FOR j%=0 TO 30
  5716.     i2%=BYTE{ADD(V:sam2$,j%)}
  5717.     i%=FN isample(i2%,48)
  5718.     a$=LEFT$(FN samplename$(i%),22)             ! Nom du sample
  5719.     a$=a$+SPACE$(SUB(22,LEN(a$)))
  5720.     mod_header$=mod_header$+a$
  5721.     c%=FN resol(i%)
  5722.     a&=MIN(SHR(DIV(FN length(i%),c%),1),&H7FFF) ! Longueur du sample
  5723.     mod_header$=mod_header$+MKI$(a&)
  5724.     b&=ADD(SHL(FN finetune(i%),8) AND &HF00,SHR(FN ivolume(i2%),2) AND &H7F)    ! Finetune + Volume
  5725.     mod_header$=mod_header$+MKI$(b&)
  5726.     b&=MAX(MIN(SHR(DIV(FN repeat(i%),c%),1),PRED(a&)),0)        ! Reppos
  5727.     mod_header$=mod_header$+MKI$(b&)
  5728.     b&=MAX(MIN(SHR(DIV(FN replen(i%),c%),1),SUB(a&,b&)),1)      ! Replen
  5729.     mod_header$=mod_header$+MKI$(b&)
  5730.   NEXT j%
  5731.   IF st%<=ss%
  5732.     GOSUB rec_result("done, "+STR$(j%)+"samples.",TRUE)
  5733.   ELSE
  5734.     GOSUB rec_result("done, for "+STR$(j%)+"samples. "+STR$(SUB(a%,j%))+" samples can't be saved.",TRUE)
  5735.   ENDIF
  5736.   '
  5737.   ' La song
  5738.   '
  5739.   GOSUB rec_result("  Saving song... ",FALSE)
  5740.   a&=ADD(SHL(MIN(module&(101),128),8),MIN(module&(102),127))
  5741.   mod_header$=mod_header$+MKI$(a&)              ! Songlen + Songrepeat
  5742.   a&=SHR(a&,8)
  5743.   b&=0
  5744.   a%=0
  5745.   FOR i%=0 TO 127               ! La song
  5746.     b&=MIN(song&(i%),255)
  5747.     IF i%=>a&
  5748.       b&=0
  5749.     ENDIF
  5750.     a%=MAX(a%,b&)
  5751.     mod_header$=mod_header$+CHR$(b&)
  5752.   NEXT i%
  5753.   IF flag_fast!                 ! Format FastTracker
  5754.     b%=CVL(LEFT$(STR$(nbr_track%)+"CHN",4))
  5755.     mod_header$=mod_header$+MKL$(b%)
  5756.     GOSUB rec_result("done. FastTracker '"+MKL$(b%)+"' format.",TRUE)
  5757.   ELSE IF nblm%<>64             ! Format MOD Digital Tracker (FAxx)
  5758.     b%=CVL("FA"+CHR$(ADD(DIV(nbr_track%,10),48))+CHR$(ADD(nbr_track% MOD 10,48)))
  5759.     mod_header$=mod_header$+MKL$(b%)
  5760.     c%=SHL(nblm%,16)
  5761.     mod_header$=mod_header$+MKL$(c%)
  5762.     GOSUB rec_result("done. Digital Tracker '"+MKL$(b%)+"' format.",TRUE)
  5763.   ELSE                          ! Format ProTracker standard
  5764.     b%=&H4D2E4B2E
  5765.     mod_header$=mod_header$+MKL$(b%)
  5766.     GOSUB rec_result("done. Standard ProTracker 'M.K.' format.",TRUE)
  5767.   ENDIF
  5768.   ' Sauve le tout
  5769.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(mod_header$),V:mod_header$)
  5770.   IF code_erreur_fichier%<0
  5771.     erreur%=code_erreur_fichier%
  5772.     GOTO sav_module_mod_erreur
  5773.   ENDIF
  5774.   '
  5775.   ' Les patterns
  5776.   '
  5777.   GOSUB rec_result("  Saving patterns... ",FALSE)
  5778.   j%=0
  5779.   loopend1%=a%
  5780.   WHILE j%<=loopend1%                   ! Les patterns
  5781.     n%=FN nbr_lines(j%)
  5782.     lig$=STRING$(SHL(nbr_track%,2),0)
  5783.     b%=FN adr_pat(j%)
  5784.     i%=0
  5785.     loopend2%=PRED(n%)
  5786.     WHILE i%<=loopend2%
  5787.       c%=V:lig$
  5788.       d%=V:sam$
  5789.       e%=MAX(nbr_track%*(-flag_registered2!),1) ! *** 2eme protection
  5790.       ~C:g_convert_gtk_2_nt%(L:b%,L:c%,L:d%,W:e%)
  5791.       IF i%=PRED(n%) AND n%<nblm%
  5792.         CARD{ADD(V:lig$,SUB(SHL(nbr_track%,2),2))}=ADD(CARD{ADD(V:lig$,SUB(SHL(nbr_track%,2),2))} AND &HF000,&HD00)
  5793.       ENDIF
  5794.       code_erreur_fichier%=FN fwrite(handle_fichier%,SHL(nbr_track%,2),V:lig$)
  5795.       IF code_erreur_fichier%<0
  5796.         erreur%=code_erreur_fichier%
  5797.         GOTO sav_module_mod_erreur
  5798.       ENDIF
  5799.       ADD b%,MUL(nbr_track%,5)
  5800.       INC i%
  5801.     WEND
  5802.     IF n%<nblm%
  5803.       lig$=STRING$(MUL(SHL(nbr_track%,2),SUB(nblm%,n%)),0)
  5804.       code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(lig$),V:lig$)
  5805.       IF code_erreur_fichier%<0
  5806.         erreur%=code_erreur_fichier%
  5807.         GOTO sav_module_mod_erreur
  5808.       ENDIF
  5809.     ENDIF
  5810.     INC j%
  5811.   WEND
  5812.   GOSUB rec_result("done.",TRUE)
  5813.   '
  5814.   ' Les samples
  5815.   '
  5816.   ' Penser a reechantillonner si besoin est
  5817.   GOSUB rec_result("  Saving samples... ",FALSE)
  5818.   lig$=STRING$(16384,0)
  5819.   j%=0
  5820.   WHILE j%<=30                  ! Les samples
  5821.     i%=FN isample(BYTE{ADD(V:sam2$,j%)},48)
  5822.     a%=MIN(DIV(FN length(i%),FN resol(i%)) AND -2,&HFFFE)
  5823.     IF a%>0
  5824.       IF FN resol(i%)=2         ! Convertit 16 bits en 8 bits
  5825.         k%=0
  5826.         REPEAT
  5827.           b%=ADD(FN adresse(i%),SHL(k%,1))
  5828.           d%=MIN(SHL(SUB(a%,k%) AND -2,1),32768)
  5829.           c%=V:lig$
  5830.           IF COS(flag_registered2!)<1           ! *** 2eme protection
  5831.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  5832.           ENDIF
  5833.           code_erreur_fichier%=FN fwrite(handle_fichier%,SHR(d%,1),V:lig$)
  5834.           IF code_erreur_fichier%<0
  5835.             erreur%=code_erreur_fichier%
  5836.             GOTO sav_module_mod_erreur
  5837.           ENDIF
  5838.           ADD k%,SHR(d%,1)
  5839.         UNTIL k%>=a%
  5840.       ELSE
  5841.         b%=MAX(FN adresse(i%)*(-flag_registered2!),&H1958)      ! *** 2eme protection
  5842.         code_erreur_fichier%=FN fwrite(handle_fichier%,a%,b%)
  5843.         IF code_erreur_fichier%<0
  5844.           erreur%=code_erreur_fichier%
  5845.           GOTO sav_module_mod_erreur
  5846.         ENDIF
  5847.       ENDIF
  5848.     ENDIF
  5849.     INC j%
  5850.   WEND
  5851.   GOSUB rec_result("done.",TRUE)
  5852.   '
  5853. sav_module_mod_erreur:
  5854.   ~FRE(0)
  5855. RETURN
  5856. PROCEDURE save_module_s3m
  5857.   LOCAL a%,b%,c%,d%,e%,f%,i%,j%,nbl%,nblm%,p%,xxx1%,xxx2%,xxx3%
  5858.   LOCAL loopend1%
  5859.   LOCAL a$,b$,mod$,pp$,ps$
  5860.   ~FRE(0)
  5861.   GOSUB rec_result("  Saving in S3M format (ScreamTracker 3 module).",TRUE)
  5862.   vide$=STRING$(16,0)
  5863.   nblm%=FN nbr_lines_maxi
  5864.   xxx1%=ADD(&H60,SUCC(FN song_length) AND -2)
  5865.   xxx2%=ADD(xxx1%,SHL(FN last_spl_util2,1))
  5866.   xxx3%=ADD(xxx2%,SHL(SUCC(FN last_pat_util),1))
  5867.   p%=ADD(ADD(xxx3%,32),15) AND -16      ! Debut des donnees de pat ou spl, alignement car parapointer
  5868.   '
  5869.   ' Le header du module
  5870.   '
  5871.   GOSUB rec_result("  Saving module header... ",FALSE)
  5872.   a%=FN mod_tempo                               ! Tempo
  5873.   mod$=LEFT$(FN songname$,28)+MKI$(&H1A10)+MKI$(0)
  5874.   mod$=mod$+MKI$(SUCC(FN song_length) AND -2)+MKI$(FN last_spl_util2)+MKI$(SUCC(FN last_pat_util))+MKI$(0)
  5875.   mod$=mod$+"GT"+MKI$(2)+"SCRM"
  5876.   mod$=mod$+CHR$(&H40)+CHR$(CARD{r_mod_speed%})+CHR$(a%)+CHR$(&HFF)+CHR$(0)+CHR$(252)+STRING$(10,0)
  5877.   GOSUB intel_w(ADD(V:mod$,&H20))
  5878.   GOSUB intel_w(ADD(V:mod$,&H22))
  5879.   GOSUB intel_w(ADD(V:mod$,&H24))
  5880.   GOSUB intel_w(ADD(V:mod$,&H26))
  5881.   GOSUB intel_w(ADD(V:mod$,&H2A))
  5882.   ' Les channels settings
  5883.   a%=0
  5884.   b%=0
  5885.   FOR i%=0 TO 31
  5886.     IF i%<nbr_track%
  5887.       IF FN balance(i%)<&H800
  5888.         mod$=mod$+CHR$(a%)
  5889.         a%=SUCC(a%) AND 7
  5890.       ELSE
  5891.         mod$=mod$+CHR$(ADD(b%,8))
  5892.         b%=SUCC(b%) AND 7
  5893.       ENDIF
  5894.     ELSE
  5895.       mod$=mod$+CHR$(255)
  5896.     ENDIF
  5897.   NEXT i%
  5898.   ' La song
  5899.   FOR i%=0 TO PRED(FN song_length)
  5900.     mod$=mod$+CHR$(song&(i%))
  5901.   NEXT i%
  5902.   IF (FN song_length AND 1)=1
  5903.     mod$=mod$+CHR$(255)
  5904.   ENDIF
  5905.   mod$=mod$+STRING$(SUB(p%,LEN(mod$)),0)
  5906.   ' Les Pan Pos
  5907.   FOR i%=0 TO PRED(nbr_track%)
  5908.     a%=ADD(FN balance(i%),&H80)                 ! Meilleure estimation possible
  5909.     BYTE{ADD(ADD(V:mod$,xxx3%),i%)}=ADD(MIN(DIV(MUL(a%,15),&H1000),15),32)
  5910.   NEXT i%
  5911.   code_erreur_fichier%=FN fwrite(handle_fichier%,p%,V:mod$)
  5912.   IF code_erreur_fichier%<0
  5913.     erreur%=code_erreur_fichier%
  5914.     GOTO sav_module_s3m_erreur
  5915.   ENDIF
  5916.   GOSUB rec_result("done.",TRUE)
  5917.   '
  5918.   ' Les samples
  5919.   '
  5920.   GOSUB rec_result("  Saving samples... ",FALSE)
  5921.   ps$=""                        ! Liste des parapointers
  5922.   j%=1
  5923.   loopend1%=FN last_spl_util2
  5924.   WHILE j%<=loopend1%
  5925.     i%=FN isample(j%,48)
  5926.     ps$=ps$+MKI$(SHR(p%,4))
  5927.     ' Le header
  5928.     a$=CHR$(1)+"SAMPLE"+HEX$(j%,2)+STRING$(5,0)+MKI$(SHR(ADD(p%,&H50),4))
  5929.     a$=a$+MKL$(FN length(i%))+MKL$(FN repeat(i%))+MKL$(ADD(FN repeat(i%),FN replen(i%)))
  5930.     a$=a$+CHR$(SHR(FN ivolume(j%),2))+CHR$(0)+CHR$(0)
  5931.     IF ADD(FN repeat(i%),FN replen(i%))<=2
  5932.       a%=0
  5933.     ELSE
  5934.       a%=1
  5935.     ENDIF
  5936.     a$=a$+CHR$(ADD(a%,SHL(PRED(FN resol(i%)),2)))
  5937.     a%=FN freqech(i%)*(2^(FN finetune(i%)/96))
  5938.     a$=a$+MKL$(a%)+STRING$(12,0)+FN samplename$(i%)+"SCRS"
  5939.     GOSUB intel_w(ADD(V:a$,&HE))
  5940.     GOSUB intel_l(ADD(V:a$,&H10))
  5941.     GOSUB intel_l(ADD(V:a$,&H14))
  5942.     GOSUB intel_l(ADD(V:a$,&H18))
  5943.     GOSUB intel_l(ADD(V:a$,&H20))
  5944.     code_erreur_fichier%=FN fwrite(handle_fichier%,16,V:vide$)
  5945.     IF code_erreur_fichier%<0
  5946.       erreur%=code_erreur_fichier%
  5947.       GOTO sav_module_s3m_erreur
  5948.     ENDIF
  5949.     code_erreur_fichier%=GEMDOS(66,L:p%,W:handle_fichier%,W:0)  ! Seek
  5950.     IF code_erreur_fichier%<0
  5951.       erreur%=code_erreur_fichier%
  5952.       GOTO sav_module_s3m_erreur
  5953.     ENDIF
  5954.     code_erreur_fichier%=FN fwrite(handle_fichier%,&H50,V:a$)
  5955.     IF code_erreur_fichier%<0
  5956.       erreur%=code_erreur_fichier%
  5957.       GOTO sav_module_s3m_erreur
  5958.     ENDIF
  5959.     ADD p%,&H50
  5960.     ' Donnees
  5961.     a$=STRING$(16384,0)
  5962.     a%=0
  5963.     e%=FN resol(i%)
  5964.     WHILE SUB(FN length(i%),a%)>0
  5965.       b%=ADD(FN adresse(i%),a%)
  5966.       c%=V:a$
  5967.       d%=MIN(16384,SUB(FN length(i%),a%))
  5968.       f%=d%*(-flag_registered2!)                ! *** 2eme protection
  5969.       BMOVE b%,c%,f%
  5970.       ~C:g_signe_sample%(L:c%,L:d%,W:e%)
  5971.       IF e%=2
  5972.         ~C:g_intel_16_bits%(L:c%,L:d%)
  5973.       ENDIF
  5974.       code_erreur_fichier%=FN fwrite(handle_fichier%,d%,V:a$)
  5975.       IF code_erreur_fichier%<0
  5976.         erreur%=code_erreur_fichier%
  5977.         GOTO sav_module_s3m_erreur
  5978.       ENDIF
  5979.       ADD a%,d%
  5980.     WEND
  5981.     p%=ADD(ADD(p%,FN length(i%)),15) AND -16
  5982.     INC j%
  5983.   WEND
  5984.   GOSUB rec_result("done.",TRUE)
  5985.   '
  5986.   ' les patterns
  5987.   '
  5988.   GOSUB rec_result("  Packing and saving patterns... ",FALSE)
  5989.   a$=STRING$(16384,0)           ! Au grand maximum...
  5990.   b$=STRING$(10240,0)
  5991.   pp$=""                        ! Liste des parapointers
  5992.   i%=0
  5993.   loopend1%=FN last_pat_util
  5994.   WHILE i%<=loopend1%
  5995.     nbl%=FN nbr_lines(i%)
  5996.     pp$=pp$+MKI$(SHR(p%,4))
  5997.     GOSUB clear_mem(V:b$,10240)
  5998.     BMOVE FN adr_pat(i%),V:b$,MUL(MUL(nbr_track%,MIN(64,nblm%)),5)
  5999.     IF nbl%<64
  6000.       CARD{ADD(V:b$,SUB(MUL(MUL(nbr_track%,nbl%),5),3))}=&HD00
  6001.     ENDIF
  6002.     a%=V:b$
  6003.     b%=V:a$
  6004.     c%=MAX(nbr_track%*(-flag_registered2!),1)           ! *** 2eme protection
  6005.     d%=MAX(MIN(nblm%,64)*(-flag_registered2!),1)        ! *** 2eme protection
  6006.     ~C:g_convert_gtk_2_s3m%(L:a%,L:b%,W:c%,W:d%)
  6007.     a%=CARD{V:a$}
  6008.     GOSUB intel_w(V:a$)
  6009.     code_erreur_fichier%=FN fwrite(handle_fichier%,16,V:vide$)
  6010.     IF code_erreur_fichier%<0
  6011.       erreur%=code_erreur_fichier%
  6012.       GOTO sav_module_s3m_erreur
  6013.     ENDIF
  6014.     code_erreur_fichier%=GEMDOS(66,L:p%,W:handle_fichier%,W:0)  ! Seek
  6015.     IF code_erreur_fichier%<0
  6016.       erreur%=code_erreur_fichier%
  6017.       GOTO sav_module_s3m_erreur
  6018.     ENDIF
  6019.     code_erreur_fichier%=FN fwrite(handle_fichier%,a%,V:a$)
  6020.     IF code_erreur_fichier%<0
  6021.       erreur%=code_erreur_fichier%
  6022.       GOTO sav_module_s3m_erreur
  6023.     ENDIF
  6024.     p%=ADD(ADD(p%,a%),15) AND -16
  6025.     INC i%
  6026.   WEND
  6027.   GOSUB rec_result("done.",TRUE)
  6028.   '
  6029.   ' Sauvegarde des parapointers
  6030.   '
  6031.   GOSUB rec_result("  Saving pointers... ",FALSE)
  6032.   FOR i%=0 TO SUB(LEN(pp$),2) STEP 2
  6033.     GOSUB intel_w(ADD(V:pp$,i%))
  6034.   NEXT i%
  6035.   FOR i%=0 TO SUB(LEN(ps$),2) STEP 2
  6036.     GOSUB intel_w(ADD(V:ps$,i%))
  6037.   NEXT i%
  6038.   code_erreur_fichier%=GEMDOS(66,L:xxx1%,W:handle_fichier%,W:0) ! Seek
  6039.   IF code_erreur_fichier%<0
  6040.     erreur%=code_erreur_fichier%
  6041.     GOTO sav_module_s3m_erreur
  6042.   ENDIF
  6043.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(ps$),V:ps$)
  6044.   IF code_erreur_fichier%<0
  6045.     erreur%=code_erreur_fichier%
  6046.     GOTO sav_module_s3m_erreur
  6047.   ENDIF
  6048.   code_erreur_fichier%=GEMDOS(66,L:xxx2%,W:handle_fichier%,W:0) ! Seek
  6049.   IF code_erreur_fichier%<0
  6050.     erreur%=code_erreur_fichier%
  6051.     GOTO sav_module_s3m_erreur
  6052.   ENDIF
  6053.   code_erreur_fichier%=FN fwrite(handle_fichier%,LEN(pp$),V:pp$)
  6054.   IF code_erreur_fichier%<0
  6055.     erreur%=code_erreur_fichier%
  6056.     GOTO sav_module_s3m_erreur
  6057.   ENDIF
  6058.   GOSUB rec_result("done.",TRUE)
  6059.   '
  6060. sav_module_s3m_erreur:
  6061.   ~FRE(0)
  6062. RETURN
  6063. PROCEDURE save_module_xm                !!!
  6064. RETURN
  6065. PROCEDURE load_module
  6066.   LOCAL time_taken%,erreur%
  6067.   LOCAL a$
  6068.   ~FRE(0)
  6069.   erreur%=0
  6070.   IF km%=2 AND nfile_module$<>""
  6071.     a$=npath_module$+nfile_module$
  6072.   ELSE
  6073.     CLS
  6074.     GOSUB cadre_texte("LOAD MODULE",0,0,PRED(scr_ncol%))
  6075.     FILESELECT npath_module$+next_module$,nfile_module$,a$
  6076.   ENDIF
  6077.   IF a$<>""
  6078.     IF FN exist(a$)
  6079.       CLS
  6080.       GOSUB cadre_texte("WAITING : LOADING MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  6081.       ~FRE(0)
  6082.       GOSUB rec_result("Loading module "+a$+"...",TRUE)
  6083.       time_taken%=TIMER
  6084.       GOSUB load_module2
  6085.       time_taken%=SUB(TIMER,time_taken%)
  6086.       IF erreur%=0
  6087.         GOSUB rec_result("Complete. Time for loading: "+FN time_hmsd$(time_taken%),TRUE)
  6088.         GOSUB separe_nom_chemin(a$)
  6089.         npath_module$=npath_$
  6090.         nfile_module$=nfile_$
  6091.       ENDIF
  6092.     ENDIF
  6093.   ENDIF
  6094.   GOSUB bee(FALSE)
  6095.   SELECT erreur%
  6096.   CASE 0                                        ! Pas d'erreur, tout est OK
  6097.     IF play%=1
  6098.       GOSUB play_song(TRUE)
  6099.     ELSE IF play%=2
  6100.       GOSUB play_pattern(TRUE)
  6101.     ELSE
  6102.       GOSUB stop_voices
  6103.     ENDIF
  6104.   CASE 1
  6105.     GOSUB rec_result("Error: No memory enough.",TRUE)
  6106.     GOSUB dialog("FILE","Error:|No memory enough|to load this module!","Cancel",MOUSEX,MOUSEY)
  6107.   CASE 2
  6108.     GOSUB rec_result("Error: No memory enough.",TRUE)
  6109.     GOSUB dialog("FILE","Error:|No memory enough|to load the pattern section|of this module!","Cancel",MOUSEX,MOUSEY)
  6110.   CASE 3
  6111.     GOSUB rec_result("Error: No memory enough.",TRUE)
  6112.     GOSUB dialog("FILE","Error:|No memory enough|to load the sample section|of this module!","Cancel",MOUSEX,MOUSEY)
  6113.   CASE 4
  6114.     GOSUB rec_result("Error: Unknown format.",TRUE)
  6115.     GOSUB dialog("FILE","Error:|Unknown module format, or|probably an unknown compression|type.","Cancel",MOUSEX,MOUSEY)
  6116.   DEFAULT
  6117.     GOSUB rec_result("Disk error: "+STR$(erreur%),TRUE)
  6118.     GOSUB dialog("FILE","Error:|"+STR$(erreur%),"Cancel",MOUSEX,MOUSEY)
  6119.   ENDSELECT
  6120.   GOSUB affiche_panneau_principal
  6121. RETURN
  6122. PROCEDURE load_module2
  6123.   ' a$ nom du module
  6124.   LOCAL a%,admod%,anc%,b%,c%,i%,j%,ticks%,mastervol%
  6125.   LOCAL lonmod%,place_totale2%,tempo%,translate%
  6126.   LOCAL handle_fichier%,taille_fichier%
  6127.   LOCAL a&
  6128.   LOCAL b$,balance$,chk$,chunk$,chknbv$,header$,track_volume$
  6129.   LOCAL filename$
  6130.   ~FRE(0)
  6131.   GOSUB bee(TRUE)
  6132.   warning%=0
  6133.   place_totale2%=place_totale%
  6134.   translate%=0                          ! Decalage du buffer au cours du chargement du module
  6135.   ticks%=6                              ! Vitesse de base
  6136.   tempo%=125                            ! Tempo BPM de base
  6137.   mastervol%=0                          ! Master
  6138.   FOR i%=0 TO 31                        ! Fixe la balance par defaut
  6139.     balance$=balance$+MKI$(MUL(SHR(SUCC(i%),1) AND 1,&HFFF))
  6140.   NEXT i%
  6141.   track_volume$=STRING$(32,MKI$(&H1000))
  6142.   OPEN "i",#0,a$
  6143.   taille_fichier%=LOF(#0)
  6144.   CLOSE #0
  6145.   filename$=a$+CHR$(0)
  6146.   handle_fichier%=GEMDOS(61,L:V:filename$,W:0)
  6147.   header$=STRING$(4096,0)
  6148.   code_erreur_fichier%=FN fread(handle_fichier%,MIN(LEN(header$),taille_fichier%),V:header$)
  6149.   IF code_erreur_fichier%<0
  6150.     erreur%=code_erreur_fichier%
  6151.     GOTO ld_module2_fin
  6152.   ENDIF
  6153.   ~FRE(0)
  6154.   crunched%=0
  6155.   '
  6156.   ' Module packe ?
  6157.   '
  6158.   IF LEFT$(header$,3)="ATM"                     ! Si c'est un fichier packe (Atomic packer 3.5)
  6159.     lonmod%=LONG{ADD(V:header$,4)}              ! Longueur du module decompacte
  6160.     GOSUB rec_result("File crunched with Atomik Packer 3.5",TRUE)
  6161.     GOTO ld_mod2_comp_suite
  6162.   ELSE IF LEFT$(header$,4)="Ice!"               ! Si c'est un fichier packe (Ice Packer 2.1)
  6163.     lonmod%=LONG{ADD(V:header$,4)}              ! Longueur du module decompacte
  6164.     GOSUB rec_result("File crunched with Ice Packer 2.1",TRUE)
  6165.     GOTO ld_mod2_comp_suite
  6166.   ELSE IF LEFT$(header$,4)="ICE!"               ! Si c'est un fichier packe (Ice Packer 2.4)
  6167.     lonmod%=LONG{ADD(V:header$,8)}              ! Longueur du module decompacte
  6168.     GOSUB rec_result("File crunched with Ice Packer 2.4",TRUE)
  6169.     GOTO ld_mod2_comp_suite
  6170.   ELSE IF LEFT$(header$,4)="SPv3"               ! Si c'est un fichier packe (Speed Packer 3)
  6171.     lonmod%=LONG{ADD(V:header$,12)}             ! Longueur du module decompacte
  6172.     GOSUB rec_result("File crunched with Speed Packer 3",TRUE)
  6173.     GOTO ld_mod2_comp_suite
  6174.   ld_mod2_comp_suite:
  6175.     IF lonmod%<FN zone_free2                    ! Y a la place ?
  6176.       GOSUB rec_result("Clearing memory... ",FALSE)
  6177.       GOSUB stop_voices
  6178.       GOSUB clear_samples
  6179.       GOSUB clear_instr
  6180.       admod%=SUB(FN zone_end,lonmod%)
  6181.       BMOVE ADD(FN adr_buffer,lonmod%),FN adr_buffer,SUB(FN lon_buffer,lonmod%)
  6182.       GOSUB rec_result("done.",TRUE)
  6183.       GOSUB rec_result("Loading module... ",FALSE)
  6184.       code_erreur_fichier%=GEMDOS(66,L:0,W:handle_fichier%,W:0) ! Seek
  6185.       IF code_erreur_fichier%<0
  6186.         erreur%=code_erreur_fichier%
  6187.         GOTO ld_module2_fin
  6188.       ENDIF
  6189.       code_erreur_fichier%=FN fread(handle_fichier%,taille_fichier%,admod%)
  6190.       IF code_erreur_fichier%<0
  6191.         erreur%=code_erreur_fichier%
  6192.         GOTO ld_module2_fin
  6193.       ENDIF
  6194.       GOSUB rec_result("done.",TRUE)
  6195.       IF flag_autoload!
  6196.         GOSUB aff_message("WAITING : DECRUNCHING MODULE")
  6197.       ELSE
  6198.         GOSUB cadre_texte("WAITING : DECRUNCHING MODULE",0,0,PRED(scr_ncol%))
  6199.       ENDIF
  6200.       GOSUB bee(TRUE)
  6201.       GOSUB rec_result("Decrunching module... ",FALSE)
  6202.       ~C:g_atomic_35_unpack%(L:admod%)
  6203.       ~C:g_packice_21_unpack%(L:admod%)
  6204.       ~C:g_packice_24_unpack%(L:admod%)
  6205.       ~C:g_speedpacker_unpack%(L:admod%)
  6206.       GOSUB rec_result("done.",TRUE)
  6207.       BMOVE admod%,V:header$,4096               ! Nouveau header
  6208.       GOTO ld_module2_cv_in_mem
  6209.     ELSE
  6210.       erreur%=1                                 ! Pas assez de memoire
  6211.       GOTO ld_module2_fin
  6212.     ENDIF
  6213.     '
  6214.     ' On peut le charger en memoire puis le convertir apres
  6215.     '
  6216.   ELSE IF taille_fichier%<FN zone_free2
  6217.     GOSUB rec_result("Clearing memory... ",FALSE)
  6218.     GOSUB stop_voices
  6219.     GOSUB clear_samples
  6220.     GOSUB clear_instr
  6221.     GOSUB rec_result("done.",TRUE)
  6222.     GOSUB rec_result("Loading module... ",FALSE)
  6223.     lonmod%=taille_fichier%
  6224.     admod%=SUB(FN zone_end,lonmod%)
  6225.     BMOVE ADD(FN adr_buffer,lonmod%),FN adr_buffer,SUB(FN lon_buffer,lonmod%)
  6226.     code_erreur_fichier%=GEMDOS(66,L:0,W:handle_fichier%,W:0) ! Seek
  6227.     IF code_erreur_fichier%<0
  6228.       erreur%=code_erreur_fichier%
  6229.       GOTO ld_module2_fin
  6230.     ENDIF
  6231.     code_erreur_fichier%=FN fread(handle_fichier%,lonmod%,admod%)
  6232.     IF code_erreur_fichier%<0
  6233.       erreur%=code_erreur_fichier%
  6234.       GOTO ld_module2_fin
  6235.     ENDIF
  6236.     GOSUB rec_result("done.",TRUE)
  6237.     '
  6238.     ' Conversion en memoire
  6239.     '
  6240.   ld_module2_cv_in_mem:
  6241.     IF flag_autoload!
  6242.       GOSUB aff_message("WAITING : CONVERTING MODULE")
  6243.     ELSE
  6244.       GOSUB cadre_texte("WAITING : CONVERTING MODULE",0,0,PRED(scr_ncol%))
  6245.     ENDIF
  6246.     SUB place_totale2%,lonmod%
  6247.     SWAP place_totale%,place_totale2%
  6248.     GOSUB bee(TRUE)
  6249.     SHOWM
  6250.     IF LEFT$(header$,3)="GT2"
  6251.       GOSUB load_module_gt2_mem
  6252.     ELSE IF LEFT$(header$,3)="GTK"
  6253.       GOSUB load_module_gtk_mem
  6254.     ELSE
  6255.       ' Sinon ca doit encore etre un de ces p... de modules Noisetracker !!!
  6256.       chunk$="M.K.M&K&FLT4FLT6FLT8CD81CD82CD83CD41CD42CD43CD61CD62CD63M!K!RASPM~K~"
  6257.       '      chknbv$=MKL$(&H4040406)+MKL$(&H8080404)
  6258.       chk$=MID$(header$,&H439,4)
  6259.       a%=INSTR(chunk$,chk$)
  6260.       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)
  6261.         GOSUB load_module_mod_mem
  6262.       ELSE IF LONG{V:header$}=&H4D4D4431
  6263.         ' Format OCTAmed Amiga
  6264.         GOSUB load_module_octamed_mem
  6265.       ELSE IF CARD{V:header$}=&H6966
  6266.         ' Foramt 669
  6267.         GOSUB load_module_669_mem
  6268.       ELSE IF MID$(header$,1,3)="MTM"
  6269.         ' Format MTM
  6270.         GOSUB load_module_mtm_mem
  6271.       ELSE IF MID$(header$,&H2D,4)="SCRM"
  6272.         ' Format  Scream Tracker 3
  6273.         GOSUB load_module_s3m_mem
  6274.       ELSE IF LEFT$(header$,12)="MAS_UTrack_V"
  6275.         ' Format Ultra Tracker
  6276.         GOSUB load_module_ult_mem
  6277.       ELSE IF LEFT$(header$,4)="D.T."
  6278.         ' Format Digital Tracker
  6279.         GOSUB load_module_dtm_mem
  6280.       ELSE IF LEFT$(header$,17)="Extended Module: "
  6281.         ' Format FastTracker 2
  6282.         GOSUB load_module_xm_mem
  6283.       ELSE
  6284.         ' Autre format ?
  6285.         '        GOTO ld_module2_disk   -- bug /sjx  0.8773 (there wasn't a label for this, caused jmp 0!)
  6286.         erreur%=4                               ! unknown format error /sjx.
  6287.         GOTO ld_module2_fin
  6288.       ENDIF
  6289.     ENDIF
  6290.     SWAP place_totale%,place_totale2%
  6291.     BMOVE FN adr_buffer,ADD(FN adr_buffer,SUB(lonmod%,translate%)),SUB(FN lon_buffer,SUB(lonmod%,translate%))
  6292.   ELSE
  6293.     erreur%=1                                   ! Pas assez de memoire
  6294.     GOTO ld_module2_fin
  6295.   ENDIF
  6296.   '
  6297.   ' Reorganisation
  6298.   '
  6299.   IF erreur%=0
  6300.     GOSUB rec_result("  Tracks: "+STR$(nbr_track%),TRUE)
  6301.     GOSUB rec_result("  Tempo: "+STR$(tempo%)+" BPM",TRUE)
  6302.     GOSUB rec_result("  Ticks per line: "+STR$(ticks%),TRUE)
  6303.     GOSUB rec_result("  Master Volume: "+STR$(mastervol%)+"/4096",TRUE)
  6304.     ' Reorganise un peut tout ca
  6305.     para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  6306.     FOR i%=1 TO 255
  6307.       ~C:rr_boucle_sample%(W:i%)
  6308.     NEXT i%
  6309.     module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  6310.     module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  6311.     ARRAYFILL pattern_bidon%(),0
  6312.     bl_start&=0
  6313.     bl_end&=0
  6314.     bl_trk&=0
  6315.     bl_pat&=0
  6316.     IF mastervol%=0
  6317.       DPOKE r_master_vol%,MIN(DIV(&H3000,ADD(nbr_track%,4)),&H500)
  6318.     ELSE
  6319.       DPOKE r_master_vol%,mastervol%
  6320.     ENDIF
  6321.     GOSUB chg_tempo(tempo%)
  6322.     DPOKE r_mod_speed%,ticks%
  6323.     DPOKE r_mod_nbrtrack%,nbr_track%
  6324.     GOSUB set_balance(balance$)
  6325.     GOSUB set_track_volume(track_volume$)
  6326.   ENDIF
  6327.   '
  6328. ld_module2_fin:
  6329.   code_erreur_fichier%=GEMDOS(62,W:handle%)
  6330.   IF code_erreur_fichier%<0
  6331.     erreur%=code_erreur_fichier%
  6332.   ENDIF
  6333.   GOSUB garbage_collection
  6334.   ~FRE(0)
  6335. RETURN
  6336. PROCEDURE load_module_gtk               !!!
  6337.   ' Modules GTK
  6338.   ' header$ : 4096 octets du debut du module
  6339. ld_module_gtk_fin:
  6340. RETURN
  6341. PROCEDURE load_module_gtk_mem
  6342.   ' Conversion d'un module au format GTK (ancien format interne) deja en memoire
  6343.   ' header$ : 4096 octets du debut du module
  6344.   LOCAL a%,b%,c%,i%,nvf%,pt%,nbs%,nbl%,adi$
  6345.   LOCAL nbp%,nbs2%
  6346.   ~FRE(0)
  6347.   GOSUB rec_result("It is an old Graoumf Tracker module (GTK).",TRUE)
  6348.   nvf%=BYTE{ADD(admod%,3)}              ! Numero de version du format
  6349.   nbl%=CARD{ADD(admod%,198)}            ! Nombre de lignes
  6350.   GOSUB new_pattern_format(CARD{ADD(admod%,200)})
  6351.   BMOVE admod%,V:module&(0),&HCE
  6352.   nbs%=module&(98)
  6353.   module&(98)=255
  6354.   pt%=ADD(admod%,&HCE)                  ! Pointe dans le fichier en memoire
  6355.   '
  6356.   ' Les headers des instruments
  6357.   '
  6358.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  6359.   nbs2%=0
  6360.   FOR i%=1 TO nbs%
  6361.     GOSUB chg_samplename2(pt%,28,i%)
  6362.     GOSUB chg_instrname2(pt%,28,i%)
  6363.     IF nvf%>2
  6364.       GOSUB chg_sam_balance(i%,CARD{ADD(pt%,42)})
  6365.     ELSE
  6366.       SUB pt%,16
  6367.     ENDIF
  6368.     IF nvf%>1
  6369.       GOSUB chg_sam_nbits(i%,CARD{ADD(pt%,44)})
  6370.       GOSUB chg_sam_freq(i%,CARD{ADD(pt%,46)})
  6371.     ENDIF
  6372.     a%=LONG{ADD(pt%,48)}
  6373.     IF a%>0
  6374.       INC nbs2%
  6375.     ENDIF
  6376.     GOSUB chg_sam_length(i%,a%)
  6377.     GOSUB chg_sam_repeat(i%,LONG{ADD(pt%,52)})
  6378.     GOSUB chg_sam_replen(i%,LONG{ADD(pt%,56)})
  6379.     GOSUB chg_ins_volume(i%,CARD{ADD(pt%,60)})
  6380.     GOSUB chg_sam_volume(i%,&H100)
  6381.     GOSUB chg_sam_finetune(i%,INT{ADD(pt%,62)})
  6382.     ADD pt%,64
  6383.   NEXT i%
  6384.   GOSUB rec_result("done.",TRUE)
  6385.   '
  6386.   ' La song
  6387.   '
  6388.   GOSUB rec_result("  Converting song... ",FALSE)
  6389.   BMOVE pt%,V:song&(0),512
  6390.   ADD pt%,512
  6391.   nbp%=0
  6392.   FOR i%=0 TO PRED(module&(101))
  6393.     nbp%=MAX(nbp%,song&(i%))
  6394.   NEXT i%
  6395.   INC nbp%
  6396.   c%=MUL(MUL(nbp%,MUL(nbr_track%,nbl%)),5)
  6397.   ~FRE(0)
  6398.   GOSUB rec_result("done.",TRUE)
  6399.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  6400.   GOSUB rec_result("  "+STR$(nbs2%)+" samples.",TRUE)
  6401.   '
  6402.   ' Les patterns
  6403.   '
  6404.   GOSUB rec_result("  Converting patterns... ",FALSE)
  6405.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbr_track%)+MKI$(nbl%)),nbp%,FALSE)
  6406.   c%=MUL(nbr_track%,nbl%)
  6407.   IF nvf%<4
  6408.     FOR i%=0 TO PRED(nbp%)
  6409.       b%=FN adr_pat(i%)
  6410.       BMOVE pt%,b%,SHL(c%,2)
  6411.       ADD pt%,SHL(c%,2)
  6412.       ~C:g_convert_gtk_2_gtk_vol%(L:b%,L:c%)
  6413.     NEXT i%
  6414.   ELSE
  6415.     FOR i%=0 TO PRED(nbp%)
  6416.       BMOVE pt%,FN adr_pat(i%),MUL(c%,5)
  6417.       ADD pt%,MUL(c%,5)
  6418.     NEXT i%
  6419.   ENDIF
  6420.   GOSUB rec_result("done.",TRUE)
  6421.   '
  6422.   ' Les instruments
  6423.   '
  6424.   GOSUB rec_result("  Converting samples... ",FALSE)
  6425.   adi$=""
  6426.   FOR i%=1 TO nbs%
  6427.     adi$=adi$+MKL$(pt%)
  6428.     ADD pt%,FN length(i%)
  6429.   NEXT i%
  6430.   FOR i%=1 TO nbs%
  6431.     GOSUB decale_sample(i%,nbs%,V:adi$)
  6432.   NEXT i%
  6433.   GOSUB rec_result("done.",TRUE)
  6434. ld_module_gtk_mem_fin:
  6435. RETURN
  6436. PROCEDURE load_module_gt2               !!!
  6437. RETURN
  6438. PROCEDURE load_module_gt2_mem
  6439.   ' Conversion d'un module au format GT2 (nouveau format interne) deja en memoire
  6440.   LOCAL a%,b%,c%,d%,e%,f%,i%,j%,finmod%,flags%,linestoadd%,version%
  6441.   LOCAL xcomchk%,orchchk%,patschk%,songchk%,tcn1chk%,tvolchk%
  6442.   LOCAL nbp%,nbs%,nbi%,nbe%
  6443.   LOCAL txt$,adp$,ads$,adi$,ade$,map$
  6444.   ~FRE(0)
  6445.   GOSUB rec_result("It's a Graoumf Tracker module (GT2).",TRUE)
  6446.   version%=BYTE{ADD(admod%,3)}
  6447.   GOSUB rec_result("  Format version number: "+STR$(version%)+".",TRUE)
  6448.   IF version%>gt2_file_vnum%
  6449.     GOSUB rec_result("  File will be probably not completely converted.",TRUE)
  6450.   ENDIF
  6451.   '
  6452.   ' Recherche des adresses de tous les chunks
  6453.   '
  6454.   finmod%=ADD(admod%,lonmod%)
  6455.   a%=ADD(admod%,LONG{ADD(admod%,4)})    ! Pointe sur le 2eme chunk du module
  6456.   adp$=STRING$(1024,0)                  ! Adresses des chunks des patterns
  6457.   ads$=STRING$(1024,0)                  ! Adresses des chunks des samples
  6458.   adi$=STRING$(1024,0)                  ! Adresses des chunks des instruments
  6459.   ade$=STRING$(768,0)                   ! Adresses des chunks des enveloppes
  6460.   songchk%=0
  6461.   patschk%=0
  6462.   orchchk%=0
  6463.   tcn1chk%=0
  6464.   xcomchk%=0
  6465.   tvolchk%=0
  6466.   nbp%=0
  6467.   nbs%=0
  6468.   nbi%=0
  6469.   nbe%=0
  6470.   ' Chunk detection.
  6471.   ' Note: Workaround 0.8775 put around here.
  6472.   ' I think the corruption (incorrect byteswapping) can only happen
  6473.   ' after a (16-bit?) SAMP chunk. So, SAMP, VENV, TENV, PENV, XCOM,
  6474.   ' and ENDC need to be treated. Should you encounter any more
  6475.   ' "Unknown chunk 'bacd'" messages where abcd is a valid chunk,
  6476.   ' you know what to do.
  6477.   WHILE a%<finmod%
  6478.   redetect_chunk:
  6479.     SELECT LONG{a%}
  6480.     CASE "TVOL"
  6481.       tvolchk%=a%
  6482.     CASE "SONG"
  6483.       songchk%=a%
  6484.     CASE "TCN1"
  6485.       tcn1chk%=a%
  6486.     CASE "PATS"
  6487.       patschk%=a%
  6488.     CASE "PATD"
  6489.       LONG{ADD(V:adp$,SHL(CARD{ADD(a%,8)},2))}=a%
  6490.       INC nbp%
  6491.     CASE "ORCH"
  6492.       orchchk%=a%
  6493.     CASE "INST"
  6494.       LONG{ADD(V:adi$,SHL(CARD{ADD(a%,8)},2))}=a%
  6495.       INC nbi%
  6496.     CASE "ASMP"
  6497.       LONG{a%}=CVL("SAMP")
  6498.       GOTO redetect_chunk
  6499.     CASE "SAMP"
  6500.       LONG{ADD(V:ads$,SHL(CARD{ADD(a%,8)},2))}=a%
  6501.       INC nbs%
  6502.     CASE "EVNV"
  6503.       LONG{a%}=CVL("VENV")
  6504.       GOTO redetect_chunk
  6505.     CASE "VENV"
  6506.       LONG{ADD(V:ade$,MUL(CARD{ADD(a%,8)},12))}=a%
  6507.       INC nbe%
  6508.     CASE "ETNV"
  6509.       LONG{a%}=CVL("TENV")
  6510.       GOTO redetect_chunk
  6511.     CASE "TENV"
  6512.       LONG{ADD(V:ade$,ADD(MUL(CARD{ADD(a%,8)},12),4))}=a%
  6513.       INC nbe%
  6514.     CASE "EPNV"
  6515.       LONG{a%}=CVL("PENV")
  6516.       GOTO redetect_chunk
  6517.     CASE "PENV"
  6518.       LONG{ADD(V:ade$,ADD(MUL(CARD{ADD(a%,8)},12),8))}=a%
  6519.       INC nbe%
  6520.     CASE "CXOM"
  6521.       LONG{a%}=CVL("XCOM")
  6522.       GOTO redetect_chunk
  6523.     CASE "XCOM"
  6524.       xcomchk%=a%
  6525.     CASE "NEDC"
  6526.       LONG{a%}=CVL("ENDC")
  6527.       GOTO redetect_chunk
  6528.     CASE "ENDC"
  6529.     DEFAULT
  6530.       GOSUB rec_result("  Unknown chunk: '"+MKL$(LONG{a%})+"'.",TRUE)
  6531.     ENDSELECT
  6532.     ADD a%,LONG{ADD(a%,4)}              ! Chunk suivant
  6533.   WEND
  6534.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  6535.   GOSUB rec_result("  "+STR$(nbi%)+" instruments,",TRUE)
  6536.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  6537.   GOSUB rec_result("  "+STR$(nbe%)+" envelopes.",TRUE)
  6538.   '
  6539.   ' Chargement des informations generales
  6540.   '
  6541.   GOSUB rec_result("  Converting module header... ",FALSE)
  6542.   GOSUB chg_songname2(ADD(admod%,8),32)
  6543.   GOSUB chg_songcomment2(ADD(admod%,40),160)
  6544.   mastervol%=CARD{ADD(admod%,232)}
  6545.   ticks%=CARD{ADD(admod%,228)}
  6546.   tempo%=CARD{ADD(admod%,230)}          ! Tempo
  6547.   BMOVE ADD(admod%,236),V:balance$,SHL(CARD{ADD(admod%,234)},1)
  6548.   '
  6549.   ' Recherche du nombre de lignes et de pistes
  6550.   '
  6551.   IF patschk%>0
  6552.     map$=""
  6553.     a%=CARD{ADD(patschk%,8)}            ! Nombre de pistes
  6554.     linestoadd%=0                       ! Nombre de lignes a ajouter au total
  6555.     FOR i%=0 TO 255
  6556.       c%=LONG{ADD(V:adp$,SHL(i%,2))}
  6557.       IF c%>0
  6558.         IF CARD{ADD(c%,26)}=0           ! Format de pattern 0 : donnees brutes
  6559.           ADD linestoadd%,SUB(CARD{ADD(c%,28)},1)
  6560.           map$=map$+MKI$(a%)+MKI$(CARD{ADD(c%,28)})
  6561.         ELSE
  6562.           map$=map$+MKI$(a%)+MKI$(1)
  6563.         ENDIF
  6564.       ELSE
  6565.         map$=map$+MKI$(a%)+MKI$(1)
  6566.       ENDIF
  6567.     NEXT i%
  6568.     GOSUB new_pattern_format(a%)
  6569.   ENDIF
  6570.   GOSUB rec_result("done.",TRUE)
  6571.   '
  6572.   ' Extra comment
  6573.   '
  6574.   IF xcomchk%>0
  6575.     GOSUB rec_result("  Comment:",TRUE)
  6576.     a%=LONG{ADD(xcomchk%,8)}
  6577.     txt$=""
  6578.     FOR i%=ADD(xcomchk%,12) TO ADD(ADD(xcomchk%,a%),11)
  6579.       b%=BYTE{i%}
  6580.       IF b%=10                                  ! CR
  6581.         GOSUB rec_result("  "+txt$,TRUE)
  6582.         txt$=""
  6583.       ELSE IF b%>=32                            ! Elimine les car. non ASCII
  6584.         txt$=txt$+CHR$(b%)
  6585.       ENDIF
  6586.     NEXT i%
  6587.     IF LEN(txt$)>0
  6588.       GOSUB rec_result("  "+txt$,TRUE)
  6589.       txt$=""
  6590.     ENDIF
  6591.     GOSUB rec_result("  (End of comment)",TRUE)
  6592.   ENDIF
  6593.   '
  6594.   ' Volumes des pistes
  6595.   '
  6596.   IF tvolchk%>0
  6597.     GOSUB rec_result("  Converting track volume chunk... ",FALSE)
  6598.     a%=CARD{ADD(tvolchk%,8)}
  6599.     BMOVE ADD(tvolchk%,10),V:track_volume$,SHL(a%,1)
  6600.     GOSUB rec_result("done.",TRUE)
  6601.   ENDIF
  6602.   '
  6603.   ' Les configurations
  6604.   '
  6605.   IF tcn1chk%>0 AND flag_gt2cnf!
  6606.     GOSUB rec_result("  Converting config. chunk... ",FALSE)
  6607.     songpos%=CARD{ADD(tcn1chk%,10)}
  6608.     posligne%=CARD{ADD(tcn1chk%,12)}
  6609.     n_preset%=CARD{ADD(tcn1chk%,14)}
  6610.     GOSUB chg_type_affpiste(CARD{ADD(tcn1chk%,16)})
  6611.     curs_col%=CARD{ADD(tcn1chk%,18)}
  6612.     curs_x%=CARD{ADD(tcn1chk%,20)}
  6613.     flags%=CARD{ADD(tcn1chk%,22)}
  6614.     play%=flags% AND 3
  6615.     IF (SHR(flags%,2) AND 1)=1
  6616.       GOSUB edit_mode_on
  6617.     ELSE
  6618.       GOSUB edit_mode_off
  6619.     ENDIF
  6620.     octave%=CARD{ADD(tcn1chk%,24)}
  6621.     line_step%=CARD{ADD(tcn1chk%,26)}
  6622.     instr%=CARD{ADD(tcn1chk%,28)}
  6623.     sample%=CARD{ADD(tcn1chk%,30)}
  6624.     FOR i%=0 TO 31                              ! Les presets
  6625.       nbr_colonnes%(i%)=CARD{ADD(tcn1chk%,ADD(32,SHL(i%,1)))}
  6626.     NEXT i%
  6627.     ' *** Penser aux noms
  6628.     BMOVE ADD(tcn1chk%,608),V:preset&(0,0),2048
  6629.     a%=LONG{ADD(tcn1chk%,2656)}                 ! Les pistes on/off
  6630.     FOR i%=0 TO 31
  6631.       DPOKE ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,i%)),BTST(a%,i%) AND 1
  6632.     NEXT i%
  6633.     GOSUB rec_result("done.",TRUE)
  6634.   ENDIF
  6635.   '
  6636.   ' Chargement de la song
  6637.   '
  6638.   IF songchk%>0
  6639.     GOSUB rec_result("  Converting song chunk... ",FALSE)
  6640.     module&(101)=CARD{ADD(songchk%,8)}
  6641.     module&(102)=CARD{ADD(songchk%,10)}
  6642.     FOR i%=0 TO PRED(FN song_length)
  6643.       song&(i%)=CARD{ADD(ADD(songchk%,12),SHL(i%,1))}
  6644.     NEXT i%
  6645.     GOSUB rec_result("done.",TRUE)
  6646.   ENDIF
  6647.   '
  6648.   ' Chargement des patterns
  6649.   '
  6650.   IF patschk%>0
  6651.     GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  6652.     GOSUB create_space_multipatchunk(map$,256,TRUE)
  6653.     FOR i%=0 TO 255
  6654.       a%=LONG{ADD(V:adp$,SHL(i%,2))}
  6655.       IF a%>0
  6656.         GOSUB chg_patternname2(ADD(a%,10),16,i%)
  6657.         IF CARD{ADD(a%,26)}=0           ! Format de pattern 0 : donnees brutes
  6658.           b%=CARD{ADD(a%,28)}           ! Nombre de lignes de ce pattern
  6659.           ' Ignore le nombre de voies
  6660.           ~C:g_bmove%(L:ADD(a%,32),L:FN adr_pat(i%),L:MUL(MUL(nbr_track%,b%),5))
  6661.         ENDIF
  6662.       ENDIF
  6663.     NEXT i%
  6664.     GOSUB rec_result("done.",TRUE)
  6665.   ENDIF
  6666.   '
  6667.   ' Chargement des instruments
  6668.   '
  6669.   GOSUB rec_result("  Converting instrument chunks... ",FALSE)
  6670.   FOR i%=1 TO 255
  6671.     a%=LONG{ADD(V:adi$,SHL(i%,2))}
  6672.     IF a%>0
  6673.       BMOVE a%,V:instrset%(0,i%),LONG{ADD(a%,4)}
  6674.     ENDIF
  6675.   NEXT i%
  6676.   GOSUB rec_result("done.",TRUE)
  6677.   '
  6678.   ' Chargement des enveloppes
  6679.   '
  6680.   GOSUB rec_result("  Converting envelope chunks... ",FALSE)
  6681.   FOR i%=1 TO 63
  6682.     FOR j%=0 TO 2
  6683.       a%=LONG{ADD(V:ade$,SHL(ADD(MUL(i%,3),j%),2))}
  6684.       IF a%>0
  6685.         b%=LONG{ADD(a%,4)}              ! Taille du chunk
  6686.         c%=CARD{ADD(a%,30)}             ! Taille de la section Attack
  6687.         GOSUB chg_env_length(i%,j%,0,c%)
  6688.         GOSUB chg_env_length(i%,j%,1,SUB(SUB(b%,32),c%))
  6689.         BMOVE a%,FN env_chunkadr(i%,j%),b%
  6690.       ENDIF
  6691.     NEXT j%
  6692.   NEXT i%
  6693.   GOSUB rec_result("done.",TRUE)
  6694.   '
  6695.   ' Chargement des samples
  6696.   '
  6697.   GOSUB rec_result("  Converting sample chunks... ",FALSE)
  6698.   FOR i%=1 TO 255
  6699.     a%=LONG{ADD(V:ads$,SHL(i%,2))}
  6700.     IF a%>0
  6701.       b%=LONG{ADD(a%,4)}                ! Longueur du nouveau chunk
  6702.       c%=FN adrsamchk(i%)               ! Adresse de l'ancien chunk
  6703.       d%=FN lonsamchk(i%)               ! Longueur de l'ancien chunk
  6704.       e%=ADD(c%,b%)
  6705.       j%=SUCC(i%)
  6706.       WHILE j%<256
  6707.         f%=LONG{ADD(V:ads$,SHL(j%,2))}
  6708.         EXIT IF f%<e% AND f%>0
  6709.         INC j%                          ! Cherche si des samples genent
  6710.       WEND
  6711.       IF j%<256 OR flag_keep_buffer!    ! On est oblige de faire une rotation
  6712.         ~C:g_bmove%(L:a%,L:c%,L:d%)     ! Copie ce qui tient
  6713.         GOSUB mem_rotation(ADD(c%,d%),SUB(ADD(a%,b%),ADD(c%,d%)),SUB(b%,d%))    ! et deplace le reste
  6714.         ADD translate%,SUB(b%,d%)
  6715.         IF i%<255
  6716.           FOR j%=SUCC(i%) TO 255        ! Remise a jour des chunks de sample
  6717.             GOSUB chg_sam_chunkadr(j%,ADD(FN adrsamchk(j%),SUB(b%,d%)))
  6718.             e%=LONG{ADD(V:ads$,SHL(j%,2))}
  6719.             IF e%>0 AND e%<a%
  6720.               LONG{ADD(V:ads$,SHL(j%,2))}=ADD(e%,SUB(b%,d%))
  6721.             ENDIF
  6722.           NEXT j%
  6723.         ENDIF
  6724.       ELSE
  6725.         IF i%<255
  6726.           ~C:g_bmove%(L:ADD(c%,d%),L:ADD(c%,b%),L:SUB(FN adr_buffer,ADD(c%,d%)))
  6727.         ENDIF
  6728.         ~C:g_bmove%(L:a%,L:c%,L:b%)
  6729.         IF i%<255
  6730.           FOR j%=SUCC(i%) TO 255        ! Remise a jour des chunks de sample
  6731.             GOSUB chg_sam_chunkadr(j%,ADD(FN adrsamchk(j%),SUB(b%,d%)))
  6732.           NEXT j%
  6733.         ENDIF
  6734.       ENDIF
  6735.     ENDIF
  6736.   NEXT i%
  6737.   GOSUB rec_result("done.",TRUE)
  6738. RETURN
  6739. PROCEDURE load_module_mod               !!!
  6740.   ' Modules classiques type ProTracker Amiga
  6741.   ' header$ : 4096 octets du debut du module
  6742. ld_module_mod_fin:
  6743. RETURN
  6744. PROCEDURE load_module_mod_mem
  6745.   ' Modules classiques type ProTracker Amiga, deja en memoire
  6746.   ' header$ : 4096 octets du debut du module
  6747.   LOCAL pt%,a%,b%,i%,nbl%,nbt%,nbs%,nbp%,bspd%
  6748.   LOCAL a&
  6749.   LOCAL flag_digital!,flag_intel!
  6750.   LOCAL chk$,chknbv$,chunk$,adi$
  6751.   ~FRE(0)
  6752.   '
  6753.   ' Trouve le bon format
  6754.   '
  6755.   flag_digital!=FALSE
  6756.   flag_intel!=FALSE
  6757.   chunk$="M.K.M&K&FLT4FLT6FLT8M!K!RASPM~K~"
  6758.   chknbv$=MKL$(&H4040406)+MKL$(&H8040404)
  6759.   chk$=MID$(header$,&H439,4)
  6760.   a%=INSTR(chunk$,chk$)
  6761.   nbl%=64
  6762.   bspd%=8363
  6763.   IF (a% AND 3)=1               ! Format courant
  6764.     nbt%=ASC(MID$(chknbv$,SUCC(SHR(PRED(a%),2)),1))
  6765.     GOSUB rec_result("It is a standard ProTracker module (MOD).",TRUE)
  6766.   ELSE IF RIGHT$(chk$,3)="CHN"  ! FastTracker
  6767.     nbt%=VAL(LEFT$(chk$,1))
  6768.     GOSUB rec_result("It is a ProTracker module (MOD), FastTracker mutation.",TRUE)
  6769.   ELSE IF RIGHT$(chk$,2)="CH"   ! FastTracker
  6770.     nbt%=VAL(LEFT$(chk$,2))
  6771.     GOSUB rec_result("It is a ProTracker module (MOD), FastTracker mutation.",TRUE)
  6772.   ELSE IF LEFT$(chk$,2)="CD"   ! Octalyser CDxy
  6773.     GOSUB rec_result("It is a ProTracker module (MOD), Octalyser mutation.",TRUE)
  6774.     bspd%=8363                  ! y=basespeed - 1,2,3 -> 16KHz, 20KHz, 25KHz
  6775.     IF RIGHT$(chk$,1)="2"
  6776.       bspd%=10038               ! Note: Neither of these are exact values, but it's...
  6777.     ELSE IF RIGHT$(chk$,1)="3"
  6778.       bspd%=12570               ! ...bloody hard to work them out from Blade's precalcs. /sjx.
  6779.     ENDIF
  6780.     nbt%=VAL(MID$(chk$,3,1))
  6781.   ELSE IF LEFT$(chk$,2)="FA"    ! Format Digital Tracker
  6782.     nbt%=VAL(RIGHT$(chk$,2))
  6783.     GOSUB rec_result("It is a ProTracker module (MOD), Digital Tracker mutation.",TRUE)
  6784.     flag_digital!=TRUE
  6785.     nbl%=CARD{ADD(admod%,&H43C)}
  6786.   ENDIF
  6787.   GOSUB new_pattern_format(nbt%)
  6788.   pt%=admod%
  6789.   GOSUB chg_songname2(pt%,20)                   ! Le nom du module
  6790.   ADD pt%,20
  6791.   '
  6792.   ' Lit les entetes des instruments
  6793.   '
  6794.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  6795.   nbs%=0
  6796.   FOR j%=1 TO 31
  6797.     GOSUB chg_samplename2(pt%,22,j%)
  6798.     GOSUB chg_instrname2(pt%,22,j%)
  6799.     GOSUB chg_sam_freq(j%,bspd%)
  6800.     a&=INT{ADD(pt%,22)}                 ! Longueur
  6801.     IF falg_intel!
  6802.       GOSUB intel_w(V:a&)
  6803.     ENDIF
  6804.     GOSUB chg_sam_length(j%,SHL(a& AND 65535,1))
  6805.     IF a&>0
  6806.       INC nbs%
  6807.     ENDIF
  6808.     a&=BYTE{ADD(pt%,24)}                ! Finetune
  6809.     IF a&<8
  6810.       GOSUB chg_sam_finetune(j%,a&)
  6811.     ELSE
  6812.       GOSUB chg_sam_finetune(j%,SUB(a&,16))
  6813.     ENDIF
  6814.     a&=BYTE{ADD(pt%,25)}                ! Volume
  6815.     GOSUB chg_ins_volume(j%,SHL(a&,2))
  6816.     GOSUB chg_sam_volume(j%,&H100)
  6817.     a&=INT{ADD(pt%,26)}                 ! Repeat
  6818.     IF falg_intel!
  6819.       GOSUB intel_w(V:a&)
  6820.     ENDIF
  6821.     GOSUB chg_sam_repeat(j%,SHL(a& AND 65535,1))
  6822.     a&=INT{ADD(pt%,28)}                 ! Replen
  6823.     IF falg_intel!
  6824.       GOSUB intel_w(V:a&)
  6825.     ENDIF
  6826.     GOSUB chg_sam_replen(j%,SHL(a& AND 65535,1))
  6827.     ADD pt%,30
  6828.   NEXT j%
  6829.   GOSUB rec_result("done.",TRUE)
  6830.   '
  6831.   ' La song
  6832.   '
  6833.   GOSUB rec_result("  Converting song... ",FALSE)
  6834.   module&(101)=BYTE{pt%}        ! Longueur
  6835.   a&=BYTE{SUCC(pt%)}            ! Boucle
  6836.   ADD pt%,2
  6837.   IF a&>PRED(module&(101))
  6838.     a&=0
  6839.   ENDIF
  6840.   module&(102)=a&
  6841.   nbp%=0
  6842.   FOR i%=0 TO 127               ! La song
  6843.     song&(i%)=BYTE{ADD(pt%,i%)}
  6844.     nbp%=MAX(nbp%,song&(i%))
  6845.   NEXT i%
  6846.   INC nbp%
  6847.   GOSUB rec_result("done.",TRUE)
  6848.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  6849.   GOSUB rec_result("  "+STR$(nbs%)+" samples at "+STR$(bspd%*2)+"Hz basespeed.",TRUE)
  6850.   '
  6851.   ' Chargement des patterns
  6852.   '
  6853.   GOSUB rec_result("  Converting patterns... ",FALSE)
  6854.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbt%)+MKI$(nbl%)),nbp%,FALSE)
  6855.   IF flag_digital!
  6856.     pt%=ADD(admod%,&H440)       ! Les patterns (pour DT)
  6857.   ELSE
  6858.     pt%=ADD(admod%,&H43C)       ! Les patterns (modules courants)
  6859.   ENDIF
  6860.   b%=MUL(SUCC(a%),SHL(MUL(nbl%,nbr_track%),2))
  6861.   '
  6862.   ' Conversion des patterns
  6863.   '
  6864.   c%=MUL(nbl%,nbr_track%)
  6865.   FOR i%=0 TO PRED(nbp%)
  6866.     a%=FN adr_pat(i%)
  6867.     ~C:g_bmove%(L:pt%,L:a%,L:SHL(c%,2))
  6868.     ADD pt%,SHL(c%,2)
  6869.     ~C:g_convert_nt_2_gtk%(L:a%,L:c%)
  6870.   NEXT i%
  6871.   GOSUB rec_result("done.",TRUE)
  6872.   '
  6873.   ' Les samples
  6874.   '
  6875.   GOSUB rec_result("  Converting samples... ",FALSE)
  6876.   adi$=""
  6877.   FOR i%=1 TO 31
  6878.     adi$=adi$+MKL$(pt%)
  6879.     ADD pt%,FN length(i%)
  6880.   NEXT i%
  6881.   FOR i%=1 TO 31
  6882.     GOSUB decale_sample(i%,31,V:adi$)
  6883.   NEXT i%
  6884.   GOSUB rec_result("done.",TRUE)
  6885. ld_module_mod_mem_fin:
  6886. RETURN
  6887. PROCEDURE load_module_octamed           !!!
  6888.   ' Chargement d'un module au format OctaMED Pro Amiga
  6889.   ' header$ : 4096 octets du debut du module
  6890. RETURN
  6891. PROCEDURE load_module_octamed_mem       !!!
  6892.   ' Chargement d'un module au format OctaMED Pro Amiga deja en memoire
  6893.   LOCAL a%,asc%,b%,c%,d%,e%,flags%,flags2%,i%,instrhdr%,j%,k%,l%
  6894.   LOCAL mmd0song%,mmd0block%,mmd0exp%,nbi%,nbs%,no%,rl%,rs%,sc%,t%,type%,wf%
  6895.   LOCAL numblock%
  6896.   LOCAL a$,adi$,b$,octstart$,samiff$,transpose$,map$
  6897.   ~FRE(0)
  6898.   GOSUB rec_result("It's an OctaMED Pro module (MMD).",TRUE)
  6899.   '
  6900.   ' Recherche des adresses de principaux chunks
  6901.   ' et des principales informations
  6902.   '
  6903.   GOSUB rec_result("  Converting module header... ",FALSE)
  6904.   mmd0song%=ADD(admod%,LONG{ADD(admod%,8)})     ! Pointe sur le header de la song
  6905.   mmd0block%=ADD(admod%,LONG{ADD(admod%,16)})   ! Pointe sur les offsets des patterns
  6906.   instrhdr%=ADD(admod%,LONG{ADD(admod%,24)})
  6907.   mmd0exp%=ADD(admod%,LONG{ADD(admod%,32)})     ! Pointe sur les donnees d'expansion
  6908.   ' Recherche nombre voies/piste
  6909.   numblock%=CARD{ADD(mmd0song%,504)}            ! Nombre de patterns
  6910.   t%=1
  6911.   map$=""
  6912.   FOR i%=0 TO PRED(numblock%)
  6913.     a%=LONG{ADD(mmd0block%,SHL(i%,2))}          ! Offset du header du pattern i
  6914.     IF a%>0
  6915.       t%=MAX(t%,CARD{ADD(admod%,a%)})
  6916.       l%=SUCC(CARD{ADD(ADD(admod%,a%),2)})
  6917.       map$=map$+MKI$(1)+MKI$(l%)
  6918.     ELSE
  6919.       map$=map$+MKI$(1)+MKI$(1)
  6920.     ENDIF
  6921.   NEXT i%
  6922.   FOR i%=0 TO SHL(PRED(numblock%),2) STEP 4
  6923.     CARD{ADD(V:map$,i%)}=t%
  6924.   NEXT i%
  6925.   GOSUB new_pattern_format(t%)
  6926.   GOSUB create_space_multipatchunk(map$,numblock%,TRUE)
  6927.   flags%=BYTE{ADD(mmd0song%,767)}
  6928.   flags2%=BYTE{ADD(mmd0song%,768)}
  6929.   nbi%=BYTE{ADD(mmd0song%,787)}                 ! Nbr d'instruments
  6930.   ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  6931.   ' PRINT AT(1,5);CARD{ADD(mmd0song%,764)},SUCC(flag2% AND 31),BYTE{ADD(mmd0song%,769)}
  6932.   ' IF BTST(flags2%,5)
  6933.   '   PRINT "Ok"
  6934.   ' ENDIF
  6935.   ' ~INP(2)
  6936.   ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  6937.   ' Le Tempo
  6938.   ' IF BTST(flags2%,5)
  6939.   '   tempo%=CARD{ADD(mmd0song%,764)}             ! BPM
  6940.   ' ENDIF
  6941.   ' b%=SUCC(flags2% AND 31)
  6942.   GOSUB rec_result("done.",TRUE)
  6943.   GOSUB rec_result("  "+STR$(numblock%)+" patterns,",TRUE)
  6944.   GOSUB rec_result("  "+STR$(nbi%)+" instruments,",TRUE)
  6945.   '
  6946.   ' La song
  6947.   '
  6948.   GOSUB rec_result("  Converting song chunk... ",FALSE)
  6949.   module&(101)=CARD{ADD(mmd0song%,506)}
  6950.   module&(102)=0
  6951.   FOR i%=0 TO PRED(FN song_length)
  6952.     song&(i%)=BYTE{ADD(ADD(mmd0song%,508),i%)}
  6953.   NEXT i%
  6954.   GOSUB rec_result("done.",TRUE)
  6955.   '
  6956.   ' Les patterns
  6957.   '
  6958.   GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  6959.   transpose$=STRING$(64,35)
  6960.   FOR i%=0 TO PRED(numblock%)
  6961.     a%=LONG{ADD(mmd0block%,SHL(i%,2))}
  6962.     IF a%>0
  6963.       t%=CARD{ADD(admod%,a%)}
  6964.       l%=SUCC(CARD{ADD(admod%,ADD(a%,2))})
  6965.       IF t%>0 AND l%>0
  6966.         e%=ADD(admod%,ADD(a%,8))
  6967.         d%=SUB(nbr_track%,t%)
  6968.         b%=FN adr_pat(i%)
  6969.         c%=V:transpose$
  6970.         ~C:g_convert_mmd1_2_gtk%(L:e%,L:b%,L:c%,W:t%,W:l%,W:d%)
  6971.       ENDIF
  6972.     ENDIF
  6973.   NEXT i%
  6974.   GOSUB rec_result("done.",TRUE)
  6975.   '
  6976.   ' Les headers d'instruments
  6977.   '
  6978.   GOSUB rec_result("  Converting instrument chunks and sample headers... ",FALSE)
  6979.   nbs%=0                                        ! Nombre actuel de samples decodes
  6980.   adi$=""
  6981.   samiff$="000000 432110 221100 110000 332210 543210 654321"
  6982.   octstart$="001224364860 121212122424 001212242436 001212243636 001212242424 121212121212 121212121212"
  6983.   FOR i%=1 TO nbi%
  6984.     a%=LONG{ADD(instrhdr%,SHL(PRED(i%),2))}
  6985.     IF a%>0
  6986.       ADD a%,admod%                             ! Pointe sur le header de l'instrument
  6987.       b%=ADD(mmd0song%,MUL(PRED(i%),8))         ! Pointe sur d'autres infos sur le sample
  6988.       t%=FN sbyte(BYTE{ADD(b%,7)})              ! Transposition generale de l'instrument
  6989.       GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(b%,6)},2))
  6990.       type%=INT{ADD(a%,4)}                      ! Type de l'instrument
  6991.       SELECT type%
  6992.       CASE 0 TO 6
  6993.         ' --- Sample de 1 a 7 octaves ---
  6994.         ' -------------------------------
  6995.       ld_mmd_samples:
  6996.         no%=VAL(MID$("1532467",SUCC(type%),1))  ! Nombre d'octaves dans l'instrument
  6997.         sc%=SUCC(nbs%)                          ! Sample en cours de traitement
  6998.         asc%=ADD(a%,6)                          ! Adr spl "   "    "    "
  6999.         FOR j%=0 TO PRED(no%)
  7000.           GOSUB chg_sam_nbits(sc%,1)
  7001.           GOSUB chg_sam_volume(sc%,&H100)
  7002.           GOSUB chg_sam_freq(sc%,8363)
  7003.           GOSUB chg_sam_finetune(sc%,0)         ! 0 par defaut, mais on voit plus tard si y en a
  7004.           rs%=SHL(CARD{b%},SUCC(j%))            ! Repeat
  7005.           rl%=SHL(CARD{ADD(b%,2)},SUCC(j%))     ! Replen
  7006.           IF type%=0                            ! Un sample/instr : on prend la longueur totale
  7007.             GOSUB chg_sam_length(sc%,LONG{a%} AND -2)
  7008.           ELSE                                  ! Sinon c'est repeat+replen
  7009.             GOSUB chg_sam_length(sc%,ADD(rs%,rl%))
  7010.           ENDIF
  7011.           GOSUB chg_sam_repeat(sc%,rs%)
  7012.           GOSUB chg_sam_replen(sc%,MAX(rl%,2))
  7013.           adi$=adi$+MKL$(asc%)
  7014.           ADD asc%,ADD(rs%,rl%)
  7015.           INC sc%
  7016.         NEXT j%
  7017.         ' Transpositions et affectation des samples aux instruments
  7018.         FOR j%=0 TO 5
  7019.           c%=ADD(VAL(MID$(samiff$,ADD(SUCC(MUL(type%,7)),j%),1)),SUCC(nbs%))
  7020.           d%=ADD(SUB(VAL(MID$(octstart$,ADD(SUCC(MUL(type%,13)),SHL(j%,1)),2)),MUL(j%,12)),t%)
  7021.           FOR k%=ADD(MUL(j%,12),36) TO ADD(MUL(j%,12),47)
  7022.             GOSUB chg_ins_sample(i%,k%,c%)      ! Sample
  7023.             GOSUB chg_ins_transp(i%,k%,d%)      ! Transposition
  7024.           NEXT k%
  7025.         NEXT j%
  7026.         FOR j%=1 TO 35
  7027.           GOSUB chg_ins_sample(i%,j%,FN isample(i%,36))
  7028.           GOSUB chg_ins_transp(i%,j%,FN itransp(i%,36))
  7029.         NEXT j%
  7030.         FOR j%=108 TO 127
  7031.           GOSUB chg_ins_sample(i%,j%,FN isample(i%,107))
  7032.           GOSUB chg_ins_transp(i%,j%,FN itransp(i%,107))
  7033.         NEXT j%
  7034.         GOSUB chg_ins_sample(i%,0,0)
  7035.         GOSUB chg_ins_transp(i%,0,0)
  7036.         ADD nbs%,no%
  7037.       CASE -1
  7038.         ' ---------- Synthetic ----------
  7039.         ' -------------------------------
  7040.         ' Ne prend pour l'instant en compte que la 1ere forme d'onde
  7041.         sc%=SUCC(nbs%)
  7042.         GOSUB chg_sam_nbits(sc%,1)
  7043.         GOSUB chg_sam_volume(sc%,&H100)
  7044.         GOSUB chg_sam_freq(sc%,8363)
  7045.         GOSUB chg_sam_finetune(sc%,0)
  7046.         wf%=ADD(a%,LONG{ADD(a%,278)})
  7047.         GOSUB chg_sam_length(sc%,SHL(CARD{wf%},1))
  7048.         GOSUB chg_sam_repeat(sc%,0)
  7049.         GOSUB chg_sam_replen(sc%,SHL(CARD{wf%},1))
  7050.         adi$=adi$+MKL$(ADD(wf%,2))
  7051.         FOR j%=1 TO 127
  7052.           GOSUB chg_ins_sample(i%,j%,sc%)
  7053.           GOSUB chg_ins_transp(i%,j%,SUB(t%,24))
  7054.         NEXT j%
  7055.         GOSUB chg_ins_sample(i%,0,0)
  7056.         GOSUB chg_ins_transp(i%,0,0)
  7057.         INC nbs%
  7058.         '
  7059.         '
  7060.         '
  7061.         '
  7062.       CASE -2
  7063.         ' ----------- Hybrid ------------
  7064.         ' -------------------------------
  7065.         '
  7066.         '
  7067.         '
  7068.         '
  7069.         b%=ADD(a%,8)                            ! Seulement valable pour Rep/Replen!!!
  7070.         a%=ADD(a%,LONG{ADD(a%,278)})            ! Pointe sur un instrument classique
  7071.         type%=INT{ADD(a%,4)}                    ! Nouveau type de l'instrument
  7072.         GOTO ld_mmd_samples
  7073.       ENDSELECT
  7074.     ENDIF
  7075.   NEXT i%
  7076.   GOSUB rec_result("done.",TRUE)
  7077.   GOSUB rec_result("  "+STR$(nbs%)+" samples.",TRUE)
  7078.   '
  7079.   ' Donnees d'expansion
  7080.   '
  7081.   GOSUB rec_result("  Converting expanded data... ",FALSE)
  7082.   IF mmd0exp%>admod%
  7083.     ' --- Finetunes ---
  7084.     a%=LONG{ADD(mmd0exp%,4)}
  7085.     b%=CARD{ADD(mmd0exp%,8)}
  7086.     c%=CARD{ADD(mmd0exp%,10)}
  7087.     IF a%>0 AND b%>0 AND c%=>4
  7088.       FOR i%=1 TO MIN(nbi%,b%)
  7089.         a$=FN ins_used_samples$(i%)
  7090.         IF LEN(a$)>0
  7091.           d%=FN sbyte(BYTE{ADD(admod%,ADD(a%,3))})
  7092.           FOR j%=0 TO SUB(LEN(a$),2) STEP 2
  7093.             GOSUB chg_sam_finetune(CARD{ADD(V:a$,j%)},d%)
  7094.           NEXT j%
  7095.         ENDIF
  7096.         ADD a%,c%                       ! Structure suivante
  7097.       NEXT i%
  7098.     ENDIF
  7099.     ' --- Noms des instruments ---
  7100.     a%=LONG{ADD(mmd0exp%,20)}           ! a% sur les noms
  7101.     b%=CARD{ADD(mmd0exp%,24)}           ! b% nbr de noms
  7102.     c%=CARD{ADD(mmd0exp%,26)}           ! c% taille d'un nom
  7103.     IF a%>0 AND b%>0 AND c%>0           ! S'il y a bien des noms
  7104.       FOR i%=1 TO MIN(nbi%,b%)
  7105.         GOSUB chg_instrname2(ADD(admod%,a%),c%,i%)
  7106.         a$=FN ins_used_samples$(i%)
  7107.         b$=SPACE$(28)
  7108.         BMOVE ADD(admod%,a%),V:b$,MIN(c%,28)
  7109.         IF LEN(a$)=2                    ! 1 seul sample
  7110.           GOSUB chg_samplename(b$,CARD{V:a$})
  7111.         ELSE IF LEN(a$)>2               ! Pluseurs samples d'octaves differents
  7112.           FOR j%=0 TO SUB(LEN(a$),2) STEP 2
  7113.             b$=LEFT$(b$,25)+"("+STR$(SUCC(SHR(j%,1)))+")"
  7114.             GOSUB chg_samplename(b$,CARD{ADD(V:a$,j%)})
  7115.           NEXT j%
  7116.         ENDIF
  7117.         ADD a%,c%                       ! Structure suivante
  7118.       NEXT i%
  7119.     ENDIF
  7120.     ' --- Nom de la chanson ---
  7121.     a%=LONG{ADD(mmd0exp%,44)}
  7122.     b%=LONG{ADD(mmd0exp%,48)}
  7123.     IF a%>0 AND b%>0
  7124.       GOSUB chg_songname2(ADD(a%,admod%),b%)
  7125.     ELSE
  7126.       GOSUB chg_songname("")
  7127.     ENDIF
  7128.   ENDIF
  7129.   GOSUB rec_result("done.",TRUE)
  7130.   '
  7131.   ' Les donnees des samples
  7132.   '
  7133.   GOSUB rec_result("  Converting sample data... ",FALSE)
  7134.   IF nbs%>0
  7135.     FOR i%=1 TO nbs%
  7136.       GOSUB decale_sample(i%,nbs%,V:adi$)
  7137.     NEXT i%
  7138.   ENDIF
  7139.   GOSUB rec_result("done.",TRUE)
  7140. RETURN
  7141. PROCEDURE load_module_669               !!!
  7142.   ' Chargement d'un module au format 669
  7143.   ' header$ : 4096 octets du debut du module
  7144. RETURN
  7145. PROCEDURE load_module_669_mem
  7146.   ' Chargement d'un module au format 669 deja en memoire
  7147.   ' header$ : 4096 octets du debut du module
  7148.   LOCAL pt%,a%,b%,c%,i%,j%,nbs%,nbp%,res%,sec%,tem%,brk%,os$
  7149.   GOSUB rec_result("It's a 6669 Composer module (669).",TRUE)
  7150.   ~FRE(0)
  7151.   GOSUB rec_result("  Converting module header... ",FALSE)
  7152.   GOSUB new_pattern_format(9)           ! 8 + 1 voies
  7153.   GOSUB chg_songname2(ADD(admod%,2),108)
  7154.   nbs%=BYTE{ADD(admod%,110)}            ! nbs% = nombre de samples
  7155.   nbp%=BYTE{ADD(admod%,111)}            ! nbp% = nombre de patterns
  7156.   res%=BYTE{ADD(admod%,112)}            ! res% = position de rebouclage
  7157.   sec%=ADD(admod%,113)
  7158.   tem%=ADD(admod%,241)
  7159.   brk%=ADD(admod%,369)
  7160.   ticks%=4
  7161.   tempo%=80
  7162.   GOSUB rec_result("done.",TRUE)
  7163.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7164.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  7165.   '
  7166.   ' Les headers des instruments
  7167.   '
  7168.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  7169.   IF nbs%>0
  7170.     pt%=ADD(admod%,497)
  7171.     a%=0
  7172.     b%=ADD(497,ADD(MUL(nbs%,25),MUL(nbp%,&H600)))       ! b% = offset de sample
  7173.     os$=""
  7174.     FOR i%=1 TO nbs%
  7175.       os$=os$+MKL$(ADD(b%,admod%))
  7176.       GOSUB chg_samplename2(pt%,13,i%)
  7177.       GOSUB chg_instrname2(pt%,13,i%)
  7178.       ADD pt%,13
  7179.       a%=LONG{pt%}
  7180.       ADD pt%,4
  7181.       GOSUB intel_l(V:a%)
  7182.       ADD b%,a%
  7183.       a%=a% AND -2
  7184.       GOSUB chg_sam_length(i%,a%)
  7185.       a%=LONG{pt%}
  7186.       ADD pt%,4
  7187.       GOSUB intel_l(V:a%)
  7188.       a%=a% AND -2
  7189.       GOSUB chg_sam_repeat(i%,a%)
  7190.       a%=LONG{pt%}
  7191.       ADD pt%,4
  7192.       GOSUB intel_l(V:a%)
  7193.       IF a%<&HFFFF0
  7194.         a%=SUB(a%,FN replen(i%)) AND -2
  7195.       ELSE
  7196.         GOSUB chg_sam_repeat(i%,0)
  7197.         a%=2
  7198.       ENDIF
  7199.       GOSUB chg_sam_volume(i%,&H100)
  7200.       GOSUB chg_sam_replen(i%,a%)
  7201.       GOSUB chg_sam_freq(i%,&H12224)            ! 8740 Hz
  7202.     NEXT i%
  7203.   ENDIF
  7204.   GOSUB rec_result("done.",TRUE)
  7205.   '
  7206.   ' Les patterns
  7207.   '
  7208.   GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  7209.   IF nbp%>0
  7210.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(9)+MKI$(64)),nbp%,TRUE)
  7211.     pt%=ADD(admod%,ADD(497,MUL(nbs%,25)))
  7212.     FOR i%=0 TO PRED(nbp%)
  7213.       b%=FN adr_pat(i%)
  7214.       ~C:g_convert_669_2_gtk%(L:pt%,L:b%)
  7215.       LONG{b%}=ADD(&HA800,BYTE{ADD(tem%,i%)})           ! Vitesse du pattern
  7216.       LONG{ADD(b%,MUL(BYTE{ADD(brk%,i%)},45))}=&HD00    ! Fin du pattern
  7217.       ADD pt%,&H600
  7218.     NEXT i%
  7219.   ENDIF
  7220.   GOSUB rec_result("done.",TRUE)
  7221.   '
  7222.   ' La song
  7223.   '
  7224.   GOSUB rec_result("  Converting song chunk... ",FALSE)
  7225.   FOR i%=0 TO 127
  7226.     IF BYTE{ADD(sec%,i%)}=255
  7227.       a%=i%
  7228.       i%=127
  7229.     ELSE
  7230.       song&(i%)=BYTE{ADD(sec%,i%)}
  7231.     ENDIF
  7232.   NEXT i%
  7233.   a%=MAX(1,a%)
  7234.   module&(101)=a%
  7235.   module&(102)=MIN(res%,PRED(a%))
  7236.   GOSUB rec_result("done.",TRUE)
  7237.   '
  7238.   ' Les instruments
  7239.   '
  7240.   GOSUB rec_result("  Converting sample chunks... ",FALSE)
  7241.   IF nbs%>0
  7242.     FOR i%=1 TO nbs%
  7243.       b%=FN length(i%)
  7244.       IF b%>0
  7245.         GOSUB decale_sample(i%,nbs%,V:os$)
  7246.         a%=FN adresse(i%)
  7247.         ~C:g_signe_sample%(L:a%,L:b%,W:1)
  7248.       ENDIF
  7249.     NEXT i%
  7250.   ENDIF
  7251.   FOR i%=2 TO 16 STEP 2
  7252.     CARD{ADD(V:balance$,i%)}=MUL(SHR(SUB(i%,2),1) AND 1,&HFFF)
  7253.   NEXT i%
  7254.   GOSUB rec_result("done.",TRUE)
  7255.   '
  7256.   ~FRE(0)
  7257. RETURN
  7258. PROCEDURE load_module_mtm               !!!
  7259.   ' Chargement d'un module au format Multi Tracker
  7260.   ' header$ : 4096 octets du debut du module
  7261. RETURN
  7262. PROCEDURE load_module_mtm_mem
  7263.   ' Chargement d'un module au format Multi Tracker deja en memoire
  7264.   ' header$ : 4096 octets du debut du module
  7265.   LOCAL pt%,a%,b%,c%,d%,i%,j%,k%,lon%,nbp%,nbs%,nbt%,sle%,nbl%,p1%,p2%,p3%,p4%
  7266.   LOCAL os$
  7267.   ~FRE(0)
  7268.   GOSUB rec_result("It's a Multi Tracker module (MTM).",TRUE)
  7269.   GOSUB rec_result("  Converting module header... ",FALSE)
  7270.   GOSUB clear_song(TRUE)
  7271.   GOSUB chg_songname2(ADD(admod%,4),20)
  7272.   GOSUB intel_w(ADD(admod%,24))
  7273.   GOSUB intel_w(ADD(admod%,28))
  7274.   nbt%=CARD{ADD(admod%,24)}             ! Nombre de pistes sauvees
  7275.   nbp%=SUCC(BYTE{ADD(admod%,26)})       ! Nombre de patterns
  7276.   lon%=SUCC(BYTE{ADD(admod%,27)})       ! Nombre de positions
  7277.   sle%=CARD{ADD(admod%,28)}             ! Song Length Extra-comment
  7278.   nbs%=BYTE{ADD(admod%,30)}             ! Nombre de samples
  7279.   nbl%=BYTE{ADD(admod%,32)}             ! Nombre de lignes
  7280.   GOSUB new_pattern_format(BYTE{ADD(admod%,33)})
  7281.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(BYTE{ADD(admod%,33)})+MKI$(nbl%)),nbp%,TRUE)
  7282.   module&(101)=MAX(lon%,1)
  7283.   FOR i%=0 TO PRED(nbr_track%)          ! Regle la balance de chaque piste
  7284.     CARD{ADD(V:balance$,SHL(i%,1))}=VAL("&H"+MID$("000100200300400500600700800924A48B6CC90DB4ED8FFF",SUCC(MUL(BYTE{ADD(admod%,ADD(i%,34))},3)),3))
  7285.   NEXT i%
  7286.   p1%=ADD(66,MUL(nbs%,37))              ! Pointe sur la sequence
  7287.   p2%=ADD(ADD(p1%,128),MUL(nbt%,192))   ! Pointe sur la disposition des pistes
  7288.   p3%=ADD(p2%,MUL(nbp%,64))             ! Pointe sur l'extra-comment
  7289.   p4%=ADD(p3%,sle%)                     ! Pointe sur les samples
  7290.   GOSUB rec_result("done.",TRUE)
  7291.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7292.   GOSUB rec_result("  "+STR$(nbs%)+" samples.",TRUE)
  7293.   '
  7294.   ' Chargement des headers des samples
  7295.   '
  7296.   GOSUB rec_result("  Converting sample headers... ",FALSE)
  7297.   IF nbs%>0
  7298.     pt%=ADD(admod%,66)
  7299.     os$=""
  7300.     a%=p4%                              ! Offset du premier sample
  7301.     FOR i%=1 TO nbs%
  7302.       GOSUB chg_samplename2(pt%,22,i%)
  7303.       GOSUB chg_instrname2(pt%,22,i%)
  7304.       GOSUB intel_l(ADD(pt%,22))
  7305.       GOSUB intel_l(ADD(pt%,26))
  7306.       GOSUB intel_l(ADD(pt%,30))
  7307.       b%=LONG{ADD(pt%,22)}
  7308.       os$=os$+MKL$(ADD(admod%,a%))
  7309.       ADD a%,b%
  7310.       b%=b% AND -2
  7311.       ADD d%,b%
  7312.       c%=MAX(MIN(LONG{ADD(pt%,26)} AND -2,SUB(b%,2)),0)
  7313.       GOSUB chg_sam_nbits(i%,SUCC(BYTE{ADD(pt%,36)} AND 1))
  7314.       GOSUB chg_sam_length(i%,b%)
  7315.       GOSUB chg_sam_repeat(i%,c%)
  7316.       GOSUB chg_sam_replen(i%,MAX(MIN(SUB(LONG{ADD(pt%,30)},c%),SUB(b%,c%)) AND -2,2))
  7317.       GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(pt%,35)},2))
  7318.       GOSUB chg_sam_volume(i%,&H100)
  7319.       b%=BYTE{ADD(pt%,36)}
  7320.       IF b%>7
  7321.         SUB b%,16
  7322.       ENDIF
  7323.       GOSUB chg_sam_finetune(i%,b%)
  7324.       ADD pt%,37
  7325.     NEXT i%
  7326.   ENDIF
  7327.   GOSUB rec_result("done.",TRUE)
  7328.   '
  7329.   ' Chargement de la song
  7330.   '
  7331.   GOSUB rec_result("  Converting song... ",FALSE)
  7332.   pt%=ADD(admod%,p1%)
  7333.   FOR i%=0 TO PRED(lon%)
  7334.     song&(i%)=BYTE{ADD(pt%,i%)}
  7335.   NEXT i%
  7336.   GOSUB rec_result("done.",TRUE)
  7337.   '
  7338.   ' Chargement des patterns
  7339.   '
  7340.   GOSUB rec_result("  Converting patterns... ",FALSE)
  7341.   d%=ADD(admod%,p2%)
  7342.   FOR i%=d% TO ADD(d%,SUB(MUL(nbp%,64),2)) STEP 2
  7343.     GOSUB intel_w(i%)
  7344.   NEXT i%
  7345.   pt%=ADD(admod%,ADD(p1%,128))
  7346.   FOR i%=1 TO nbt%
  7347.     b%=0
  7348.     FOR j%=0 TO MUL(PRED(nbp%),64) STEP 64
  7349.       a%=FN adr_pat(b%)
  7350.       FOR k%=j% TO ADD(j%,SHL(PRED(nbr_track%),1)) STEP 2
  7351.         IF i%=CARD{ADD(d%,k%)}
  7352.           ~C:g_convert_mtmv_2_gtk%(L:pt%,L:a%,W:nbr_track%,W:nbl%)
  7353.         ENDIF
  7354.         ADD a%,5
  7355.       NEXT k%
  7356.       INC b%
  7357.     NEXT j%
  7358.     ADD pt%,192
  7359.   NEXT i%
  7360.   GOSUB rec_result("done.",TRUE)
  7361.   '
  7362.   ' Charge les instruments
  7363.   '
  7364.   GOSUB rec_result("  Converting samples... ",FALSE)
  7365.   IF nbs%>0
  7366.     FOR i%=1 TO nbs%
  7367.       b%=FN length(i%)
  7368.       IF b%>0
  7369.         GOSUB decale_sample(i%,nbs%,V:os$)
  7370.         a%=FN adresse(i%)
  7371.         c%=FN resol(i%)
  7372.         IF c%=2
  7373.           ~C:g_intel_16_bits%(L:a%,L:b%)
  7374.         ENDIF
  7375.         ~C:g_signe_sample%(L:a%,L:b%,W:c%)
  7376.       ENDIF
  7377.     NEXT i%
  7378.   ENDIF
  7379.   GOSUB rec_result("done.",TRUE)
  7380.   ~FRE(0)
  7381. RETURN
  7382. PROCEDURE load_module_s3m               !!!
  7383.   ' Chargement d'un module au format Scream Tracker 3
  7384.   ' header$ : 4096 octets du debut du module
  7385. RETURN
  7386. PROCEDURE load_module_s3m_mem
  7387.   ' Chargement d'un module au format Scream Tracker 3 deja en memoire
  7388.   ' header$ : 4096 octets du debut du module
  7389.   LOCAL pt%,a%,b%,c%,d%,convtrk$,ffv%,flg%,i%,j%,lon%,nbp%,nbs%,xxx1%,xxx2%,xxx3%,os$
  7390.   ~FRE(0)
  7391.   GOSUB rec_result("It's a Scream Tracker 3 module (S3M).",TRUE)
  7392.   GOSUB rec_result("  Converting module header... ",FALSE)
  7393.   GOSUB chg_songname2(admod%,28)
  7394.   GOSUB intel_w(ADD(admod%,&H20))
  7395.   GOSUB intel_w(ADD(admod%,&H22))
  7396.   GOSUB intel_w(ADD(admod%,&H24))
  7397.   GOSUB intel_w(ADD(admod%,&H2A))
  7398.   lon%=CARD{ADD(admod%,&H20)}           ! Longueur de la song (pair)
  7399.   nbs%=CARD{ADD(admod%,&H22)}           ! Nombre de samples
  7400.   nbp%=CARD{ADD(admod%,&H24)}           ! Nombre de patterns sauves
  7401.   ffv%=CARD{ADD(admod%,&H2A)}           ! File Format Version
  7402.   ticks%=BYTE{ADD(admod%,&H31)}         ! Vitesse
  7403.   tempo%=BYTE{ADD(admod%,&H32)}         ! Tempo
  7404.   xxx1%=ADD(&H60,SUCC(lon%) AND -2)     ! Ca doit toujours etre pair mais on ne sait jamais...
  7405.   xxx2%=ADD(xxx1%,SHL(nbs%,1))
  7406.   xxx3%=ADD(xxx2%,SHL(nbp%,1))
  7407.   '
  7408.   ' Recherche du nombre de voies
  7409.   '
  7410.   nbt%=0                                ! Nombre de voies
  7411.   convtrk$=""
  7412.   FOR i%=0 TO 31
  7413.     b%=BYTE{ADD(admod%,ADD(i%,&H40))} AND 127
  7414.     IF b%<16
  7415.       convtrk$=convtrk$+CHR$(nbt%)
  7416.       CARD{ADD(V:balance$,SHL(nbt%,1))}=MUL(SHR(b%,3),&HFFF)
  7417.       INC nbt%
  7418.     ELSE
  7419.       convtrk$=convtrk$+CHR$(255)
  7420.     ENDIF
  7421.   NEXT i%
  7422.   IF nbt%>0
  7423.     GOSUB new_pattern_format(nbt%)
  7424.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbt%)+MKI$(64)),nbp%,TRUE)
  7425.     '
  7426.     ' Les pan positions
  7427.     '
  7428.     IF BYTE{ADD(admod%,&H35)}=252
  7429.       FOR i%=0 TO PRED(nbt%)
  7430.         a%=BYTE{ADD(ADD(admod%,xxx3%),i%)}
  7431.         IF BTST(a%,5)
  7432.           a%=a% AND 15
  7433.           CARD{ADD(V:balance$,SHL(i%,1))}=MIN(DIV(MUL(a%,&H1000),15),&HFFF)
  7434.         ENDIF
  7435.       NEXT i%
  7436.     ENDIF
  7437.     GOSUB rec_result("done.",TRUE)
  7438.     GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7439.     GOSUB rec_result("  "+STR$(nbs%)+" samples",TRUE)
  7440.     '
  7441.     ' Chargement du header des samples
  7442.     '
  7443.     os$=""
  7444.     IF nbs%>0
  7445.       GOSUB rec_result("  Converting sample headers... ",FALSE)
  7446.       FOR i%=1 TO nbs%
  7447.         a%=ADD(admod%,ADD(xxx1%,SHL(PRED(i%),1)))
  7448.         GOSUB intel_w(a%)
  7449.         pt%=ADD(admod%,SHL(CARD{a%},4))
  7450.         a%=0
  7451.         IF BYTE{pt%}=1                    ! Est-ce bien un sample ?
  7452.           IF BYTE{ADD(pt%,&H1E)}=0        ! Sample non compacte
  7453.             GOSUB chg_samplename2(ADD(pt%,&H30),28,i%)
  7454.             GOSUB chg_instrname2(ADD(pt%,&H30),28,i%)
  7455.             GOSUB intel_w(ADD(pt%,&HE))
  7456.             GOSUB intel_l(ADD(pt%,&H10))
  7457.             GOSUB intel_l(ADD(pt%,&H14))
  7458.             GOSUB intel_l(ADD(pt%,&H18))
  7459.             GOSUB intel_l(ADD(pt%,&H20))
  7460.             flg%=BYTE{ADD(pt%,&H1F)}      ! Flags divers
  7461.             a%=MIN(MAX(LONG{ADD(pt%,&H10)},0),&HFFFFFE) AND -2
  7462.             IF BTST(flg%,0)               ! Boucle
  7463.               b%=MIN(MAX(LONG{ADD(pt%,&H14)},0) AND -2,SUB(a%,2))
  7464.               c%=MIN(MAX(SUB(MAX(LONG{ADD(pt%,&H18)},0) AND -2,b%),2),SUB(a%,b%))
  7465.             ELSE                          ! Pas boucle
  7466.               b%=0
  7467.               c%=2
  7468.             ENDIF
  7469.             GOSUB chg_sam_freq(i%,LONG{ADD(pt%,&H20)} AND 65535)
  7470.             GOSUB chg_sam_nbits(i%,SUB(1,BTST(flg%,2)))
  7471.             GOSUB chg_sam_length(i%,a%)
  7472.             GOSUB chg_sam_repeat(i%,b%)
  7473.             GOSUB chg_sam_replen(i%,c%)
  7474.             GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(pt%,&H1C)},2))
  7475.             GOSUB chg_sam_volume(i%,&H100)
  7476.             os$=os$+MKL$(ADD(admod%,SHL(CARD{ADD(pt%,&HE)},4)))
  7477.           ELSE
  7478.             os$=os$+MKL$(0)
  7479.           ENDIF
  7480.         ELSE
  7481.           os$=os$+MKL$(0)
  7482.         ENDIF
  7483.       NEXT i%
  7484.       GOSUB rec_result("done.",TRUE)
  7485.     ENDIF
  7486.     IF lon%>0 AND nbt%>0
  7487.       '
  7488.       ' Chargement de la sequence
  7489.       '
  7490.       GOSUB rec_result("  Converting song... ",FALSE)
  7491.       a%=0
  7492.       b%=0
  7493.       REPEAT
  7494.         song&(a%)=BYTE{ADD(admod%,ADD(b%,&H60))}
  7495.         IF song&(a%)<254
  7496.           INC a%
  7497.         ENDIF
  7498.         INC b%
  7499.       UNTIL b%=lon%                     ! OR BYTE{ADD(admod%,ADD(b%,&H60))}=255
  7500.       song&(a%)=0
  7501.       module&(101)=a%
  7502.       GOSUB rec_result("done.",TRUE)
  7503.       '
  7504.       ' Chargement des patterns
  7505.       '
  7506.       GOSUB rec_result("  Converting patterns... ",FALSE)
  7507.       FOR i%=0 TO PRED(nbp%)
  7508.         a%=ADD(admod%,ADD(xxx2%,SHL(i%,1)))
  7509.         GOSUB intel_w(a%)
  7510.         pt%=ADD(admod%,SHL(CARD{a%},4))
  7511.         a%=CARD{pt%}                    ! Longueur du pattern
  7512.         GOSUB intel_w(ADD(V:a%,2))      ! Mais qu'est-ce que j'en fais ???
  7513.         ADD pt%,2
  7514.         b%=FN adr_pat(i%)
  7515.         c%=V:convtrk$
  7516.         ~C:g_convert_s3m_2_gtk%(L:pt%,L:b%,L:c%,W:nbr_track%)
  7517.       NEXT i%
  7518.       GOSUB rec_result("done.",TRUE)
  7519.     ENDIF
  7520.     '
  7521.     ' Chargement des sample
  7522.     '
  7523.     IF nbs%>0
  7524.       GOSUB rec_result("  Converting samples... ",FALSE)
  7525.       FOR i%=1 TO nbs%
  7526.         a%=FN length(i%)
  7527.         IF a%>0
  7528.           GOSUB decale_sample(i%,nbs%,V:os$)
  7529.           d%=FN adresse(i%)
  7530.           b%=FN resol(i%)
  7531.           IF b%=2               ! 16 bits
  7532.             ~C:g_intel_16_bits%(L:d%,L:a%)
  7533.           ENDIF
  7534.           IF ffv%=2
  7535.             ~C:g_signe_sample%(L:d%,L:a%,W:b%)
  7536.           ENDIF
  7537.         ENDIF
  7538.       NEXT i%
  7539.       GOSUB rec_result("done.",TRUE)
  7540.     ENDIF
  7541.   ENDIF
  7542.   ~FRE(0)
  7543. RETURN
  7544. PROCEDURE load_module_ult               !!!
  7545.   ' Chargement d'un module au format Ultra Tracker
  7546.   ' header$ : 4096 octets du debut du module
  7547. RETURN
  7548. PROCEDURE load_module_ult_mem
  7549.   ' Chargement d'un module au format Ultra Tracker
  7550.   ' header$ : 4096 octets du debut du module
  7551.   LOCAL pt%,a%,b%,bidi%,c%,d%,e%,i%,j%,nbp%,nbs%,ofp%,patt_seq%,res%,shs%,ver%,pat$,os$
  7552.   ~FRE(0)
  7553.   GOSUB rec_result("It's an Ultra Tracker module (ULT).",TRUE)
  7554.   GOSUB rec_result("  Converting module header... ",FALSE)
  7555.   ver%=1                                ! Numero de version du format
  7556.   shs%=64                               ! Taille d'un header de sample
  7557.   SELECT VAL(MID$(header$,13,3))
  7558.   CASE 2
  7559.     ver%=2
  7560.   CASE 3
  7561.     ver%=3
  7562.   CASE 4
  7563.     ver%=4
  7564.     shs%=66
  7565.   ENDSELECT
  7566.   GOSUB chg_songname2(ADD(admod%,15),32)
  7567.   res%=ADD(MUL(BYTE{ADD(admod%,47)},32),49)     ! Offset des descripteurs de samples
  7568.   nbs%=BYTE{ADD(admod%,PRED(res%))}
  7569.   patt_seq%=ADD(res%,MUL(nbs%,shs%))            ! Offset de la song
  7570.   nbp%=SUCC(BYTE{ADD(admod%,ADD(patt_seq%,257))})       ! Nombre de patterns
  7571.   GOSUB new_pattern_format(SUCC(BYTE{ADD(admod%,ADD(patt_seq%,256))}))
  7572.   IF ver%>2
  7573.     FOR i%=0 TO PRED(nbr_track%)
  7574.       CARD{ADD(V:balance$,SHL(i%,1))}=MUL(BYTE{ADD(ADD(admod%,ADD(patt_seq%,258)),i%)},&H111)
  7575.     NEXT i%
  7576.   ENDIF
  7577.   GOSUB rec_result("done.",TRUE)
  7578.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7579.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  7580.   '
  7581.   ' La song
  7582.   '
  7583.   GOSUB rec_result("  Converting song... ",FALSE)
  7584.   i%=0
  7585.   REPEAT
  7586.     a%=BYTE{ADD(admod%,ADD(patt_seq%,i%))}
  7587.     IF a%<nbp%
  7588.       song&(i%)=a%
  7589.       INC i%
  7590.     ENDIF
  7591.   UNTIL a%=>nbp% OR i%=>256
  7592.   module&(101)=i%
  7593.   GOSUB rec_result("done.",TRUE)
  7594.   '
  7595.   ' Chargement des patterns
  7596.   '
  7597.   GOSUB rec_result("  Converting patterns... ",FALSE)
  7598.   IF ver%<3
  7599.     ofp%=ADD(patt_seq%,258)
  7600.   ELSE
  7601.     ofp%=ADD(patt_seq%,ADD(258,nbr_track%))
  7602.   ENDIF
  7603.   IF nbp%>0
  7604.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbr_track%)+MKI$(64)),nbp%,FALSE)
  7605.     FOR j%=0 TO PRED(nbr_track%)
  7606.       FOR i%=0 TO PRED(nbp%)
  7607.         a%=ADD(admod%,ofp%)
  7608.         b%=FN adr_trk(i%,0,j%)
  7609.         a%=C:g_convert_ult_2_gtk%(L:a%,L:b%,W:nbr_track%)       ! Convertit et prend la longueur de cette voie
  7610.         ADD ofp%,a%
  7611.       NEXT i%
  7612.     NEXT j%
  7613.   ENDIF
  7614.   GOSUB rec_result("done.",TRUE)
  7615.   '
  7616.   ' Chargement des samples
  7617.   '
  7618.   IF nbs%>0
  7619.     GOSUB rec_result("  Converting samples... ",FALSE)
  7620.     os$=""
  7621.     FOR i%=1 TO nbs%
  7622.       pt%=ADD(admod%,ADD(res%,MUL(PRED(i%),shs%)))
  7623.       GOSUB chg_samplename2(pt%,28,i%)
  7624.       GOSUB chg_instrname2(pt%,28,i%)
  7625.       GOSUB intel_l(ADD(pt%,44))
  7626.       GOSUB intel_l(ADD(pt%,48))
  7627.       GOSUB intel_l(ADD(pt%,52))
  7628.       GOSUB intel_l(ADD(pt%,56))
  7629.       GOSUB intel_w(ADD(pt%,SUB(shs%,2)))
  7630.       bidi%=BYTE{ADD(pt%,61)}
  7631.       b%=SUB(LONG{ADD(pt%,56)},LONG{ADD(pt%,52)})       ! Longueur
  7632.       c%=LONG{ADD(pt%,44)}                              ! Loop start
  7633.       d%=LONG{ADD(pt%,48)}                              ! Loop end
  7634.       IF BTST(bidi%,2)                                  ! 16 bits ?
  7635.         ADD b%,b%
  7636.         ADD c%,c%
  7637.         ADD d%,d%
  7638.       ENDIF
  7639.       os$=os$+MKL$(ADD(admod%,ofp%))
  7640.       ADD ofp%,b%
  7641.       b%=MIN(MAX(b% AND -2,0),&HFFFFFE)
  7642.       IF BTST(bidi%,3) OR BTST(bidi%,4)                 ! Bouclage
  7643.         c%=MAX(MIN(c% AND -2,SUB(b%,2)),0)
  7644.         d%=MAX(SUB(MIN(d%,b%),c%),2) AND -2
  7645.       ELSE
  7646.         c%=0
  7647.         d%=2
  7648.       ENDIF
  7649.       GOSUB chg_sam_length(i%,b%)
  7650.       GOSUB chg_sam_repeat(i%,c%)
  7651.       GOSUB chg_sam_replen(i%,d%)
  7652.       d%=CARD{ADD(pt%,SUB(shs%,2))} AND 15      ! Finetune
  7653.       IF d%>7
  7654.         SUB d%,16
  7655.       ENDIF
  7656.       GOSUB chg_sam_finetune(i%,d%)
  7657.       GOSUB chg_ins_volume(i%,BYTE{ADD(pt%,60)})
  7658.       GOSUB chg_sam_volume(i%,&H100)
  7659.       GOSUB chg_sam_nbits(i%,SUB(1,BTST(bidi%,2)))
  7660.       IF ver%>3                         ! Frequence d'echantillonnage
  7661.         GOSUB intel_w(ADD(pt%,SUB(shs%,4)))
  7662.         GOSUB chg_sam_freq(i%,CARD{ADD(pt%,SUB(shs%,4))})
  7663.       ENDIF
  7664.     NEXT i%
  7665.     FOR i%=1 TO nbs%
  7666.       a%=FN length(i%)
  7667.       IF a%>0
  7668.         GOSUB decale_sample(i%,nbs%,V:os$)
  7669.         IF FN resol(i%)=2       ! 16 bits
  7670.           d%=FN adresse(i%)
  7671.           ~C:g_intel_16_bits%(L:d%,L:a%)
  7672.         ENDIF
  7673.       ENDIF
  7674.     NEXT i%
  7675.     GOSUB rec_result("done.",TRUE)
  7676.   ENDIF
  7677.   ~FRE(0)
  7678. RETURN
  7679. PROCEDURE load_module_dtm_mem
  7680.   LOCAL a%,b%,c%,adsq%,adpatt%,adinst%,finmod%,i%,j%,k%,l%,nbs%,nbp%,pt%
  7681.   LOCAL adp$,adi$,map$
  7682.   ~FRE(0)
  7683.   GOSUB rec_result("It's a Digital Tracker module (DTM).",TRUE)
  7684.   '
  7685.   ' Identification des chunks
  7686.   '
  7687.   finmod%=ADD(admod%,lonmod%)
  7688.   adp$=STRING$(1024,0)
  7689.   adi$=STRING$(1024,0)
  7690.   map$=STRING$(256,MKI$(1)+MKI$(1))
  7691.   a%=admod%
  7692.   REPEAT
  7693.     SELECT LONG{a%}
  7694.     CASE "S.Q."
  7695.       adsq%=a%
  7696.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7697.     CASE "PATT"
  7698.       adpatt%=a%
  7699.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7700.     CASE "INST"
  7701.       adinst%=a%
  7702.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7703.     CASE "DAPT"
  7704.       LONG{ADD(V:adp$,SHL(CARD{ADD(a%,12)},2))}=a%
  7705.       CARD{ADD(V:map$,ADD(SHL(CARD{ADD(a%,12)},2),2))}=CARD{ADD(a%,14)}
  7706.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7707.     CASE "DAIT"
  7708.       LONG{ADD(V:adi$,SHL(CARD{ADD(a%,8)},2))}=a%
  7709.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  7710.     ENDSELECT
  7711.     a%=C:g_dtm_next_chunk%(L:a%,L:finmod%)
  7712.   UNTIL a%>=finmod%
  7713.   '
  7714.   ' Infos generales
  7715.   '
  7716.   GOSUB rec_result("  Converting module header... ",FALSE)
  7717.   GOSUB new_pattern_format(CARD{ADD(adpatt%,8)})
  7718.   GOSUB chg_songname2(ADD(admod%,22),20)
  7719.   IF CARD{ADD(admod%,14)}<>0
  7720.     ticks%=CARD{ADD(admod%,14)}                 ! Vitesse
  7721.   ENDIF
  7722.   IF CARD{ADD(admod%,16)}<>0                    ! Tempo
  7723.     tempo%=CARD{ADD(admod%,16)}
  7724.   ENDIF
  7725.   nbs%=CARD{ADD(adinst%,8)}
  7726.   GOSUB rec_result("done.",TRUE)
  7727.   GOSUB rec_result("  "+STR$(nbs%)+" samples,",TRUE)
  7728.   '
  7729.   ' La song
  7730.   '
  7731.   GOSUB rec_result("  Converting song chunk... ",FALSE)
  7732.   module&(101)=CARD{ADD(adsq%,8)}
  7733.   module&(102)=CARD{ADD(adsq%,10)}
  7734.   ARRAYFILL song&(),0
  7735.   FOR i%=0 TO PRED(module&(101))
  7736.     song&(i%)=BYTE{ADD(ADD(adsq%,16),i%)}
  7737.   NEXT i%
  7738.   GOSUB rec_result("done.",TRUE)
  7739.   '
  7740.   ' Les patterns
  7741.   '
  7742.   GOSUB rec_result("  Converting pattern chunks... ",FALSE)
  7743.   nbp%=CARD{ADD(adpatt%,10)}
  7744.   FOR i%=0 TO SHL(PRED(nbp%),2) STEP 4
  7745.     CARD{ADD(V:map$,i%)}=nbr_track%
  7746.   NEXT i%
  7747.   GOSUB create_space_multipatchunk(map$,nbp%,FALSE)
  7748.   FOR i%=0 TO PRED(nbp%)
  7749.     a%=LONG{ADD(V:adp$,SHL(i%,2))}      ! Adresse du pattern
  7750.     IF a%<>0
  7751.       l%=CARD{ADD(a%,14)}
  7752.       IF l%>0
  7753.         ADD a%,16                       ! Adresse des donnees
  7754.         b%=FN adr_pat(i%)
  7755.         c%=MUL(l%,nbr_track%)
  7756.         IF LONG{ADD(adpatt%,12)}=&H322E3034     ! '2.04'
  7757.           ~C:g_convert_dtm_2_gtk%(L:a%,L:b%,L:c%)
  7758.         ELSE                                    ! Ancien format
  7759.           BMOVE a%,b%,SHL(c%,2)
  7760.           ~C:g_convert_nt_2_gtk%(L:b%,L:c%)
  7761.         ENDIF
  7762.       ENDIF
  7763.     ENDIF
  7764.   NEXT i%
  7765.   GOSUB rec_result("done.",TRUE)
  7766.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7767.   '
  7768.   ' Les instruments
  7769.   '
  7770.   GOSUB rec_result("  Converting sample chunks... ",FALSE)
  7771.   IF nbs%>0
  7772.     FOR i%=1 TO nbs%
  7773.       IF LONG{ADD(V:adi$,SHL(PRED(i%),2))}>admod%
  7774.         a%=ADD(ADD(adinst%,10),MUL(PRED(i%),50))
  7775.         GOSUB chg_samplename2(ADD(a%,18),22,i%)
  7776.         GOSUB chg_instrname2(ADD(a%,18),22,i%)
  7777.         c%=LONG{ADD(a%,4)} AND -2
  7778.         GOSUB chg_sam_length(i%,c%)
  7779.         IF c%>0
  7780.           GOSUB chg_sam_freq(i%,LONG{ADD(a%,46)})
  7781.           GOSUB chg_sam_nbits(i%,SHR(BYTE{ADD(a%,41)},3))
  7782.           b%=LONG{ADD(a%,14)} AND -2
  7783.           IF b%>2
  7784.             GOSUB chg_sam_repeat(i%,MIN(SUB(c%,2),MAX(0,LONG{ADD(a%,10)} AND -2)))
  7785.             GOSUB chg_sam_replen(i%,MIN(SUB(c%,FN repeat(i%)),MAX(2,b%)))
  7786.           ELSE
  7787.             GOSUB chg_sam_repeat(i%,0)
  7788.             GOSUB chg_sam_replen(i%,2)
  7789.           ENDIF
  7790.           c%=BYTE{ADD(a%,8)}
  7791.           IF c%>7
  7792.             SUB c%,16
  7793.           ENDIF
  7794.           GOSUB chg_sam_finetune(i%,c%)
  7795.           GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(a%,9)},2))
  7796.           GOSUB chg_sam_volume(i%,&H100)
  7797.         ENDIF
  7798.       ENDIF
  7799.     NEXT i%
  7800.   ENDIF
  7801.   ~FRE(0)
  7802.   IF nbs%>0
  7803.     FOR i%=0 TO PRED(nbs%)
  7804.       IF FN length(SUCC(i%))>0
  7805.         LONG{ADD(V:adi$,SHL(i%,2))}=ADD(LONG{ADD(V:adi$,SHL(i%,2))},10)
  7806.       ELSE
  7807.         LONG{ADD(V:adi$,SHL(i%,2))}=0
  7808.       ENDIF
  7809.     NEXT i%
  7810.     FOR i%=1 TO nbs%
  7811.       GOSUB decale_sample(i%,nbs%,V:adi$)
  7812.     NEXT i%
  7813.   ENDIF
  7814.   GOSUB rec_result("done.",TRUE)
  7815. RETURN
  7816. PROCEDURE load_module_xm_mem            !!!
  7817.   LOCAL a%,b%,c%,d%,i%,j%,l%,hs%,nbi%,nbl%,nbp%,nbt%,pt%,sl%,snum%,sr%,tem%
  7818.   LOCAL transp$,adi$,map$
  7819.   ~FRE(0)
  7820.   GOSUB rec_result("It's a FastTracker 2 module (XM).",TRUE)
  7821.   '
  7822.   ' Header du module
  7823.   '
  7824.   GOSUB rec_result("  Converting module header... ",FALSE)
  7825.   GOSUB chg_songname2(ADD(admod%,17),20)
  7826.   GOSUB intel_l(ADD(admod%,60))
  7827.   GOSUB intel_w(ADD(admod%,64))
  7828.   GOSUB intel_w(ADD(admod%,66))
  7829.   GOSUB intel_w(ADD(admod%,68))
  7830.   GOSUB intel_w(ADD(admod%,70))
  7831.   GOSUB intel_w(ADD(admod%,72))
  7832.   GOSUB intel_w(ADD(admod%,76))
  7833.   GOSUB intel_w(ADD(admod%,78))
  7834.   pt%=ADD(ADD(60,admod%),LONG{ADD(admod%,60)})  ! Pointe sur le 1er pattern
  7835.   sl%=CARD{ADD(admod%,64)}              ! Song length
  7836.   sr%=CARD{ADD(admod%,66)}              ! Song repeat
  7837.   nbt%=CARD{ADD(admod%,68)}             ! Nombre de tracks
  7838.   nbp%=CARD{ADD(admod%,70)}             ! Nombre de patterns
  7839.   nbi%=CARD{ADD(admod%,72)}             ! Nombre d'instruments
  7840.   ticks%=CARD{ADD(admod%,76)}           ! Vitesse
  7841.   tempo%=CARD{ADD(admod%,78)}           ! Tempo
  7842.   '
  7843.   ' Recherche du nombre de lignes
  7844.   ' DesINTELisation des mots dans les headers des patterns
  7845.   '
  7846.   map$=""
  7847.   nbl%=1
  7848.   a%=pt%
  7849.   FOR i%=1 TO nbp%
  7850.     GOSUB intel_l(a%)
  7851.     GOSUB intel_w(ADD(a%,5))
  7852.     GOSUB intel_w(ADD(a%,7))
  7853.     nbl%=CARD{ADD(a%,5)}
  7854.     map$=map$+MKI$(nbt%)+MKI$(nbl%)
  7855.     ADD a%,ADD(LONG{a%},CARD{ADD(a%,7)})
  7856.   NEXT i%
  7857.   GOSUB new_pattern_format(nbt%)
  7858.   GOSUB rec_result("done.",TRUE)
  7859.   GOSUB rec_result("  "+STR$(nbp%)+" patterns,",TRUE)
  7860.   GOSUB rec_result("  "+STR$(nbi%)+" instruments,",TRUE)
  7861.   '
  7862.   ' La song
  7863.   '
  7864.   GOSUB rec_result("  Converting song... ",FALSE)
  7865.   module&(101)=sl%
  7866.   module&(102)=sr%
  7867.   FOR i%=0 TO PRED(FN song_length)
  7868.     song&(i%)=BYTE{ADD(ADD(admod%,80),i%)}
  7869.   NEXT i%
  7870.   GOSUB rec_result("done.",TRUE)
  7871.   '
  7872.   ' Les patterns
  7873.   '
  7874.   GOSUB rec_result("  Converting patterns... ",FALSE)
  7875.   GOSUB create_space_multipatchunk(map$,nbp%,FALSE)
  7876.   FOR i%=0 TO PRED(nbp%)
  7877.     IF BYTE{ADD(pt%,4)}=0               ! Packing type 0
  7878.       l%=CARD{ADD(pt%,5)}
  7879.       a%=ADD(pt%,9)
  7880.       b%=FN adr_pat(i%)
  7881.       ~C:g_convert_ft2_2_gtk%(L:a%,L:b%,W:nbr_track%,W:l%)
  7882.       pt%=ADD(a%,CARD{ADD(pt%,7)})
  7883.     ENDIF
  7884.   NEXT i%
  7885.   GOSUB rec_result("done.",TRUE)
  7886.   '
  7887.   ' Les instruments et headers des samples
  7888.   '
  7889.   GOSUB rec_result("  Converting instruments and sample headers... ",FALSE)
  7890.   snum%=1                               ! Sample courant
  7891.   adi$=""
  7892.   FOR i%=1 TO nbi%
  7893.     GOSUB intel_l(pt%)
  7894.     GOSUB intel_w(ADD(pt%,27))
  7895.     hs%=LONG{pt%}                       ! Taille du header d'instr
  7896.     c%=CARD{ADD(pt%,27)}                ! Nombre de samples dans l'instr
  7897.     GOSUB chg_instrname2(ADD(pt%,4),22,i%)
  7898.     IF c%=0
  7899.       ADD pt%,hs%                       ! Si pas de sample, instr suivant
  7900.     ELSE
  7901.       GOSUB chg_ins_volume(i%,256)
  7902.       FOR j%=1 TO 95                    ! Affectation des samples pour chaque note
  7903.         GOSUB chg_ins_sample(i%,j%,ADD(BYTE{ADD(pt%,ADD(33,j%))},snum%))
  7904.       NEXT j%
  7905.       FOR j%=96 TO 127
  7906.         GOSUB chg_ins_sample(i%,j%,FN isample(i%,95))
  7907.       NEXT j%
  7908.       GOSUB chg_ins_sample(i%,0,0)
  7909.       transp$=STRING$(256,0)            ! Table des transposition pour chaque sample
  7910.       GOSUB intel_l(ADD(pt%,29))
  7911.       a%=LONG{ADD(pt%,29)}              ! Taille des Sample Headers
  7912.       ADD pt%,hs%                       ! Pointe sur le premier header de sample
  7913.       ' Scanne chaque header de sample
  7914.       b%=0                              ! Taille totale des sample data de l'instrument
  7915.       FOR j%=1 TO c%                    ! DesINTELise tous les headers
  7916.         GOSUB intel_l(pt%)
  7917.         GOSUB intel_l(ADD(pt%,4))
  7918.         GOSUB intel_l(ADD(pt%,8))
  7919.         BYTE{ADD(V:transp$,snum%)}=BYTE{ADD(pt%,16)}    ! Memorise la transposition
  7920.         adi$=adi$+MKL$(b%)
  7921.         d%=LONG{pt%}
  7922.         ADD b%,d%
  7923.         d%=d% AND -2
  7924.         GOSUB chg_sam_length(snum%,d%)
  7925.         IF BTST(BYTE{ADD(pt%,14)},0) OR BTST(BYTE{ADD(pt%,14)},1)
  7926.           GOSUB chg_sam_repeat(snum%,LONG{ADD(pt%,4)} AND -2)
  7927.           GOSUB chg_sam_replen(snum%,MIN(MAX(LONG{ADD(pt%,8)},2),SUB(FN length(snum%),FN repeat(snum%))) AND -2)
  7928.         ELSE
  7929.           GOSUB chg_sam_repeat(snum%,0)
  7930.           GOSUB chg_sam_replen(snum%,2)
  7931.         ENDIF
  7932.         GOSUB chg_sam_volume(snum%,SHL(BYTE{ADD(pt%,12)},2))
  7933.         GOSUB chg_sam_freq(snum%,8363)
  7934.         GOSUB chg_sam_finetune(snum%,DIV(FN sbyte(BYTE{ADD(pt%,13)}),16))
  7935.         GOSUB chg_sam_nbits(snum%,SUB(1,BTST(BYTE{ADD(pt%,14)},4)))
  7936.         GOSUB chg_sam_balance(snum%,SHL(BYTE{ADD(pt%,15)},4))
  7937.         GOSUB chg_samplename2(ADD(pt%,18),22,snum%)
  7938.         ADD pt%,a%
  7939.         INC snum%                       ! *** Attention faut pas depasser 255!!!!!
  7940.       NEXT j%
  7941.       FOR j%=1 TO c%                    ! Les adresses des samples dans le XM
  7942.         LONG{ADD(V:adi$,SHL(SUB(PRED(snum%),j%),2))}=ADD(LONG{ADD(V:adi$,SHL(SUB(PRED(snum%),j%),2))},pt%)
  7943.       NEXT j%
  7944.       ADD pt%,b%                        ! Saute les donnees de sample
  7945.       FOR j%=1 TO 95                    ! Affecte les transpositions a chaque note suivant les samples
  7946.         GOSUB chg_ins_transp(i%,j%,BYTE{ADD(V:transp$,FN isample(i%,j%))})
  7947.       NEXT j%
  7948.       FOR j%=96 TO 127
  7949.         GOSUB chg_ins_transp(i%,j%,FN itransp(i%,95))
  7950.       NEXT j%
  7951.       GOSUB chg_ins_transp(i%,0,0)
  7952.     ENDIF
  7953.   NEXT i%
  7954.   GOSUB rec_result("done.",TRUE)
  7955.   GOSUB rec_result("  "+STR$(snum%)+" samples,",TRUE)
  7956.   '
  7957.   ' Deplacement des samples et conversion en absolu
  7958.   '
  7959.   IF snum%>1
  7960.     GOSUB rec_result("  Converting sample data... ",FALSE)
  7961.     FOR i%=1 TO PRED(snum%)
  7962.       GOSUB decale_sample(i%,PRED(snum%),V:adi$)
  7963.       a%=FN adresse(i%)
  7964.       b%=FN length(i%)
  7965.       c%=FN resol(i%)
  7966.       IF c%=2                           ! 16 bits
  7967.         ~C:g_intel_16_bits%(L:a%,L:b%)
  7968.       ENDIF
  7969.       ~C:g_delta_2_absolu%(L:a%,L:b%,W:c%)
  7970.     NEXT i%
  7971.     GOSUB rec_result("done.",TRUE)
  7972.   ENDIF
  7973. RETURN
  7974. PROCEDURE load_module_mgt_mem           !!!
  7975.   LOCAL nbt%,nbp%,nbs%
  7976.   LOCAL version%,nb_musics%,nb_orders%,nb_tracks%,attributes%
  7977.   LOCAL pt_musics%,pt_sequence%,pt_sample_infos%,pt_patterns%,pt_track_ptr%,pt_sample_data%
  7978.   ~FRE(0)
  7979.   GOSUB rec_result("It's a MegaTracker module (MGT).",TRUE)
  7980.   '
  7981.   ' Header du fichier
  7982.   '
  7983.   version%=BYTE{ADD(admod%,4)}
  7984.   nbt%=CARD{ADD(admod%,8)}
  7985.   nb_musics%=CARD{ADD(admod%,10)}
  7986.   nb_orders%=CARD{ADD(admod%,12)}
  7987.   nbp%=CARD{ADD(admod%,14)}
  7988.   nb_tracks%=CARD{ADD(admod%,16)}
  7989.   nbs%=CARD{ADD(admod%,18)}
  7990.   attributes%=CARD{ADD(admod%,20)}
  7991.   pt_musics%=ADD(admod%,LONG{ADD(admod%,26)})
  7992.   pt_sample_infos%=ADD(admod%,LONG{ADD(admod%,34)})
  7993.   pt_patterns%=ADD(admod%,LONG{ADD(admod%,38)})
  7994.   pt_track_ptr%=ADD(admod%,LONG{ADD(admod%,42)})
  7995.   pt_sample_data%=ADD(admod%,LONG{ADD(admod%,46)})
  7996.   GOSUB rec_result("  Format version: "+STR$(SHR(version%,4))+"."+STR$(version% AND 15)+".",TRUE)
  7997.   GOSUB rec_result("  "+STR$(nbp%)+" patterns.",TRUE)
  7998.   GOSUB rec_result("  "+STR$(nbs%)+" samples.",TRUE)
  7999.   '
  8000.   IF ADD(LONG{ADD(admod%,50)},LONG{ADD(admod%,54)})>FN zone_free2
  8001.     erreur%=1
  8002.   ELSE
  8003.     '
  8004.     ' Musique
  8005.     '
  8006.     GOSUB chg_songname2(ADD(pt_music%,0),32)
  8007.     pt_sequence%=ADD(admod%,LONG{ADD(pt_music%,32)})
  8008.     module&(101)=CARD{ADD(pt_music%,36)}
  8009.     module&(102)=CARD{ADD(pt_music%,38)}
  8010.     tempo%=CARD{ADD(pt_music%,40)}
  8011.     FOR i%=0 TO PRED(module&(101))
  8012.       song&(i%)=CARD{ADD(pt_sequence%,SHL(i%,1))}
  8013.     NEXT i%
  8014.   ENDIF
  8015. RETURN
  8016. PROCEDURE save_instrument
  8017.   LOCAL a$
  8018.   IF flag_registered!
  8019.     IF km%=2 AND nfile_instrument$<>""
  8020.       a$=npath_div$+nfile_instrument$
  8021.     ELSE
  8022.       CLS
  8023.       GOSUB cadre_texte("SAVE INSTRUMENT",0,0,PRED(scr_ncol%))
  8024.       FILESELECT npath_div$+"*.INS",nfile_instrument$,a$
  8025.     ENDIF
  8026.     IF a$<>""
  8027.       CLS
  8028.       GOSUB cadre_texte("WAITING : SAVING INSTRUMENT "+a$+"...",0,0,PRED(scr_ncol%))
  8029.       GOSUB save_instrument2
  8030.       GOSUB separe_nom_chemin(a$)
  8031.       nfile_instrument$=nfile_$
  8032.       npath_div$=npath_$
  8033.     ENDIF
  8034.   ELSE
  8035.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  8036.   ENDIF
  8037.   GOSUB affiche_panneau_principal
  8038. RETURN
  8039. PROCEDURE save_instrument2
  8040.   ' Fournir a$ nom du module, instr% numero de l'instrument
  8041.   LOCAL a%,i%
  8042.   LOCAL b$
  8043.   erreur%=0
  8044.   warning%=0
  8045.   OPEN "o",#0,a$
  8046.   SEEK #0,0
  8047.   '
  8048.   ' Travail preparatoire
  8049.   '
  8050.   ' Cherche les samples utilises par cet instrument
  8051.   lsam$=STRING$(256,0)
  8052.   FOR i%=0 TO 127
  8053.     a%=FN isample(instr%,i%)
  8054.     IF a%<>0
  8055.       BYTE{ADD(V:lsam$,a%)}=1
  8056.     ENDIF
  8057.   NEXT i%
  8058.   '
  8059.   ' Chunk de l'instrument
  8060.   '
  8061.   BPUT #0,V:instrset%(0,instr%),instrset%(1,instr%)
  8062.   '
  8063.   ' Chunks des samples
  8064.   '
  8065.   FOR i%=1 TO 255
  8066.     IF BYTE{ADD(V:lsam$,i%)}<>0
  8067.       a%=MAX(FN adrsamchk(i%)*(-flag_registered2!),&H1563)      ! *** 2eme protection
  8068.       BPUT #0,a%,FN lonsamchk(i%)
  8069.     ENDIF
  8070.   NEXT i%
  8071.   CLOSE #0
  8072. RETURN
  8073. PROCEDURE load_instrument
  8074.   LOCAL a$
  8075.   IF km%=2 AND nfile_instrument$<>""
  8076.     a$=npath_div$+nfile_instrument$
  8077.   ELSE
  8078.     CLS
  8079.     GOSUB cadre_texte("LOAD SAMPLE",0,0,PRED(scr_ncol%))
  8080.     FILESELECT npath_div$+"*.INS",nfile_instrument$,a$
  8081.   ENDIF
  8082.   IF FN exist(a$)
  8083.     CLS
  8084.     GOSUB cadre_texte("WAITING : LOADING INSTRUMENT "+a$+"...",0,0,PRED(scr_ncol%))
  8085.     GOSUB load_instrument2
  8086.     IF erreur%=0
  8087.       GOSUB separe_nom_chemin(a$)
  8088.       nfile_instrument$=nfile_$
  8089.       npath_div$=npath_$
  8090.     ENDIF
  8091.   ENDIF
  8092.   GOSUB affiche_panneau_principal
  8093.   IF erreur%=1
  8094.     GOSUB aff_message("NOT AN INSTRUMENT.")
  8095.   ELSE IF erreur%=2
  8096.     GOSUB aff_message("NOT ENOUGH MEMORY TO LOAD THIS INSTRUMENT !")
  8097.   ELSE IF erreur%=3
  8098.     GOSUB aff_message("TOO MANY SAMPLES IN THIS INSTRUMENT")
  8099.   ENDIF
  8100. RETURN
  8101. PROCEDURE load_instrument2
  8102.   ' Nom fourni dans a$
  8103.   LOCAL a%,b%,c%,i%,j%,lchk%,nbs%,posact%,totlon%
  8104.   LOCAL chk$,sam$
  8105.   ~FRE(0)
  8106.   erreur%=0
  8107.   warning%=0
  8108.   OPEN "i",#0,a$
  8109.   totlon%=LOF(#0)
  8110.   posact%=0
  8111.   '
  8112.   ' Chargement du chunk de l'instrument
  8113.   '
  8114.   chk$=STRING$(8,0)
  8115.   SEEK #0,posact%
  8116.   BGET #0,V:chk$,8
  8117.   ADD posact%,8
  8118.   IF LEFT$(chk$,4)="INST"                       ! Verifie que c'est bien un instrument
  8119.     lchk%=LONG{ADD(V:chk$,4)}
  8120.     chk$=chk$+STRING$(SUB(lchk%,8),0)
  8121.     BGET #0,ADD(V:chk$,8),SUB(lchk%,8)
  8122.     ADD posact%,SUB(lchk%,8)
  8123.     ' Table de conversion de numero d'instrument
  8124.     sam$=STRING$(256,0)
  8125.     nbs%=0                                      ! Nombre de samples
  8126.     a%=0
  8127.     FOR i%=1 TO 127
  8128.       b%=BYTE{ADD(ADD(V:chk$,60),SHL(i%,1))}
  8129.       IF BYTE{ADD(V:sam$,b%)}=0 AND b%>0
  8130.         INC nbs%
  8131.         REPEAT
  8132.           INC a%
  8133.           EXIT IF a%>255
  8134.         UNTIL FN length(a%)=0                   ! Cherche un sample libre : longueur nulle
  8135.         IF a%<=255
  8136.           BYTE{ADD(V:sam$,b%)}=a%
  8137.         ELSE
  8138.           erreur%=3                             ! Plus de sample libre : erreur
  8139.           i%=999
  8140.         ENDIF
  8141.       ENDIF
  8142.     NEXT i%
  8143.     IF erreur%<>0
  8144.       GOTO ld_instr2_fin
  8145.     ENDIF
  8146.     CARD{ADD(V:chk$,8)}=instr%
  8147.     CARD{ADD(V:chk$,60)}=0
  8148.     FOR i%=1 TO 127                             ! Nouveaux numeros de sample
  8149.       BYTE{ADD(ADD(V:chk$,60),SHL(i%,1))}=BYTE{ADD(V:sam$,BYTE{ADD(ADD(V:chk$,60),(SHL(i%,1)))})}
  8150.     NEXT i%
  8151.     BMOVE V:chk$,V:instrset%(0,instr%),316
  8152.     '
  8153.     ' Chargement des samples
  8154.     '
  8155.     IF nbs%>0
  8156.       a%=0                                      ! Nombre de samples charges
  8157.       WHILE posact%<totlon% AND a%<nbs%
  8158.         chk$=STRING$(64,0)
  8159.         SEEK #0,posact%
  8160.         BGET #0,V:chk$,64
  8161.         ADD posact%,64
  8162.         lchk%=LONG{ADD(V:chk$,4)}               ! Longueur totale du chunk du sample
  8163.         c%=LONG{ADD(V:chk$,46)}                 ! Longueur en octets
  8164.         d%=CARD{ADD(V:chk$,8)}                  ! Ancien numero du sample
  8165.         b%=BYTE{ADD(V:sam$,d%)}                 ! Nouveau numero du sample
  8166.         IF b%<>0                                ! S'il etait bien declare dans le chunk de l'instrument
  8167.           CARD{ADD(V:chk$,8)}=b%
  8168.           GOSUB chg_taille_sample(b%,c%)        ! Change d'abord la taille
  8169.           BMOVE V:chk$,FN adrsamchk(b%),64      ! Transfert ensuite le chunk
  8170.           BGET #0,FN adresse(b%),c%             ! Puis transfert les donnees (taille indiquee dans Length)
  8171.           ADD posact%,SUB(lchk%,64)             ! Pointe sur le chunk suivant
  8172.           BYTE{ADD(V:sam$,d%)}=0                ! Indique que le sample est deja charge
  8173.           INC a%
  8174.         ELSE                                    ! Sample qui etait en trop
  8175.           ADD posact%,SUB(lchk%,64)
  8176.         ENDIF
  8177.       WEND
  8178.     ENDIF
  8179.     IF a%<nbs%
  8180.       warning%=1                                ! Tous les samples n'ont pas ete trouves
  8181.     ENDIF
  8182.     FOR i%=1 TO 255
  8183.       ~C:rr_boucle_sample%(W:i%)
  8184.     NEXT i%
  8185.   ELSE
  8186.     erreur%=1
  8187.   ENDIF
  8188. ld_instr2_fin:
  8189.   CLOSE #0
  8190. RETURN
  8191. PROCEDURE load_prefs
  8192.   LOCAL a$
  8193.   IF km%=2 AND nfile_sample$<>""
  8194.     a$=npath_prefs$+nfile_prefs$
  8195.   ELSE
  8196.     CLS
  8197.     GOSUB cadre_texte("LOAD PREFERENCES",0,0,PRED(scr_ncol%))
  8198.     FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  8199.   ENDIF
  8200.   IF a$<>""
  8201.     IF FN exist(a$)
  8202.       CLS
  8203.       GOSUB cadre_texte("WAITING : LOADING PREFERENCES "+a$+"...",0,0,PRED(scr_ncol%))
  8204.       GOSUB load_prefs2(a$,FALSE)
  8205.     ENDIF
  8206.   ENDIF
  8207.   GOSUB bee(FALSE)
  8208.   GOSUB affiche_panneau_principal
  8209. RETURN
  8210. PROCEDURE load_prefs2(fic$,first_time!) !!!
  8211.   LOCAL a%,b%,i%
  8212.   LOCAL a$,lig$,p$,p1$,p2$,dejafait_touche$
  8213.   LOCAL error!
  8214.   dejafait_touche$=STRING$(255,0)
  8215.   OPEN "i",#0,fic$
  8216.   WHILE NOT EOF(#0)
  8217.     LINE INPUT #0,lig$
  8218.     IF LEN(lig$)>2
  8219.       ' Transforme les caracteres non ASCII en espaces
  8220.       FOR i%=0 TO PRED(LEN(lig$))
  8221.         IF BYTE{ADD(V:lig$,i%)}<32
  8222.           BYTE{ADD(V:lig$,i%)}=32
  8223.         ENDIF
  8224.       NEXT i%
  8225.       lig$=TRIM$(lig$)
  8226.       a%=INSTR(lig$,"=")
  8227.       IF a%>1
  8228.         p$=UPPER$(TRIM$(LEFT$(lig$,PRED(a%))))  ! p$ contient le nom de la variable
  8229.         p1$=RIGHT$(lig$,SUB(LEN(lig$),a%))      ! p1$ contient le reste brut de la ligne
  8230.         b%=INSTR(p1$,";")
  8231.         IF b%>0
  8232.           p2$=UPPER$(TRIM$(LEFT$(p1$,PRED(b%))))        ! p2$ contient le 2eme terme sans commentaire
  8233.         ELSE
  8234.           p2$=UPPER$(TRIM$(p1$))
  8235.         ENDIF
  8236.         '
  8237.         ' Main pannel
  8238.         ' -----------
  8239.         '
  8240.         ' Touches
  8241.         '
  8242.         IF p$="KEYBOARD_TYPE"
  8243.           IF p2$="QWERTY"
  8244.             keyboard_type%=1
  8245.           ELSE
  8246.             keyboard_type%=0
  8247.           ENDIF
  8248.         ELSE IF p$="KEYBOARD_BUFFER"
  8249.           IF p2$="ON"
  8250.             flag_keyboard_buffer!=TRUE
  8251.           ELSE
  8252.             flag_keyboard_buffer!=FALSE
  8253.           ENDIF
  8254.         ELSE IF LEFT$(p$,6)="KEYDEF"
  8255.           p$=TRIM$(RIGHT$(p$,SUB(LEN(p$),6)))
  8256.           GOSUB load_prefs_analyse_touche(p$,p2$)
  8257.           '
  8258.           ' Disk
  8259.           '
  8260.         ELSE IF p$="PROGRAM_PATH"
  8261.           npath_prog$=p2$
  8262.         ELSE IF p$="MODULE_PATH"
  8263.           npath_module$=p2$
  8264.         ELSE IF p$="SAMPLE_PATH"
  8265.           npath_sample$=p2$
  8266.         ELSE IF p$="AUTOLOAD_PATH"
  8267.           npath_autoload$=p2$
  8268.         ELSE IF p$="PREF_PATH"
  8269.           npath_prefs$=p2$
  8270.         ELSE IF p$="MISC_PATH"
  8271.           npath_div$=p2$
  8272.         ELSE IF p$="MODULE_EXTENSION"
  8273.           next_module$=p2$
  8274.         ELSE IF p$="SAMPLE_EXTENSION"
  8275.           next_sample$=p2$
  8276.         ELSE IF p$="MODULE_FILE"
  8277.           IF p2$<>"/"
  8278.             nfile_module$=p2$
  8279.           ELSE
  8280.             nfile_module$=""
  8281.           ENDIF
  8282.         ELSE IF p$="SAMPLE_FILE"
  8283.           IF p2$<>"/"
  8284.             nfile_sample$=p2$
  8285.           ELSE
  8286.             nfile_sample$=""
  8287.           ENDIF
  8288.         ELSE IF p$="AUTOLOAD_FILE"
  8289.           IF p2$<>"/"
  8290.             nfile_autoload$=p2$
  8291.           ELSE
  8292.             nfile_autoload$=""
  8293.           ENDIF
  8294.         ELSE IF p$="PREF_FILE"
  8295.           IF p2$<>"/"
  8296.             nfile_prefs$=p2$
  8297.           ELSE
  8298.             nfile_prefs$=""
  8299.           ENDIF
  8300.         ELSE IF p$="SAVE_CONFIG_GT2"
  8301.           IF p2$="TRUE"
  8302.             flag_gt2cnf!=TRUE
  8303.           ELSE
  8304.             flag_gt2cnf!=FALSE
  8305.           ENDIF
  8306.         ELSE IF p$="MODULE_BACKUP"
  8307.           IF p2$="TRUE"
  8308.             flag_backup_modules!=TRUE
  8309.           ELSE
  8310.             flag_backup_modules!=FALSE
  8311.           ENDIF
  8312.           '
  8313.           ' Divers
  8314.           '
  8315.         ELSE IF p$="SYSTEM_MEMORY"
  8316.           system_memory%=MAX(VAL(p2$),16384)
  8317.         ELSE IF p$="COLOR_PAL"
  8318.           error!=FALSE
  8319.           a$=""
  8320.           FOR i%=0 TO 15
  8321.             IF LEN(p2$)<3
  8322.               error!=TRUE
  8323.             ELSE
  8324.               a$=a$+LEFT$(p2$,3)
  8325.               p2$=TRIM$(RIGHT$(p2$,SUB(LEN(p2$),3)))
  8326.             ENDIF
  8327.           NEXT i%
  8328.           IF NOT error!
  8329.             color_pal$=a$
  8330.           ENDIF
  8331.         ELSE IF p$="GRMODE_OVERSCAN"
  8332.           IF p2$="YES"
  8333.             grmode_overscan%=1
  8334.           ELSE IF p2$="NO"
  8335.             grmode_overscan%=0
  8336.           ELSE
  8337.             grmode_overscan%=-1
  8338.           ENDIF
  8339.         ELSE IF p$="GRMODE_80COL"
  8340.           IF p2$="YES"
  8341.             grmode_80colonnes%=1
  8342.           ELSE IF p2$="NO"
  8343.             grmode_80colonnes%=0
  8344.           ELSE
  8345.             grmode_80colonnes%=-1
  8346.           ENDIF
  8347.         ELSE IF p$="GRMODE_400LINES"
  8348.           IF p2$="YES"
  8349.             grmode_entrelace%=1
  8350.           ELSE IF p2$="NO"
  8351.             grmode_entrelace%=0
  8352.           ELSE
  8353.             grmode_entrelace%=-1
  8354.           ENDIF
  8355.         ELSE IF p$="GRMODE_PRESERVE"
  8356.           IF p2$="YES"
  8357.             grmode_preserve%=1
  8358.           ELSE IF p2$="NO"
  8359.             grmode_preserve%=0
  8360.           ENDIF
  8361.         ELSE IF p$="GRMODE_SKIPXBRA"
  8362.           IF p2$="YES"
  8363.             grmode_skipxbra%=1
  8364.           ELSE
  8365.             grmode_skipxbra%=0
  8366.           ENDIF
  8367.         ELSE IF p$="GTLOGO_COLOR"
  8368.           graoumf_logo_color%=VAL(p2$)
  8369.         ELSE IF p$="PATTERN_LINE_MAX"
  8370.           haut_lig%=MIN(MAX(VAL(p2$) OR 1,1),99999)
  8371.           IF NOT first_time!
  8372.             haut_lig%=MIN(DIV(SUB(scr_haut%,180),6) OR 1,haut_lig%)
  8373.           ENDIF
  8374.         ELSE IF p$="INSTRUMENT"
  8375.           instr%=MIN(MAX(VAL(p2$),1),255)
  8376.         ELSE IF p$="SAMPLE"
  8377.           sample%=MIN(MAX(VAL(p2$),1),255)
  8378.         ELSE IF p$="LINE_STEP"
  8379.           IF p2$="NEXT LINE TAKEN"
  8380.             line_step%=256
  8381.           ELSE IF p2$="NEXT NOTE"
  8382.             line_step%=257
  8383.           ELSE IF p2$="NEXT FX"
  8384.             line_step%=258
  8385.           ELSE IF p2$="NEXT VOLUME"
  8386.             line_step%=259
  8387.           ELSE
  8388.             line_step%=MIN(MAX(VAL(p2$),-64),64)
  8389.           ENDIF
  8390.         ELSE IF p$="NUMBER_OF_TRACKS"
  8391.           IF first_time!
  8392.             nbr_track%=MIN(MAX(VAL(p2$),1),32)
  8393.           ENDIF
  8394.         ELSE IF p$="PRESET"
  8395.           n_preset%=MIN(MAX(PRED(VAL(p2$)),0),31)
  8396.         ELSE IF p$="OCTAVE"
  8397.           octave%=MIN(MAX(PRED(VAL(p2$)),0),6)
  8398.         ELSE IF p$="MENU"
  8399.           IF p2$="DISK"
  8400.             ss_menu%=1
  8401.           ELSE IF p2$="TOOLS"
  8402.             ss_menu%=2
  8403.           ELSE IF p2$="INSTRUMENTS"
  8404.             ss_menu%=3
  8405.           ELSE IF p2$="SAMPLES"
  8406.             ss_menu%=4
  8407.           ELSE IF p2$="ENVELOPES"
  8408.             ss_menu%=5
  8409.           ELSE IF p2$="CONTROL"
  8410.             ss_menu%=6
  8411.           ELSE
  8412.             ss_menu%=MIN(MAX(VAL(p2$),1),5)
  8413.           ENDIF
  8414.         ELSE IF p$="NUMPAD"
  8415.           IF p2$="DRUMKIT"
  8416.             drumpad_flag%=1
  8417.           ELSE
  8418.             drumpad_flag%=0
  8419.           ENDIF
  8420.         ELSE IF p$="PATTERN_DISPLAY"
  8421.           type_affpiste%=MIN(MAX(VAL(p2$),0),2)
  8422.         ELSE IF p$="BLOCK_REPLACE"
  8423.           IF p2$="TRUE"
  8424.             replace_block%=1
  8425.           ELSE
  8426.             replace_block%=0
  8427.           ENDIF
  8428.           '
  8429.           ' Tools
  8430.           '
  8431.         ELSE IF p$="BLOCK_TYPE"
  8432.           IF p2$="PATTERN"
  8433.             trackpat%=1
  8434.           ELSE IF p2$="PRESET"
  8435.             trackpat%=2
  8436.           ELSE
  8437.             trackpat%=0
  8438.           ENDIF
  8439.         ELSE IF p$="BLOCK_SONG"
  8440.           IF p2$="TRUE"
  8441.             bl_flagsong!=TRUE
  8442.           ELSE
  8443.             bl_flagsong!=FALSE
  8444.           ENDIF
  8445.         ELSE IF p$="BLOCK_MASK"
  8446.           IF p2$="TRUE"
  8447.             maskblock%=1
  8448.           ELSE
  8449.             maskblock%=0
  8450.           ENDIF
  8451.         ELSE IF p$="BLOCK_MASK1"
  8452.           '
  8453.           '
  8454.           '
  8455.         ELSE IF p$="BLOCK_MASK2"
  8456.           '
  8457.           '
  8458.           '
  8459.         ELSE IF p$="TOOLS_ECHO_STEP"
  8460.           bl_echo_lines%=MIN(MAX(VAL(p2$),1),64)
  8461.         ELSE IF p$="TOOLS_ECHO_FDBKVAL"
  8462.           bl_echo_feedback%=MIN(MAX(VAL(p2$),0),100)
  8463.         ELSE IF p$="TOOLS_ECHO_FADESTEP"
  8464.           bl_echo_fadestep%=MIN(MAX(VAL(p2$),0),256)
  8465.         ELSE IF p$="TOOLS_ECHO_CONT"
  8466.           IF p2$="TRUE"
  8467.             bl_echo_cont!=TRUE
  8468.           ELSE
  8469.             bl_echo_cont!=FALSE
  8470.           ENDIF
  8471.         ELSE IF p$="TOOLS_ECHO_FEEDBACK"
  8472.           IF p2$="TRUE"
  8473.             bl_echo_fdbk!=TRUE
  8474.           ELSE
  8475.             bl_echo_fdbk!=FALSE
  8476.           ENDIF
  8477.         ELSE IF p$="NOTE_EXTENSION"
  8478.           '
  8479.           '
  8480.           '
  8481.           '
  8482.           ' Envelopes
  8483.           '
  8484.         ELSE IF p$="ENVELOPE"
  8485.           env_num&=MIN(MAX(VAL(p2$),1),64)
  8486.         ELSE IF p$="ENV_SECTION"
  8487.           IF p2$="KEYOFF"
  8488.             env_sect&=1
  8489.           ELSE
  8490.             env_sect&=0
  8491.           ENDIF
  8492.         ELSE IF p$="ENVELOPE_TYPE"
  8493.           IF p2$="TONE"
  8494.             ss_menue%=1
  8495.           ELSE IF p2$="PANNING"
  8496.             ss_menue%=2
  8497.           ELSE
  8498.             ss_menue%=0
  8499.           ENDIF
  8500.         ELSE IF p$="ENVELOPE_COPY"
  8501.           env_copy&=MIN(MAX(VAL(p2$),1),64)
  8502.           '
  8503.           '
  8504.           '
  8505.           '
  8506.           '
  8507.           ' Sample Editor
  8508.           ' -------------
  8509.         ELSE IF p$="KEEP_BUFFER"
  8510.           IF first_time!
  8511.             IF p2$="TRUE"
  8512.               flag_keep_buffer!=TRUE
  8513.             ELSE
  8514.               flag_keep_buffer!=FALSE
  8515.             ENDIF
  8516.           ENDIF
  8517.           '
  8518.           ' Mix
  8519.           '
  8520.         ELSE IF p$="MIX_MASTER_VOLUME"
  8521.           se.mix_master_volume%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8522.           '
  8523.           ' Record
  8524.           '
  8525.         ELSE IF p$="REC_INPUT_DEVICE"
  8526.           se.rec_input_device%=0
  8527.         ELSE IF p$="REC_CHANNEL"
  8528.           IF INSTR(p2$,"R")>0
  8529.             se.rec_canal%=2
  8530.             IF INSTR(p2$,"L")>0
  8531.               se.rec_canal%=3
  8532.             ENDIF
  8533.           ELSE
  8534.             se.rec_canal%=1
  8535.           ENDIF
  8536.         ELSE IF p$="REC_ADC_FREQUENCY"
  8537.           IF p2$="32780"
  8538.             se.rec_adc_freq%=2
  8539.           ELSE IF p2$="24585"
  8540.             se.rec_adc_freq%=3
  8541.           ELSE IF p2$="19668"
  8542.             se.rec_adc_freq%=4
  8543.           ELSE IF p2$="16390"
  8544.             se.rec_adc_freq%=5
  8545.           ELSE IF p2$="12292"
  8546.             se.rec_adc_freq%=7
  8547.           ELSE IF p2$="9834"
  8548.             se.rec_adc_freq%=9
  8549.           ELSE IF p2$="8195"
  8550.             se.rec_adc_freq%=11
  8551.           ELSE
  8552.           ENDIF
  8553.         ELSE IF p$="REC_EXT_FREQUENCY"
  8554.           se.rec_ext_freq%=MIN(MAX(VAL(p2$),2000),65000)
  8555.         ELSE IF p$="REC_TRIGGER"
  8556.           IF p2$="TRUE"
  8557.             se.rec_flag_trigger!=TRUE
  8558.           ELSE
  8559.             se.rec_flag_trigger!=FALSE
  8560.           ENDIF
  8561.         ELSE IF p$="REC_TRIGGER_LEVEL"
  8562.           se.rec_trigger%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8563.           '
  8564.           ' Frequency
  8565.           '
  8566.         ELSE IF p$="FREQ_NEW_SAMPLE_FREQ"
  8567.           se.freq_nfe%=MIN(MAX(VAL(p2$),2000),65000)
  8568.         ELSE IF p$="FREQ_OLD_NOTE_FREQ"+STR$(se.freq_ofn%)
  8569.           se.freq_ofn%=MIN(MAX(VAL(p2$),20),32500)
  8570.         ELSE IF p$="FREQ_NEW_NOTE_FREQ"+STR$(se.freq_nfn%)
  8571.           se.freq_nfn%=MIN(MAX(VAL(p2$),20),32500)
  8572.         ELSE IF p$="FREQ_INTERPOLATION"""
  8573.           IF p2$="LINEAR"
  8574.             se.freq_iptype%=1
  8575.           ELSE IF p2$="3RD DEGREE"
  8576.             se.freq_iptype%=2
  8577.           ELSE
  8578.             se.freq_iptype%=0
  8579.           ENDIF
  8580.         ELSE IF p$="FREQ_FFT_DISPLAY"
  8581.           IF p2$="LOGARITHMIC"
  8582.             se.freq_fftdisp%=1
  8583.           ELSE
  8584.             se.freq_fftdisp%=0
  8585.           ENDIF
  8586.         ELSE IF p$="FREQ_FFT_WINDOW"
  8587.           IF p2$="BLACKMAN"
  8588.             se.freq_fftwin%=1
  8589.           ELSE
  8590.             se.freq_fftwin%=0
  8591.           ENDIF
  8592.         ELSE IF p$="FREQ_FFT_NOTE_DISPLAY"
  8593.           IF p2$="FALSE"
  8594.             se.freq_fftnoteon!=FALSE
  8595.           ELSE
  8596.             se.freq_fftnoteon!=TRUE
  8597.           ENDIF
  8598.         ELSE IF p$="FREQ_FFT_NUM_OF_POINTS"
  8599.           se.freq_fft_pnbr%=MIN(MAX(VAL(p2$),1),1024)
  8600.           '
  8601.           ' Flanger
  8602.           '
  8603.         ELSE IF p$="FLANGER_DRY_LEVEL"
  8604.           se.flanger_dry%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8605.         ELSE IF p$="FLANGER_WET_LEVEL"
  8606.           se.flanger_wet%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8607.         ELSE IF p$="FLANGER_LEFT_SOURCE"
  8608.           se.flanger_lsource%=MIN(MAX(VAL(p2$),0),255)
  8609.         ELSE IF p$="FLANGER_RIGHT_SOURCE"
  8610.           se.flanger_rsource%=MIN(MAX(VAL(p2$),0),255)
  8611.         ELSE IF p$="FLANGER_DELAY"
  8612.           se.flanger_time%=MIN(MAX(VAL(p2$)*1000,0),10000)
  8613.         ELSE IF p$="FLANGER_FREQ"
  8614.           se.flanger_freq%=MIN(MAX(VAL(p2$)*1000,0),50000)
  8615.         ELSE IF p$="FLANGER_DEPTH"
  8616.           se.flanger_depth%=MIN(MAX(VAL(p2$)*1000,0),6350)
  8617.         ELSE IF p$="FLANGER_FDBK_L_L"
  8618.           se.flanger_fdbkll%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8619.         ELSE IF p$="FLANGER_FDBK_L_R"
  8620.           se.flanger_fdbklr%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8621.         ELSE IF p$="FLANGER_FDBK_R_R"
  8622.           se.flanger_fdbkrr%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8623.         ELSE IF p$="FLANGER_FDBK_R_L"
  8624.           se.flanger_fdbkrl%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8625.         ELSE IF p$="FLANGER_INIT_PHASE"
  8626.           se.flanger_phase%=DIV(VAL(p2$)*4096,360) AND 4095
  8627.         ELSE IF p$="FLANGER_WAVE_TYPE"
  8628.           IF p2$="SQUARE"
  8629.             se.flanger_wave%=1
  8630.           ELSE IF p2$="TRIANGLE"
  8631.             se.flanger_wave%=2
  8632.           ELSE IF p2$="RAMPDOWN"
  8633.             se.flanger_wave%=3
  8634.           ELSE IF p2$="RAMPUP"
  8635.             se.flanger_wave%=4
  8636.           ELSE
  8637.             se.flanger_wave%=0
  8638.           ENDIF
  8639.         ELSE IF p$="FLANGER_STEREO"
  8640.           IF p2$="TRUE"
  8641.             se.flanger_stereo!=TRUE
  8642.           ELSE
  8643.             se.flanger_stereo!=FALSE
  8644.           ENDIF
  8645.           '
  8646.           ' Delay
  8647.           '
  8648.         ELSE IF p$="DELAY_FLAGS"
  8649.           se.delay_flags%=VAL(p2$) AND &H1F
  8650.         ELSE IF p$="DELAY_FEEDBACK"
  8651.           se.delay_feedback%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8652.         ELSE IF p$="DELAY_FEEDTIME"
  8653.           se.delay_timefeed%=MIN(MAX(VAL(p2$),0),99999)
  8654.         ELSE IF p$="DELAY_DRYLEVEL"
  8655.           se.delay_dry%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8656.         ELSE IF p$="DELAY_WETLEVEL"
  8657.           se.delay_wet%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8658.         ELSE IF p$="DELAY_MUTE_IN"
  8659.           se.delay_mutein%=MIN(MAX(VAL(p2$),0),99999)
  8660.         ELSE IF p$="DELAY_SOURCE"
  8661.           se.delay_source%=MIN(MAX(VAL(p2$),0),255)
  8662.           '
  8663.           ' Reverberation
  8664.           '
  8665.         ELSE IF p$="REVERB_SOURCE"
  8666.           se.rev_source%=MIN(MAX(VAL(p2$),0),255)
  8667.         ELSE IF p$="REVERB_DRYLEVEL"
  8668.           se.rev_drylevel%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8669.         ELSE IF p$="REVERB_REVERBLEVEL"
  8670.           se.rev_revlevel%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8671.         ELSE IF p$="REVERB_EARLYREFLEVEL"
  8672.           se.rev_ereflevel%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8673.         ELSE IF p$="REVERB_NBRTAPS"
  8674.           se.rev_nbrtaps%=MIN(MAX(VAL(p2$),1),8)
  8675.         ELSE IF p$="REVERB_NBRCOMB"
  8676.           se.rev_nbrcomb%=MIN(MAX(VAL(p2$),1),16)
  8677.         ELSE IF p$="REVERB_COMBGAIN"
  8678.           se.rev_combgain%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8679.         ELSE IF p$="REVERB_APRLEVEL"
  8680.           se.rev_aprg%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8681.         ELSE IF p$="REVERB_APRDELAY"
  8682.           se.rev_aprdelay%=MIN(MAX(VAL(p2$),0),99999)
  8683.           '
  8684.           ' Song To Disk
  8685.           '
  8686.         ELSE IF p$="SONG2DISK_STARTPOS"
  8687.           se.s2d_posstart%=MAX(VAL(p2$),0)
  8688.         ELSE IF p$="SONG2DISK_STARTLINE"
  8689.           se.s2d_linestart%=MAX(VAL(p2$),0)
  8690.         ELSE IF p$="SONG2DISK_ENDPOS"
  8691.           se.s2d_posend%=MAX(VAL(p2$),0)
  8692.         ELSE IF p$="SONG2DISK_ENDLINE"
  8693.           se.s2d_lineend%=MAX(VAL(p2$),0)
  8694.         ELSE IF p$="SONG2DISK_OUTPUT"
  8695.           IF p2$="DISK"
  8696.             se.s2d_out%=2
  8697.           ELSE
  8698.             se.s2d_out%=1
  8699.           ENDIF
  8700.         ELSE IF p$="SONG2DISK_STEREO"
  8701.           IF p2$="STEREO"
  8702.             se.s2d_stereo%=2
  8703.           ELSE
  8704.             se.s2d_stereo%=1
  8705.           ENDIF
  8706.         ELSE IF p$="SONG2DISK_BITS"
  8707.           IF p2$="16"
  8708.             se.s2d_bits%=2
  8709.           ELSE
  8710.             se.s2d_bits%=1
  8711.           ENDIF
  8712.         ELSE IF p$="SONG2DISK_SPEED"
  8713.           se.s2d_lineend%=MIN(MAX(PRED(VAL(p2$)),0),7)
  8714.         ELSE IF p$="SONG2DISK_MAXLENGTH"
  8715.           se.s2d_maxsize%=MIN(MAX(VAL(p2$),1),4194304)
  8716.         ELSE IF p$="SONG2DISK_2NDTIME"
  8717.           IF p2$="TRUE"
  8718.             se.s2d_2ndtime!=TRUE
  8719.           ELSE
  8720.             se.s2d_2ndtime!=FALSE
  8721.           ENDIF
  8722.           '
  8723.           ' Compression
  8724.           '
  8725.         ELSE IF p$="COMP_SOURCE"
  8726.           se.comp_source%=MIN(MAX(VAL(p2$),0),255)
  8727.         ELSE IF p$="COMP_LEVEL"
  8728.           se.comp_level%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  8729.         ELSE IF p$="COMP_SPEED"
  8730.           se.delay_timefeed%=MIN(MAX(VAL(p2$)*1000,0),99999)
  8731.           '
  8732.           ' Other stuff /sjx.
  8733.           '
  8734.         ELSE IF p$="USER_ID"
  8735.           user%=VAL(p2$)
  8736.           '
  8737.           ' (end)
  8738.           '
  8739.         ENDIF
  8740.       ENDIF
  8741.     ENDIF
  8742.   WEND
  8743.   CLOSE #0
  8744. RETURN
  8745. PROCEDURE load_prefs_analyse_touche(f$,t$)
  8746.   LOCAL a%,am%,ae%,bm%,be%,numero_fonction%,param%
  8747.   LOCAL parametre!,groupement!,trouve!
  8748.   LOCAL a$,code$,code1$,code2$
  8749.   '
  8750.   ' Un peu de menage
  8751.   '
  8752.   WHILE INSTR(f$,"  ")>0                        ! Vide les doubles-espaces
  8753.     a%=INSTR(f$,"  ")
  8754.     f$=LEFT$(f$,a%)+RIGHT$(f$,PRED(SUB(LEN(f$),a%)))
  8755.   WEND
  8756.   '
  8757.   WHILE INSTR(t$,"+")>0                         ! Vide les "+"
  8758.     a%=INSTR(t$,"+")
  8759.     t$=LEFT$(t$,PRED(a%))+RIGHT$(t$,SUB(LEN(t$),a%))
  8760.   WEND
  8761.   WHILE INSTR(t$,"  ")>0                        ! Vide les doubles-espaces
  8762.     a%=INSTR(t$,"  ")
  8763.     LET t$=LEFT$(t$,a%)+RIGHT$(t$,PRED(SUB(LEN(t$),a%)))
  8764.   WEND
  8765.   '
  8766.   ' Affectations
  8767.   '
  8768.   RESTORE keycode_names
  8769.   numero_fonction%=0
  8770.   trouve!=FALSE
  8771.   READ code$
  8772.   WHILE code$<>"***" AND NOT trouve!
  8773.     code1$=code$
  8774.     IF LEFT$(code$,1)="*"                       ! Un parametre ?
  8775.       code$=RIGHT$(code$,PRED(LEN(code$)))
  8776.       parametre!=TRUE
  8777.     ELSE
  8778.       parametre!=FALSE
  8779.     ENDIF
  8780.     IF LEFT$(code$,1)="^"                       ! Un groupement ?
  8781.       code$=RIGHT$(code$,PRED(LEN(code$)))
  8782.       groupement!=TRUE
  8783.     ELSE
  8784.       groupement!=FALSE
  8785.     ENDIF
  8786.     IF LEFT$(f$,LEN(code$))=code$               ! C'est le bon code
  8787.       IF parametre!
  8788.         f$=RIGHT$(f$,SUB(LEN(f$),LEN(code$)))   ! Recupere le parametre
  8789.         WHILE INSTR(f$," ")>0                   ! Enleve les espaces sinon c'est galere
  8790.           a%=INSTR(f$," ")
  8791.           f$=LEFT$(f$,PRED(a%))+RIGHT$(f$,SUB(LEN(f$),a%))
  8792.         WEND
  8793.         param%=VAL(f$)                          ! Hop on l'a!
  8794.       ELSE
  8795.         param%=0
  8796.       ENDIF
  8797.       '
  8798.       code2$=code1$                             ! Cherche si l'emplacement est libre
  8799.       WHILE BYTE{ADD(V:dejafait_touche$,numero_fonction%)}<>0 AND code2$=code1$ AND code2$<>"***"
  8800.         READ code2$                             ! Sinon trouve dans la meme serie un autre emplacement
  8801.         INC numero_fonction%
  8802.       WEND
  8803.       IF code2$=code1$                          ! Si c'est bon...
  8804.         GOSUB cherche_combinaison_touches(t$,am%,ae%,bm%,be%)
  8805.         keydef_val%(0,numero_fonction%)=ae%
  8806.         keydef_val%(1,numero_fonction%)=be%
  8807.         keydef_mask%(0,numero_fonction%)=am%
  8808.         keydef_mask%(1,numero_fonction%)=bm%
  8809.         keydef_param%(numero_fonction%)=param%
  8810.         BYTE{ADD(V:dejafait_touche$,numero_fonction%)}=1
  8811.         trouve!=TRUE
  8812.       ENDIF
  8813.     ENDIF
  8814.     INC numero_fonction%
  8815.     READ code$
  8816.   WEND
  8817. RETURN
  8818. PROCEDURE save_prefs
  8819.   LOCAL a$
  8820.   IF flag_registered!
  8821.     IF km%=2 AND nfile_prefs$<>""
  8822.       a$=npath_prefs$+nfile_prefs$
  8823.     ELSE
  8824.       CLS
  8825.       GOSUB cadre_texte("SAVE PREFERENCES",0,0,PRED(scr_ncol%))
  8826.       FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  8827.     ENDIF
  8828.     IF a$<>""
  8829.       CLS
  8830.       GOSUB cadre_texte("WAITING : SAVING PREFERENCES "+a$+"...",0,0,PRED(scr_ncol%))
  8831.       GOSUB save_prefs2(a$)
  8832.       GOSUB separe_nom_chemin(a$)
  8833.       nfile_prefs$=nfile_$
  8834.       npath_prefs$=npath_$
  8835.     ENDIF
  8836.   ELSE
  8837.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  8838.   ENDIF
  8839.   GOSUB affiche_panneau_principal
  8840. RETURN
  8841. PROCEDURE save_prefs2(fic$)
  8842.   LOCAL i%,j%,n%
  8843.   LOCAL a$,b$,lig$,old$
  8844.   LOCAL param!,groupement!
  8845.   OPEN "o",#0,fic$
  8846.   PRINT #0,";*****************************************************************************"
  8847.   PRINT #0,";*                                                                           *"
  8848.   PRINT #0,";*                              GRAOUMF TRACKER                              *"
  8849.   PRINT #0,";*                        by Laurent de Soras 1994-95                        *"
  8850.   PRINT #0,";*                                                                           *"
  8851.   PRINT #0,";*                              Preference file                              *"
  8852.   PRINT #0,";*                          Last update: "+LEFT$(DATE$+"  ",10)+"                          *"
  8853.   PRINT #0,";*                                                                           *"
  8854.   PRINT #0,";*****************************************************************************"
  8855.   PRINT #0,"; Tab = 8"
  8856.   PRINT #0
  8857.   PRINT #0,"; Text following a "";"" is a comment and ignored by Graoumf Tracker."
  8858.   PRINT #0,"; In the file names, a ""/"" means no file."
  8859.   PRINT #0,"; ""$"" means the value is in hexadecimal."
  8860.   PRINT #0
  8861.   PRINT #0
  8862.   PRINT #0
  8863.   '
  8864.   '
  8865.   '
  8866.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  8867.   '
  8868.   PRINT #0,";============================================================================;"
  8869.   PRINT #0,";                       Keyboard                                             ;"
  8870.   PRINT #0,";============================================================================;"
  8871.   PRINT #0
  8872.   lig$="keyboard_type = "+FN get_elt_in_list$("azerty,qwerty",keyboard_type%)
  8873.   GOSUB write_comment("azerty or qwerty")
  8874.   lig$="keyboard_buffer = "+FN offon$(flag_keyboard_buffer!)
  8875.   GOSUB write_comment("Keep pressed keys in memory")
  8876.   PRINT #0
  8877.   PRINT #0,"; Names of available keys:"
  8878.   PRINT #0,";   a-z, esc, tab, space, return, backspace, help, undo, ins, del, clr"
  8879.   PRINT #0,";   up, down, left, right, F1-F10, <, #, &, 1, pad0, padpoint, nokey"
  8880.   PRINT #0,"; This keys are considered as groups:"
  8881.   PRINT #0,";   fkeys, numpad"
  8882.   PRINT #0,"; Following keys can be combined with others:"
  8883.   PRINT #0,";   shift (left or right), lshift, rshift, ctrl, alt, caps, nocaps"
  8884.   PRINT #0,"; You can define two combinations, separated by ""/""."
  8885.   PRINT #0
  8886.   old$=""
  8887.   RESTORE keycode_names
  8888.   FOR i%=0 TO 83
  8889.     ' Nom de la fonction
  8890.     READ a$
  8891.     FOR j%=0 TO PRED(LEN(a$))                   ! Conversion en minuscules
  8892.       a%=BYTE{ADD(V:a$,j%)}
  8893.       IF a%>=65 AND a%<91
  8894.         BYTE{ADD(V:a$,j%)}=a% OR &H20
  8895.       ENDIF
  8896.     NEXT j%
  8897.     IF a$=old$
  8898.       INC n%
  8899.     ELSE
  8900.       n%=1
  8901.     ENDIF
  8902.     old$=a$
  8903.     ' Attributs
  8904.     IF LEFT$(a$,1)="*"
  8905.       param!=TRUE
  8906.       a$=RIGHT$(a$,PRED(LEN(a$)))
  8907.     ELSE
  8908.       param!=FALSE
  8909.     ENDIF
  8910.     IF LEFT$(a$,1)="^"
  8911.       groupement!=TRUE
  8912.       a$=RIGHT$(a$,PRED(LEN(a$)))
  8913.     ELSE
  8914.       groupement!=FALSE
  8915.     ENDIF
  8916.     lig$=a$
  8917.     ' Parametre
  8918.     IF param!
  8919.       IF keydef_val%(0,i%)=0                    ! Touche non definie
  8920.         b$="n"
  8921.         IF groupement!
  8922.           b$=b$+STR$(n%)
  8923.         ENDIF
  8924.       ELSE
  8925.         b$=STR$(keydef_param%(i%))
  8926.       ENDIF
  8927.       SELECT i%
  8928.       CASE 45 TO 54                             ! Ne met pas de "+" sur les lines
  8929.         lig$=lig$+b$
  8930.       DEFAULT
  8931.         IF b$<>"0"
  8932.           lig$=lig$+" + "+b$
  8933.         ENDIF
  8934.       ENDSELECT
  8935.     ENDIF
  8936.     lig$="keydef"+CHR$(9)+lig$+STRING$(MAX(SUCC(DIV(SUB(31,LEN(lig$)),8)),1),9)  ! Tab a la 41eme colonne
  8937.     ' Nom des touches
  8938.     lig$=lig$+"= "+FN donne_combinaison_touche$(keydef_mask%(0,i%),keydef_val%(0,i%),keydef_mask%(1,i%),keydef_val%(1,i%))
  8939.     ' Groupement
  8940.     IF groupement!
  8941.       lig$=lig$+CHR$(9)+"; Group"
  8942.     ENDIF
  8943.     ' Ligne terminee
  8944.     PRINT #0,lig$
  8945.   NEXT i%
  8946.   PRINT #0
  8947.   PRINT #0
  8948.   PRINT #0
  8949.   '
  8950.   '
  8951.   '
  8952.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  8953.   '
  8954.   PRINT #0,";============================================================================;"
  8955.   PRINT #0,";                       Main pannel                                          ;"
  8956.   PRINT #0,";============================================================================;"
  8957.   PRINT #0
  8958.   lig$="system_memory = "+STR$(system_memory%)
  8959.   GOSUB write_comment("Memory for the system (bytes). Min: 16384")
  8960.   lig$="color_pal ="
  8961.   FOR i%=0 TO 15
  8962.     lig$=lig$+" "+HEX$(SHR(PEEK(ADD(&HFFFF9800,SHL(i%,2))),4),1)
  8963.     lig$=lig$+HEX$(SHR(PEEK(ADD(&HFFFF9801,SHL(i%,2))),4),1)
  8964.     lig$=lig$+HEX$(SHR(PEEK(ADD(&HFFFF9803,SHL(i%,2))),4),1)
  8965.   NEXT i%
  8966.   PRINT #0,lig$
  8967.   lig$="grmode_overscan = "+FN get_elt_in_list$("leave,no,yes",SUCC(grmode_overscan%))
  8968.   GOSUB write_comment("yes, no, leave")
  8969.   lig$="grmode_80col = "+FN get_elt_in_list$("leave,no,yes",SUCC(grmode_80colonnes%))
  8970.   GOSUB write_comment("yes, no, leave")
  8971.   lig$="grmode_400lines = "+FN get_elt_in_list$("leave,no,yes",SUCC(grmode_entrelace%))
  8972.   GOSUB write_comment("yes, no, leave")
  8973.   lig$="grmode_preserve = "+FN get_elt_in_list$("no,yes",grmode_preserve%)
  8974.   GOSUB write_comment("yes, no")
  8975.   lig$="grmode_skipxbra = "+FN get_elt_in_list$("no,yes",grmode_skipxbra%)
  8976.   GOSUB write_comment("yes, no")
  8977.   lig$=""
  8978.   PRINT #0,"gtlogo_color = "+STR$(graoumf_logo_color%)
  8979.   GOSUB write_comment("RGB for 16 colors")
  8980.   lig$="number_of_tracks = "+STR$(nbr_track%)
  8981.   GOSUB write_comment("1-32")
  8982.   lig$="instrument = "+STR$(instr%)
  8983.   GOSUB write_comment("1-255")
  8984.   lig$="sample = "+STR$(sample%)
  8985.   GOSUB write_comment("1-255")
  8986.   lig$="preset = "+STR$(n_preset%)
  8987.   GOSUB write_comment("1-32")
  8988.   lig$="line_step = "
  8989.   SELECT line_step%
  8990.   CASE -255 TO 255
  8991.     lig$=lig$+STR$(line_step%)
  8992.   CASE 256
  8993.     lig$=lig$+"next line taken"
  8994.   CASE 257
  8995.     lig$=lig$+"next note"
  8996.   CASE 258
  8997.     lig$=lig$+"next FX"
  8998.   CASE 259
  8999.     lig$=lig$+"next volume"
  9000.   ENDSELECT
  9001.   GOSUB write_comment("Jump n-1 lines when entering a note")
  9002.   lig$="octave = "+STR$(SUCC(octave%))
  9003.   GOSUB write_comment("1-7")
  9004.   lig$="pattern_display = "+STR$(type_affpiste%)
  9005.   GOSUB write_comment("0 (without effect), 1 (normal) or 2 (with")
  9006.   GOSUB write_comment("volume column)")
  9007.   a%=DIV(SUB(scr_haut%,180),6) OR 1
  9008.   IF a%=haut_lig%
  9009.     a%=99999
  9010.   ELSE
  9011.     a%=haut_lig%
  9012.   ENDIF
  9013.   lig$="pattern_line_max = "+STR$(a%)
  9014.   GOSUB write_comment("Maximum number of lines displayed on screen.")
  9015.   GOSUB write_comment("99999 (or very high #) = resolution limit.")
  9016.   lig$="numpad = "+FN get_elt_in_list$("samples,drumkit",drumpad_flag%)
  9017.   GOSUB write_comment("samples, drumkit")
  9018.   lig$="menu = "+FN get_elt_in_list$("disk,tools,instruments,samples,envelopes",PRED(ss_menu%))
  9019.   GOSUB write_comment("disk, tools, instruments, samples, envelopes, control")
  9020.   PRINT #0
  9021.   '
  9022.   '
  9023.   '
  9024.   PRINT #0,";-----------------------------------------------------------------------------"
  9025.   PRINT #0,"; Disk"
  9026.   PRINT #0,";------"
  9027.   PRINT #0
  9028.   lig$=";program_path = "+npath_prog$
  9029.   GOSUB write_comment("Path of GTPLAY.PGT and DUMTRACK.PGT. Usually")
  9030.   GOSUB write_comment("unused.")
  9031.   PRINT #0,"module_path = "+npath_module$
  9032.   PRINT #0,"sample_path = "+npath_sample$
  9033.   PRINT #0,"autoload_path = "+npath_autoload$
  9034.   PRINT #0,"pref_path = "+npath_prefs$
  9035.   PRINT #0,"misc_path = "+npath_div$
  9036.   PRINT #0
  9037.   PRINT #0,"module_ext = "+next_module$
  9038.   PRINT #0,"sample_ext = "+next_sample$
  9039.   PRINT #0
  9040.   PRINT #0,"module_file = ";
  9041.   IF nfile_module$<>""
  9042.     PRINT #0,nfile_module$
  9043.   ELSE
  9044.     PRINT #0,"/"
  9045.   ENDIF
  9046.   PRINT #0,"sample_file = ";
  9047.   IF nfile_sample$<>""
  9048.     PRINT #0,nfile_sample$
  9049.   ELSE
  9050.     PRINT #0,"/"
  9051.   ENDIF
  9052.   PRINT #0,"autoload_file = ";
  9053.   IF nfile_autoload$<>""
  9054.     PRINT #0,nfile_autoload$
  9055.   ELSE
  9056.     PRINT #0,"/"
  9057.   ENDIF
  9058.   PRINT #0,"pref_file = ";
  9059.   IF nfile_prefs$<>""
  9060.     PRINT #0,nfile_prefs$
  9061.   ELSE
  9062.     PRINT #0,"/"
  9063.   ENDIF
  9064.   PRINT #0
  9065.   PRINT #0,"save_config_gt2 = "+FN falsetrue$(flag_gt2cnf!)
  9066.   PRINT #0,"module_backup = "+FN falsetrue$(flag_backup_modules!)
  9067.   PRINT #0
  9068.   '
  9069.   '
  9070.   '
  9071.   PRINT #0,";-----------------------------------------------------------------------------"
  9072.   PRINT #0,"; Tools"
  9073.   PRINT #0,";-------"
  9074.   PRINT #0
  9075.   lig$="block_type = "+FN get_elt_in_list$("track,pattern,preset",trackpat%)
  9076.   GOSUB write_comment("track, pattern, preset")
  9077.   lig$="block_song = "+FN falsetrue$(bl_flagsong!)
  9078.   GOSUB write_comment("If it's on the whole song or just 1 pattern")
  9079.   PRINT #0,"block_replace = "+FN falsetrue$(replaceblock%)
  9080.   PRINT #0,"block_mask = "+FN falsetrue$(maskblock%)
  9081.   ' block_mask1 = ??? ?? ???? ??    ; * Not implemented *
  9082.   ' block_mask2 = ??? ?? ???? ??    ; * Not implemented *
  9083.   lig$="tools_echo_step = "+STR$(bl_echo_lines%)
  9084.   GOSUB write_comment("1-64")
  9085.   lig$="tools_echo_fdbkval = "+STR$(bl_echo_feedback%)
  9086.   GOSUB write_comment("Feedback value (0-100 per cent)")
  9087.   lig$="tools_echo_fadestep = "+STR$(bl_echo_fadestep%)
  9088.   GOSUB write_comment("0-255")
  9089.   PRINT #0,"tools_echo_cont = "+FN falsetrue$(bl_echo_cont!)
  9090.   lig$="tools_echo_feedback = "+FN falsetrue$(bl_echo_fdbk!)
  9091.   GOSUB write_comment("Feedback (logarithmic fade) or linear fade")
  9092.   PRINT #0
  9093.   ' note_extension = ???? ??    ; * Not implemented *
  9094.   PRINT #0
  9095.   '
  9096.   '
  9097.   '
  9098.   PRINT #0,";-----------------------------------------------------------------------------"
  9099.   PRINT #0,"; Envelopes"
  9100.   PRINT #0,";-----------"
  9101.   PRINT #0
  9102.   lig$="envelope = "+STR$(env_num&)
  9103.   GOSUB write_comment("1-64")
  9104.   lig$="env_section = "+FN get_elt_in_list$("attack,keyoff",env_sect&)
  9105.   GOSUB write_comment("attack, keyoff")
  9106.   lig$="envelope_type = "+FN get_elt_in_list$("volume,tone,panning",ss_menue%)
  9107.   GOSUB write_comment("volume, tone, panning")
  9108.   lig$="envelope_copy = "+STR$(env_copy&)
  9109.   GOSUB write_comment("1-64")
  9110.   PRINT #0
  9111.   '
  9112.   '
  9113.   '
  9114.   PRINT #0,";-----------------------------------------------------------------------------"
  9115.   PRINT #0,"; MIDI"
  9116.   PRINT #0,";------"
  9117.   PRINT #0
  9118.   PRINT #0,"midi_in = "+FN falsetrue$(midi_flag_data_in!)
  9119.   lig$="midi_sync = "+FN get_elt_in_list$("none,in,out",midi_flag_synchro%)
  9120.   GOSUB write_comment("none, in, out")
  9121.   ' PRINT #0,"midi_in_note_off = "+FN falsetrue$(midi_flag_note_off!)
  9122.   ' PRINT #0,"midi_in_velocity = "+FN falsetrue$(midi_flag_velocity!)
  9123.   PRINT #0,"midi_in_polyphonic = "+FN falsetrue$(midi_polyphonic_mode!)
  9124.   PRINT #0
  9125.   PRINT #0
  9126.   PRINT #0
  9127.   '
  9128.   '
  9129.   '
  9130.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9131.   '
  9132.   PRINT #0,";============================================================================;"
  9133.   PRINT #0,";                       Sample Editor                                        ;"
  9134.   PRINT #0,";============================================================================;"
  9135.   PRINT #0
  9136.   lig$="keep_buffer = "+FN falsetrue$(flag_keep_buffer!)
  9137.   GOSUB write_comment("true: keep better the buffer when loading")
  9138.   GOSUB write_comment("a module (but it's slower)")
  9139.   PRINT #0
  9140.   '
  9141.   '
  9142.   '
  9143.   PRINT #0,";-----------------------------------------------------------------------------"
  9144.   PRINT #0,"; Mix"
  9145.   PRINT #0,";-----"
  9146.   PRINT #0
  9147.   lig$="mix_master_volume = "+FN pourcent$(se.mix_master_volume%,32768)
  9148.   GOSUB write_comment("%")
  9149.   PRINT #0
  9150.   '
  9151.   '
  9152.   '
  9153.   PRINT #0,";-----------------------------------------------------------------------------"
  9154.   PRINT #0,"; Frequency"
  9155.   PRINT #0,";-----------"
  9156.   PRINT #0
  9157.   lig$="freq_new_sample_freq = "+STR$(se.freq_nfe%)
  9158.   GOSUB write_comment("Hz")
  9159.   lig$="freq_old_note_freq = "+STR$(se.freq_ofn%)
  9160.   GOSUB write_comment("Hz")
  9161.   lig$="freq_new_note_freq = "+STR$(se.freq_nfn%)
  9162.   GOSUB write_comment("Hz")
  9163.   lig$="freq_interpolation = "+FN get_elt_in_list$("none,linear,3rd degree",se.freq_iptype%)
  9164.   GOSUB write_comment("none, linear")
  9165.   lig$="freq_fft_display = "+FN get_elt_in_list$("linear,logarithmic",se.freq_fftdisp%)
  9166.   GOSUB write_comment("linear, logarithmic")
  9167.   lig$="freq_fft_window = "+FN get_elt_in_list$("rectangle,Blackman",se.freq_fftwin%)
  9168.   GOSUB write_comment("rectangle, Blackman")
  9169.   PRINT #0,"freq_fft_note_display = "+FN falsetrue$(se.freq_fftnoteon!)
  9170.   lig$="freq_fft_num_of_points = "+STR$(se.freq_fft_pnbr%)
  9171.   GOSUB write_comment("1-1024")
  9172.   PRINT #0
  9173.   '
  9174.   '
  9175.   '
  9176.   PRINT #0,";-----------------------------------------------------------------------------"
  9177.   PRINT #0,"; Flanger"
  9178.   PRINT #0,";---------"
  9179.   PRINT #0
  9180.   lig$="flanger_dry_level = "+FN pourcent$(se.flanger_dry%,32768)
  9181.   GOSUB write_comment("%")
  9182.   lig$="flanger_wet_level = "+FN pourcent$(se.flanger_wet%,32768)
  9183.   GOSUB write_comment("%")
  9184.   lig$="flanger_left_source = "
  9185.   IF se.flanger_lsource%=0
  9186.     lig$=lig$+"buffer"
  9187.   ELSE
  9188.     lig$=lig$+STR$(se.flanger_lsource%)
  9189.   ENDIF
  9190.   GOSUB write_comment("Left source: buffer or sample # (1-255)")
  9191.   lig$="flanger_right_source = "
  9192.   IF se.flanger_rsource%=0
  9193.     lig$=lig$+"buffer"
  9194.   ELSE
  9195.     lig$=lig$+STR$(se.flanger_rsource%)
  9196.   ENDIF
  9197.   GOSUB write_comment("Right source: buffer or sample # (1-255)")
  9198.   lig$="flanger_delay = "+STR$(se.flanger_time%/1000)
  9199.   GOSUB write_comment("Flanger delay (ms). Maximum: 10 ms")
  9200.   lig$="flanger_freq = "+STR$(se.flanger_freq%/1000)
  9201.   GOSUB write_comment("Flanger LFO frequency (Hz). Maximum: 50 Hz")
  9202.   lig$="flanger_depth = "+STR$(se.flanger_depth%/1000)
  9203.   GOSUB write_comment("Flanger depth (ms). Maximum: 6.35 ms")
  9204.   lig$="flanger_fdbk_l_l = "+FN pourcent$(se.flanger_fdbkll%,32768)
  9205.   GOSUB write_comment("Feedback Left -> Left (%)")
  9206.   lig$="flanger_fdbk_l_r = "+FN pourcent$(se.flanger_fdbklr%,32768)
  9207.   GOSUB write_comment("Feedback Left -> Right (%)")
  9208.   lig$="flanger_fdbk_r_r = "+FN pourcent$(se.flanger_fdbkrr%,32768)
  9209.   GOSUB write_comment("Feedback Right -> Right (%)")
  9210.   lig$="flanger_fdbk_r_l = "+FN pourcent$(se.flanger_fdbkrl%,32768)
  9211.   GOSUB write_comment("Feedback Right -> Left (%)")
  9212.   lig$="flanger_init_phase = "+STR$(MUL(se.flanger_phase%,360)/4096)
  9213.   GOSUB write_comment("Initial phase (0-359°)")
  9214.   lig$="flanger_wave_type = "+FN get_elt_in_list$("sin,square,triangle,rampdown,rampup",se.flanger_wave%)
  9215.   GOSUB write_comment("sin, square, triangle, rampdown or rampup")
  9216.   lig$="flanger_stereo = "+FN falsetrue$(se.flanger_stereo!)
  9217.   GOSUB write_comment("false = mono, true = stereo")
  9218.   PRINT #0
  9219.   '
  9220.   '
  9221.   '
  9222.   PRINT #0,";-----------------------------------------------------------------------------"
  9223.   PRINT #0,"; Delay"
  9224.   PRINT #0,";-------"
  9225.   PRINT #0
  9226.   lig$="delay_flags = "+STR$(se.delay_flags%)
  9227.   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")
  9228.   lig$="delay_feedback = "+FN pourcent$(se.delay_feedback%,32768)
  9229.   GOSUB write_comment("%")
  9230.   lig$="delay_feedtime = "+STR$(se.delay_timefeed%)
  9231.   GOSUB write_comment("(ms)")
  9232.   lig$="delay_drylevel = "+FN pourcent$(se.delay_dry%,32768)
  9233.   GOSUB write_comment("%")
  9234.   lig$="delay_wetlevel = "+FN pourcent$(se.delay_wet%,32768)
  9235.   GOSUB write_comment("%")
  9236.   lig$="delay_mute_in = "+STR$(se.delay_mutein%)
  9237.   GOSUB write_comment("(ms)")
  9238.   lig$="delay_source = "
  9239.   IF se.delay_source%=0
  9240.     lig$=lig$+"buffer"
  9241.   ELSE
  9242.     lig$=lig$+STR$(se.delay_source%)
  9243.   ENDIF
  9244.   GOSUB write_comment("Source: buffer or sample # (1-255)")
  9245.   PRINT #0
  9246.   '
  9247.   '
  9248.   '
  9249.   PRINT #0,";-----------------------------------------------------------------------------"
  9250.   PRINT #0,"; Reverberation"
  9251.   PRINT #0,";---------------"
  9252.   PRINT #0
  9253.   lig$="reverb_source = "
  9254.   IF se.rev_source%=0
  9255.     lig$=lig$+"buffer"
  9256.   ELSE
  9257.     lig$=lig$+STR$(se.rev_source%)
  9258.   ENDIF
  9259.   GOSUB write_comment("Source: buffer or sample # (1-255)")
  9260.   lig$="reverb_drylevel = "+FN pourcent$(se.rev_drylevel%,32768)
  9261.   GOSUB write_comment("%")
  9262.   lig$="reverb_reverblevel = "+FN pourcent$(se.rev_revlevel%,32768)
  9263.   GOSUB write_comment("%")
  9264.   lig$="reverb_earlyreflevel = "+FN pourcent$(se.rev_ereflevel%,32768)
  9265.   GOSUB write_comment("Early reflection level (%)")
  9266.   lig$="reverb_nbrtaps = "+STR$(se.rev_nbrtaps%)
  9267.   GOSUB write_comment("Nbr of taps for early reflection (1-16)")
  9268.   lig$="reverb_nbrcomb = "+STR$(se.rev_nbrcomb%)
  9269.   GOSUB write_comment("Nbr of comb filters (1-8)")
  9270.   lig$="reverb_combgain = "+FN pourcent$(se.rev_combgain%,32768)
  9271.   GOSUB write_comment("%")
  9272.   lig$="reverb_aprlevel = "+FN pourcent$(se.rev_aprg%,32768)
  9273.   GOSUB write_comment("All Pass Reverb level (%)")
  9274.   lig$="reverb_aprdelay = "+STR$(se.rev_aprdelay%)
  9275.   GOSUB write_comment("All Pass Reverb delay (ms)")
  9276.   PRINT #0
  9277.   '
  9278.   '
  9279.   '
  9280.   PRINT #0,";-----------------------------------------------------------------------------"
  9281.   PRINT #0,"; Song To Disk"
  9282.   PRINT #0,";--------------"
  9283.   PRINT #0
  9284.   lig$="song2disk_startpos = $"+HEX$(se.s2d_posstart%)
  9285.   GOSUB write_comment("Start position")
  9286.   lig$="song2disk_startline = $"+HEX$(se.s2d_ligstart%)
  9287.   GOSUB write_comment("Start line")
  9288.   lig$="song2disk_endpos = $"+HEX$(se.s2d_posend%)
  9289.   GOSUB write_comment("End position")
  9290.   lig$="song2disk_endline = $"+HEX$(se.s2d_ligend%)
  9291.   GOSUB write_comment("End line")
  9292.   lig$="song2disk_output = "+FN get_elt_in_list$("block,disk",PRED(se.s2d_out%))
  9293.   GOSUB write_comment("block, disk")
  9294.   lig$="song2disk_stereo = "+FN get_elt_in_list$("mono,stereo",PRED(se.s2d_stereo%))
  9295.   GOSUB write_comment("mono, stereo")
  9296.   lig$="song2disk_bits = "+STR$(MUL(se.s2d_bits%,8))
  9297.   GOSUB write_comment("Resolution (8 or 16 bits)")
  9298.   lig$="song2disk_speed = "+STR$(SUCC(se.s2d_speed%))
  9299.   GOSUB write_comment("Speed (1 = fast, 8 = low)")
  9300.   lig$="song2disk_maxlength = "+STR$(se.s2d_maxsize%)
  9301.   GOSUB write_comment("Kb")
  9302.   ' PRINT #0,"song2disk_2ndtime = "+fn falsetrue$(se.s2d_2ndtime!)
  9303.   PRINT #0
  9304.   '
  9305.   '
  9306.   '
  9307.   PRINT #0,";-----------------------------------------------------------------------------"
  9308.   PRINT #0,"; Compression"
  9309.   PRINT #0,";-------------"
  9310.   PRINT #0
  9311.   lig$="comp_source = "
  9312.   IF se.comp_source%=0
  9313.     lig$=lig$+"buffer"
  9314.   ELSE
  9315.     lig$=lig$+STR$(se.comp_source%)
  9316.   ENDIF
  9317.   GOSUB write_comment("Source: buffer or sample # (1-255)")
  9318.   lig$="comp_level = "+FN pourcent$(se.comp_level%,32768)
  9319.   GOSUB write_comment("%")
  9320.   lig$="comp_speed = "+STR$(se.comp_speed%/1000)
  9321.   GOSUB write_comment("(ms)")
  9322.   PRINT #0
  9323.   PRINT #0
  9324.   PRINT #0
  9325.   '
  9326.   '
  9327.   '
  9328.   ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9329.   '
  9330.   PRINT #0,";-----------------------------------------------------------------------------"
  9331.   PRINT #0,"; End of file"
  9332.   CLOSE #0
  9333. RETURN
  9334. PROCEDURE write_comment(a$)
  9335.   ' Ecrit sur le fichier #0 un commentaire au bout de la variable lig$
  9336.   ' Utilise et modifie lig$
  9337.   ' Tab a la 33eme colonne
  9338.   lig$=lig$+STRING$(MAX(SUCC(DIV(SUB(31,LEN(lig$)),8)),1),9)
  9339.   lig$=lig$+"; "+a$
  9340.   PRINT #0,lig$
  9341.   lig$=""
  9342. RETURN
  9343. PROCEDURE autoload
  9344.   ' Autochargement de modules/samples
  9345.   ' Module
  9346.   LOCAL i%,sample%,erreur%
  9347.   LOCAL cat$,a$,baze$,masque_fichier$,dta$
  9348.   ~FRE(0)
  9349.   SHOWM
  9350.   GOSUB bee(TRUE)
  9351.   flag_autoload!=TRUE
  9352.   dta$=STRING$(44,0)
  9353.   masque_fichier$=npath_autoload$+next_module$+CHR$(0)
  9354.   ~FRE(0)
  9355.   ~GEMDOS(&H1A,L:V:dta$)
  9356.   IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  9357.     baze$=""
  9358.     i%=ADD(V:dta$,30)
  9359.     WHILE PEEK(i%)<>0
  9360.       baze$=baze$+CHR$(PEEK(i%))
  9361.       INC i%
  9362.     WEND
  9363.     a$=npath_autoload$+baze$
  9364.     GOSUB aff_message("WAITING : AUTOLOADING MODULE "+a$)
  9365.     GOSUB load_module2
  9366.     IF play%=1
  9367.       GOSUB play_song(TRUE)
  9368.     ELSE IF play%=2
  9369.       GOSUB play_pattern(TRUE)
  9370.     ELSE
  9371.       GOSUB stop_voices
  9372.     ENDIF
  9373.     IF erreur%>0
  9374.       GOSUB separe_nom_chemin(a$)
  9375.       npath_module$=npath_$
  9376.       nfile_module$=nfile_$
  9377.     ENDIF
  9378.     IF ss_menu%=1
  9379.       GOSUB affiche_icones_diskb
  9380.     ENDIF
  9381.     GOSUB affiche_info_song
  9382.     GOSUB affiche_info_sample
  9383.     GOSUB affiche_info_preset
  9384.     GOSUB affiche_c_pattern
  9385.   ENDIF
  9386.   ' Samples
  9387.   masque_fichier$=npath_autoload$+next_sample$+CHR$(0)
  9388.   ~GEMDOS(&H1A,L:V:dta$)
  9389.   IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  9390.     cat$=""
  9391.     REPEAT
  9392.       baze$=""
  9393.       i%=ADD(V:dta$,30)
  9394.       WHILE PEEK(i%)<>0
  9395.         baze$=baze$+CHR$(PEEK(i%))
  9396.         INC i%
  9397.       WEND
  9398.       cat$=cat$+baze$+CHR$(0)
  9399.     UNTIL LEN(cat$)>32000 OR GEMDOS(&H4F)<0
  9400.     sample%=1
  9401.     REPEAT
  9402.       IF FN length(sample%)=0     ! Trouve une place pour charger
  9403.         i%=INSTR(cat$,CHR$(0))
  9404.         baze$=LEFT$(cat$,PRED(i%))
  9405.         a$=npath_autoload$+baze$
  9406.         cat$=RIGHT$(cat$,SUB(LEN(cat$),i%))
  9407.         GOSUB aff_message("WAITING : AUTOLOADING SAMPLE "+a$)
  9408.         GOSUB load_sample2(FALSE)
  9409.         IF erreur%=1
  9410.           GOSUB aff_message("NOT ENOUGH MEMORY TO LOAD THIS SAMPLE !")
  9411.           IF FN length(sample%)<>0
  9412.             GOSUB affiche_info_sample
  9413.             INC sample%
  9414.           ENDIF
  9415.         ENDIF
  9416.       ELSE
  9417.         GOSUB affiche_info_sample
  9418.         INC sample%
  9419.       ENDIF
  9420.     UNTIL sample%=256 OR LEN(cat$)=0
  9421.     sample%=1
  9422.     GOSUB affiche_info_sample
  9423.   ENDIF
  9424. fin_autoload:
  9425.   flag_autoload!=FALSE
  9426.   GOSUB bee(FALSE)
  9427.   SHOWM
  9428. RETURN
  9429. PROCEDURE make_directory
  9430.   LOCAL a$,bouton%
  9431.   CLS
  9432.   GOSUB cadre_texte("MAKE NEW DIRECTORY",0,0,PRED(scr_ncol%))
  9433.   FILESELECT npath_div$+"*.*","",a$
  9434.   IF a$<>""
  9435.     CLS
  9436.     GOSUB separe_nom_chemin(a$)
  9437.     IF nfile_$<>""
  9438.       GOSUB dialog("DISK","Do you really want|to create a new directory|"+a$+"\|ON DISK ?","YES|CANCEL",MOUSEX,MOUSEY)
  9439.       IF bouton%=0
  9440.         CLS
  9441.         GOSUB cadre_texte("CREATING DIRECTORY "+a$+"\...",0,0,PRED(scr_ncol%))
  9442.         MKDIR a$
  9443.         npath_div$=a$+"\"
  9444.       ENDIF
  9445.     ENDIF
  9446.   ENDIF
  9447.   GOSUB affiche_panneau_principal
  9448. RETURN
  9449. PROCEDURE delete_directory
  9450.   LOCAL bouton%,e%
  9451.   LOCAL a$,b$
  9452.   CLS
  9453.   GOSUB cadre_texte("DELETE DIRECTORY",0,0,PRED(scr_ncol%))
  9454.   FILESELECT npath_div$+"*.*","",a$
  9455.   IF a$<>""
  9456.     CLS
  9457.     GOSUB separe_nom_chemin(a$)
  9458.     IF FN exist(npath_$+"*.*")
  9459.       GOSUB dialog("STOP","Directory|"+npath_$+"|must be empty","Cancel",MOUSEX,MOUSEY)
  9460.     ELSE
  9461.       GOSUB dialog("DISK","Do you really want|to delete directory|"+npath_$+"|on disk ?","Ok|Cancel",MOUSEX,MOUSEY)
  9462.       IF bouton%=0
  9463.         CLS
  9464.         GOSUB cadre_texte("DELETING DIRECTORY "+npath_$+"...",0,0,PRED(scr_ncol%))
  9465.         a$=LEFT$(npath_$,PRED(LEN(npath_$)))
  9466.         b$=a$+CHR$(0)
  9467.         e%=GEMDOS(58,L:V:b$)
  9468.         IF e%<0
  9469.           GOSUB dialog("FILE","Error "+STR$(e%)+"during deleting directory|"+a$+"\","Cancel",MOUSEX,MOUSEY)
  9470.         ENDIF
  9471.         GOSUB separe_nom_chemin(a$)
  9472.         npath_div$=npath_$
  9473.       ENDIF
  9474.     ENDIF
  9475.   ENDIF
  9476.   GOSUB affiche_panneau_principal
  9477. RETURN
  9478. PROCEDURE delete_file
  9479.   LOCAL bouton%,e%
  9480.   LOCAL b$
  9481.   CLS
  9482.   GOSUB cadre_texte("DELETE FILE",0,0,PRED(scr_ncol%))
  9483.   FILESELECT npath_div$+"*.*","",a$
  9484.   IF a$<>""
  9485.     IF FN exist(a$)
  9486.       CLS
  9487.       GOSUB dialog("FILE","Do you really|want to delete|"+a$+"|on disk ?","Ok|Cancel",MOUSEX,MOUSEY)
  9488.       IF bouton%=0
  9489.         CLS
  9490.         GOSUB cadre_texte("DELETING FILE "+a$+"...",0,0,PRED(scr_ncol%))
  9491.         b$=a$+CHR$(0)
  9492.         e%=GEMDOS(65,L:V:a$)
  9493.         IF e%<0
  9494.           GOSUB dialog("FILE","Error "+STR$(e%)+" during deleting|file "+a$,"Cancel",MOUSEX,MOUSEY)
  9495.         ENDIF
  9496.         GOSUB separe_nom_chemin(a$)
  9497.         npath_div$=npath_$
  9498.       ENDIF
  9499.     ELSE
  9500.       GOSUB dialog("FILE","File not found:|"+a$,"Cancel",MOUSEX,MOUSEY)
  9501.     ENDIF
  9502.   ENDIF
  9503.   GOSUB affiche_panneau_principal
  9504. RETURN
  9505. PROCEDURE format_disk                   !!!
  9506. RETURN
  9507. PROCEDURE rename_file
  9508.   LOCAL e%
  9509.   LOCAL a$,b$,c$,d$,e$,f$
  9510.   ~FRE(0)
  9511.   CLS
  9512.   GOSUB cadre_texte("RENAME A FILE",0,0,PRED(scr_ncol%))
  9513.   FILESELECT npath_div$+"*.*","",a$
  9514.   IF a$<>""
  9515.     IF FN exist(a$)
  9516.       CLS
  9517.       GOSUB cadre_texte("SELECT NEW NAME OF "+a$,0,0,PRED(scr_ncol%))
  9518.       GOSUB separe_nom_chemin(a$)
  9519.       npath_div$=npath_$
  9520.       c$=nfile_$
  9521.       FILESELECT npath_div$+"*.*",c$,b$
  9522.       GOSUB separe_nom_chemin(b$)
  9523.       d$=nfile_$
  9524.       IF d$<>"" AND d$<>c$ AND npath_$=npath_div$
  9525.         CLS
  9526.         GOSUB cadre_texte("RENAMING "+a$+" AS "+d$+"...",0,0,PRED(scr_ncol%))
  9527.         f$=a$+CHR$(0)
  9528.         e$=b$+CHR$(0)
  9529.         e%=GEMDOS(86,0,L:V:f$,L:V:e$)
  9530.         IF e%<0
  9531.           GOSUB dialog("FILE","Error "+STR$(e%)+" during renaming.","Ok",MOUSEX,MOUSEY)
  9532.         ENDIF
  9533.       ELSE IF npath_$<>npath_div$
  9534.         GOSUB dialog("RENAME","Old and new file|must be in the|same path!","Cancel",MOUSEX,MOUSEY)
  9535.       ENDIF
  9536.     ELSE
  9537.       GOSUB dialog("FILE","File not found:|"+a$,"Cancel",MOUSEX,MOUSEY)
  9538.     ENDIF
  9539.   ENDIF
  9540.   GOSUB affiche_panneau_principal
  9541. RETURN
  9542. PROCEDURE separe_nom_chemin(aaaa$)
  9543.   ' Chercher le nom et le chemin
  9544.   ' Renvoie npath_$ et nfile_$
  9545.   LOCAL iiii%,flag%
  9546.   nfile_$=""
  9547.   npath_$=""
  9548.   flag%=0
  9549.   FOR iiii%=LEN(aaaa$) DOWNTO 1
  9550.     IF MID$(aaaa$,iiii%,1)="\" AND flag%=0
  9551.       flag%=1
  9552.       npath_$=LEFT$(aaaa$,iiii%)
  9553.     ELSE IF flag%=0
  9554.       nfile_$=MID$(aaaa$,iiii%,1)+nfile_$
  9555.     ENDIF
  9556.   NEXT iiii%
  9557. RETURN
  9558. PROCEDURE selpath_module
  9559.   LOCAL a$
  9560.   CLS
  9561.   GOSUB cadre_texte("SELECT PATH FOR MODULE",0,0,PRED(scr_ncol%))
  9562.   FILESELECT npath_module$+next_module$,nfile_module$,a$
  9563.   IF a$<>""
  9564.     GOSUB separe_nom_chemin(a$)
  9565.     nfile_module$=nfile_$
  9566.     npath_module$=npath_$
  9567.   ENDIF
  9568.   GOSUB affiche_panneau_principal
  9569. RETURN
  9570. PROCEDURE selpath_sample
  9571.   LOCAL a$
  9572.   CLS
  9573.   GOSUB cadre_texte("SELECT PATH FOR SAMPLE",0,0,PRED(scr_ncol%))
  9574.   FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  9575.   IF a$<>""
  9576.     GOSUB separe_nom_chemin(a$)
  9577.     nfile_sample$=nfile_$
  9578.     npath_sample$=npath_$
  9579.   ENDIF
  9580.   GOSUB affiche_panneau_principal
  9581. RETURN
  9582. PROCEDURE selpath_prefs
  9583.   LOCAL a$
  9584.   CLS
  9585.   GOSUB cadre_texte("SELECT PATH FOR PREFERENCE FILE",0,0,PRED(scr_ncol%))
  9586.   FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  9587.   IF a$<>""
  9588.     GOSUB separe_nom_chemin(a$)
  9589.     nfile_prefs$=nfile_$
  9590.     npath_prefs$=npath_$
  9591.   ENDIF
  9592.   GOSUB affiche_panneau_principal
  9593. RETURN
  9594. PROCEDURE selpath_autoload
  9595.   LOCAL a$
  9596.   CLS
  9597.   GOSUB cadre_texte("SELECT PATH FOR AUTOLOAD",0,0,PRED(scr_ncol%))
  9598.   FILESELECT npath_autoload$+next_module$,nfile_autoload$,a$
  9599.   IF a$<>""
  9600.     GOSUB separe_nom_chemin(a$)
  9601.     nfile_autoload$=nfile_$
  9602.     npath_autoload$=npath_$
  9603.   ENDIF
  9604.   GOSUB affiche_panneau_principal
  9605. RETURN
  9606. '
  9607. ' Gestion du clavier
  9608. ' ------------------
  9609. PROCEDURE gestion_clavier
  9610.   '
  9611.   ' Recupere le code clavier
  9612.   '
  9613.   IF GEMDOS(11)<>0                              ! une touche ?
  9614.     KEYGET clavier%
  9615.     GOSUB vide_buffer_clavier
  9616.     clavier%=clavier% AND &H1FFF00FF
  9617.   ELSE
  9618.     clavier%=SHL(BIOS(11,-1) AND &H1F,24)       ! Kbshift
  9619.   ENDIF
  9620.   IF clavier%>0
  9621.     '
  9622.     ' Trafique le code clavier et identifie la fonction
  9623.     '
  9624.     a%=FN key_trafique_code_clavier(clavier%)
  9625.     clavier%=LONG{a%}
  9626.     numero_touche%=CARD{ADD(a%,4)}
  9627.     IF INT{ADD(a%,6)}<>-1
  9628.       fonction_trouvee!=TRUE
  9629.       numero_fonction%=CARD{ADD(a%,6)}
  9630.     ELSE
  9631.       fonction_trouvee!=FALSE
  9632.     ENDIF
  9633.     asciicode%=clavier% AND 255                 ! Remise a jour apres les modifs
  9634.     scancode%=SHR(clavier%,16) AND 255          ! Idem
  9635.     '
  9636.     ' Sauts aux sous-routines
  9637.     '
  9638.     IF fonction_trouvee!
  9639.       SELECT numero_fonction%
  9640.       CASE 0 TO 7
  9641.         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
  9642.       CASE 8 TO 15
  9643.         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
  9644.       CASE 16 TO 23
  9645.         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
  9646.       CASE 24 TO 31
  9647.         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
  9648.       CASE 32 TO 39
  9649.         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
  9650.       CASE 40 TO 47
  9651.         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
  9652.       CASE 48 TO 51
  9653.         ON SUB(numero_fonction%,47) GOSUB key_copy_block_preset,key_copy_block_track_cursor,key_insert_line_pattern,key_insert_line_track
  9654.       CASE 52 TO 55
  9655.         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
  9656.       CASE 56 TO 63
  9657.         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
  9658.       CASE 64 TO 71
  9659.         ON SUB(numero_fonction%,63) GOSUB key_line,key_line,key_line,key_line,key_line,key_line,key_line,key_line
  9660.       CASE 72 TO 79
  9661.         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
  9662.       CASE 80 TO 87
  9663.         ON SUB(numero_fonction%,79) GOSUB key_track_onoff,key_track_onoff,key_rec_track_onoff,key_rec_track_onoff,rien,rien,rien,rien
  9664.       ENDSELECT
  9665.     ELSE
  9666.       '
  9667.       ' Si aucune fonction speciale trouvee, c'est peut-etre une note
  9668.       '
  9669.       GOSUB teste_touches_notes
  9670.     ENDIF
  9671.   ENDIF
  9672. RETURN
  9673. FUNCTION key_trafique_code_clavier(clavier%)
  9674.   ' Trafique le code du clavier et trouve la bonne fonction
  9675.   LOCAL a%,b%,c%,d%,e%,f%
  9676.   a%=ADD(SHL(play%,16),edit%)
  9677.   b%=V:keydef_mask%(0,0)
  9678.   c%=V:keydef_val%(0,0)
  9679.   d%=V:scancode2ascii$(0,keyboard_type%)
  9680.   e%=V:scancode2ascii$(1,keyboard_type%)
  9681.   f%=V:scancode2ascii$(2,keyboard_type%)
  9682.   a%=C:g_find_key_function%(L:clavier%,L:a%,W:84,L:b%,L:c%,L:d%,L:e%,L:f%)
  9683.   RETURN a%
  9684. ENDFUNC
  9685. PROCEDURE teste_touches_notes
  9686.   IF edit%=1
  9687.     '
  9688.     ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9689.     '
  9690.     ' Touches en mode Edit
  9691.     ' --------------------
  9692.     IF scancode%<54 AND curs_x%=0               ! Frappe d'une note en mode d'edition
  9693.       a%=t_note%(scancode%)
  9694.       IF a%<>-1 AND ADD(a%,MUL(octave%,12))<104
  9695.         ADD a%,ADD(MUL(octave%,12),24)          ! Ajuste a la bonne note
  9696.         FOR i%=0 TO PRED(nbr_track%)
  9697.           b%=LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}
  9698.           d%=BYTE{FN adr_strk(songpos%,posligne%,i%)}
  9699.           IF i%=preset&(curs_col%,n_preset%)
  9700.             c%=ADD(SHL(instr%,24),ADD(b% AND ext_note1%,ext_note2%))
  9701.             IF play%=0
  9702.               BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=a%
  9703.               LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=c%
  9704.             ENDIF
  9705.             BYTE{FN adr_strk(songpos%,posligne%,i%)}=a%
  9706.             LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}=c%
  9707.           ELSE IF play%=0
  9708.             BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=d%
  9709.             LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=b%
  9710.           ENDIF
  9711.         NEXT i%
  9712.         IF BTST(clavier%,8)
  9713.           curs_x%=2
  9714.           GOSUB curseur_a_droite                ! + Shift : va sur le premier chiffre de l'effet
  9715.         ELSE
  9716.           GOSUB next_line
  9717.         ENDIF
  9718.         IF play%=0
  9719.           GOSUB play_pattern_bidon
  9720.         ENDIF
  9721.       ENDIF
  9722.     ELSE IF scancode%>1 AND scancode%<12 AND curs_x%>0
  9723.       ' Touches 0 - 9
  9724.       a%=PRED(scancode%) MOD 10
  9725.       b%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  9726.       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)))
  9727.       BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  9728.       GOSUB play_pattern_bidon
  9729.       IF BTST(clavier%,8)
  9730.         GOSUB curseur_a_droite                  ! + Shift : Chiffre suivant
  9731.       ELSE
  9732.         GOSUB next_line
  9733.       ENDIF
  9734.     ELSE IF ((asciicode%>64 AND asciicode%<71) OR (asciicode%>96 AND asciicode%<103)) AND curs_x%>0
  9735.       ' Touches A - F
  9736.       a%=SUB(asciicode% AND &HDF,55)
  9737.       b%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  9738.       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)))
  9739.       BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  9740.       GOSUB play_pattern_bidon
  9741.       IF BTST(clavier%,8)
  9742.         GOSUB curseur_a_droite                  ! + Shift : Chiffre suivant
  9743.       ELSE
  9744.         GOSUB next_line
  9745.       ENDIF
  9746.     ENDIF
  9747.   ELSE
  9748.     '
  9749.     ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9750.     '
  9751.     ' Touches en mode Stop
  9752.     ' --------------------
  9753.     IF scancode%<54 AND edit%=0 AND play%=0     ! Frappe d'une note en mode Stop
  9754.       a%=t_note%(scancode%)
  9755.       IF a%<>-1 AND ADD(a%,MUL(octave%,12))<104
  9756.         ADD a%,ADD(MUL(octave%,12),24)          ! Ajuste a la bonne note
  9757.         FOR i%=0 TO PRED(nbr_track%)
  9758.           IF i%=preset&(curs_col%,n_preset%)
  9759.             BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=a%
  9760.             LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=ADD(SHL(instr%,24),ext_note2%)
  9761.           ELSE
  9762.             BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=0
  9763.             LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=0
  9764.           ENDIF
  9765.         NEXT i%
  9766.         GOSUB play_pattern_bidon
  9767.       ENDIF
  9768.     ENDIF
  9769.     '
  9770.     ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  9771.     '
  9772.     ' Touches en mode Play sans Edit
  9773.     ' ------------------------------
  9774.     IF play%<>0 AND edit%=0
  9775.       IF scancode%<54                           ! Frappe d'une note en mode play
  9776.         a%=t_note%(scancode%)
  9777.         IF a%<>-1 AND ADD(a%,MUL(octave%,12))<104
  9778.           ADD a%,ADD(MUL(octave%,12),24)        ! Ajuste a la bonne note
  9779.           i%=preset&(curs_col%,n_preset%)
  9780.           b%=LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}
  9781.           c%=ADD(SHL(instr%,24),ADD(b% AND ext_note1%,ext_note2%))
  9782.           a$=CHR$(a%)+MKL$(c%)
  9783.           ~C:rr_play_one_note%(L:V:a$,W:i%)
  9784.         ENDIF
  9785.       ENDIF
  9786.     ENDIF
  9787.   ENDIF
  9788. RETURN
  9789. PROCEDURE vide_buffer_clavier
  9790.   IF NOT flag_keyboard_buffer!
  9791.     WHILE GEMDOS(11)<>0
  9792.       ~GEMDOS(7)
  9793.     WEND
  9794.   ENDIF
  9795. RETURN
  9796. ' Touches valables tout le temps
  9797. PROCEDURE key_next_octave
  9798.   octave%=SUCC(octave%) MOD 7
  9799.   GOSUB affiche_barre_info
  9800. RETURN
  9801. PROCEDURE key_prev_octave
  9802.   DEC octave%
  9803.   WHILE octave%<0
  9804.     ADD octave%,7
  9805.   WEND
  9806.   GOSUB affiche_barre_info
  9807. RETURN
  9808. PROCEDURE key_next_column
  9809.   INC curs_col%
  9810.   IF curs_col%>PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  9811.     curs_col%=0
  9812.   ENDIF
  9813.   GOSUB affiche_c_pattern
  9814. RETURN
  9815. PROCEDURE key_prev_column
  9816.   DEC curs_col%
  9817.   IF curs_col%<0
  9818.     curs_col%=PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  9819.   ENDIF
  9820.   GOSUB affiche_c_pattern
  9821. RETURN
  9822. PROCEDURE key_cpu_time
  9823.   DPOKE r_flag_mt_display%,DPEEK(r_flag_mt_display%) XOR 1
  9824.   IF DPEEK(r_flag_mt_display%)=0            ! Attend la fin de la VBL pour remettre le noir
  9825.     PAUSE 1
  9826.     SLPOKE &HFFFF9800,&H0
  9827.     GOSUB aff_message("CPU time not displayed.")
  9828.   ELSE
  9829.     GOSUB aff_message("CPU time displayed.")
  9830.   ENDIF
  9831. RETURN
  9832. PROCEDURE key_expand
  9833.   GOSUB chg_type_affpiste(SUCC(type_affpiste%) MOD 3)
  9834.   curs_x%=0
  9835.   curs_col%=MIN(curs_col%,PRED(nbr_col%))
  9836.   CARD{ADD(V:para_affiche_pattern$,72)}=type_affpiste%
  9837.   GOSUB cadre_ext(1,160,SUB(scr_ncol%,3),SUB(scr_haut%,164),9,9,9,9)
  9838.   GOSUB affiche_cadre_voies
  9839.   GOSUB affiche_info_preset
  9840.   GOSUB affiche_c_pattern
  9841. RETURN
  9842. PROCEDURE key_replay_freq
  9843.   c%=FN mod_tempo
  9844.   a%=CARD{r_adr_replay_frequency%}
  9845.   SELECT a%
  9846.   CASE 49170
  9847.     b%=32780
  9848.     d%=&H102
  9849.   CASE 32780
  9850.     b%=24585
  9851.     d%=&H103
  9852.   CASE 24585
  9853.     b%=19668
  9854.     d%=&H104
  9855.   CASE 19668
  9856.     b%=16390
  9857.     d%=&H105
  9858.   CASE 16390
  9859.     b%=12292
  9860.     d%=&H107
  9861.   DEFAULT
  9862.     b%=49170
  9863.     d%=&H101
  9864.   ENDSELECT
  9865.   IF b%>a%                                  ! C'est pour eviter des bugs dus a une desychro entre
  9866.     CARD{r_adr_replay_frequency%}=b%        ! nombre d'ech a calculer / frequence de replay, a
  9867.     GOSUB chg_tempo(c%)                     ! cause du double buffer.
  9868.     PAUSE 5                                 ! *** Principe a verifier plus en detail
  9869.     SDPOKE &HFFFF8934,d%
  9870.   ELSE
  9871.     SDPOKE &HFFFF8934,d%
  9872.     PAUSE 5
  9873.     CARD{r_adr_replay_frequency%}=b%
  9874.     GOSUB chg_tempo(c%)
  9875.   ENDIF
  9876.   GOSUB aff_message("Replay in "+STR$(b%/1000)+" KHz.")
  9877. RETURN
  9878. PROCEDURE key_interpolation_one_track
  9879.   b%=preset&(curs_col%,n_preset%)
  9880.   a%=ABS(SGN(FN track_interpol(b%))) XOR 1
  9881.   CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,b%))}=a%
  9882.   IF a%<>0
  9883.     GOSUB aff_message("Interpolation on track "+STR$(SUCC(b%))+".")
  9884.   ELSE
  9885.     GOSUB aff_message("Interpolation disabled on track "+STR$(SUCC(b%))+".")
  9886.   ENDIF
  9887. RETURN
  9888. PROCEDURE key_interpolation_all_tracks
  9889.   a%=ABS(SGN(FN track_interpol(preset&(curs_col%,n_preset%)))) XOR 1
  9890.   FOR i%=0 TO PRED(nbr_track%)
  9891.     CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,i%))}=a%
  9892.   NEXT i%
  9893.   IF a%<>0
  9894.     GOSUB aff_message("Interpolation on all the tracks.")
  9895.   ELSE
  9896.     GOSUB aff_message("Interpolation disabled on all the tracks.")
  9897.   ENDIF
  9898. RETURN
  9899. PROCEDURE key_inc_step
  9900.   IF line_step%>-256 AND line_step%<256
  9901.     line_step%=SUCC(line_step%) MOD FN nbr_lines3
  9902.   ELSE
  9903.     line_step%=1
  9904.   ENDIF
  9905.   GOSUB affiche_info_song
  9906. RETURN
  9907. PROCEDURE key_dec_step
  9908.   IF line_step%>-256 AND line_step%<256
  9909.     line_step%=MAX(PRED(line_step%) MOD FN nbr_lines3,-15)
  9910.   ELSE
  9911.     line_step%=1
  9912.   ENDIF
  9913.   GOSUB affiche_info_song
  9914. RETURN
  9915. PROCEDURE key_load_module
  9916.   km%=1
  9917.   GOSUB load_module
  9918.   km%=0
  9919. RETURN
  9920. PROCEDURE key_save_module
  9921.   km%=1
  9922.   GOSUB save_module
  9923.   km%=0
  9924. RETURN
  9925. PROCEDURE key_resync_screen
  9926.   GOSUB resync_tv_screen
  9927. RETURN
  9928. PROCEDURE key_snapshot
  9929.   GOSUB aff_message("Please clic on 2 corners for the snapshot")
  9930.   GOSUB snapshot
  9931. RETURN
  9932. PROCEDURE key_stop_edit
  9933.   GOSUB stop_edit
  9934. RETURN
  9935. PROCEDURE key_block_start
  9936.   GOSUB block_start
  9937. RETURN
  9938. PROCEDURE key_block_end
  9939.   GOSUB block_end
  9940. RETURN
  9941. PROCEDURE key_cont_song
  9942.   GOSUB edit_mode_off
  9943.   GOSUB play_song(TRUE)
  9944. RETURN
  9945. PROCEDURE key_cont_pattern
  9946.   GOSUB edit_mode_off
  9947.   GOSUB play_pattern(TRUE)
  9948. RETURN
  9949. PROCEDURE key_samplepad_drumpad
  9950.   drumpad_flag%=SUCC(drumpad_flag%) MOD 3
  9951.   GOSUB affiche_barre_info
  9952. RETURN
  9953. PROCEDURE key_line
  9954.   posligne%=MIN(keydef_param%(numero_fonction%),PRED(FN nbr_lines3))
  9955.   IF play%>0
  9956.     DPOKE r_mod_linepos%,posligne%
  9957.   ELSE
  9958.     GOSUB affiche_c_pattern
  9959.   ENDIF
  9960. RETURN
  9961. PROCEDURE key_prev_instr
  9962.   instr%=MAX(PRED(instr%),1)
  9963.   GOSUB affiche_info_sample
  9964. RETURN
  9965. PROCEDURE key_next_instr
  9966.   instr%=MIN(SUCC(instr%),255)
  9967.   GOSUB affiche_info_sample
  9968. RETURN
  9969. PROCEDURE key_prev_sample
  9970.   sample%=MAX(PRED(sample%),1)
  9971.   GOSUB affiche_info_sample
  9972. RETURN
  9973. PROCEDURE key_next_sample
  9974.   sample%=MIN(SUCC(sample%),255)
  9975.   GOSUB affiche_info_sample
  9976. RETURN
  9977. PROCEDURE key_select_preset
  9978.   a%=presetpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))
  9979.   GOSUB chg_preset(a%)
  9980. RETURN
  9981. PROCEDURE key_rec_preset
  9982.   presetpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))=n_preset%
  9983.   GOSUB aff_message("Preset #"+STR$(a%)+" recorded on presetpad.")
  9984. RETURN
  9985. PROCEDURE key_track_onoff
  9986.   a%=trackpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))
  9987.   IF a%<nbr_track%
  9988.     GOSUB chg_a_track_onoff(a%,ABS(SGN(FN track_onoff(a%))) XOR 1)
  9989.   ENDIF
  9990. RETURN
  9991. PROCEDURE key_rec_track_onoff
  9992.   a%=preset&(curs_col%,n_preset%)
  9993.   IF a%<nbr_track%
  9994.     trackpad%(ADD(keydef_param%(numero_fonction%),numero_touche%))=a%
  9995.     GOSUB aff_message("Track #"+STR$(a%)+" recorded on trackpad.")
  9996.   ENDIF
  9997. RETURN
  9998. PROCEDURE key_prev_line
  9999.   DEC posligne%
  10000.   IF posligne%<0
  10001.     posligne%=PRED(FN nbr_lines3)
  10002.   ENDIF
  10003.   IF play%>0
  10004.     DPOKE r_mod_linepos%,posligne%
  10005.   ELSE
  10006.     GOSUB affiche_c_pattern
  10007.   ENDIF
  10008. RETURN
  10009. PROCEDURE key_next_line
  10010.   INC posligne%
  10011.   IF posligne%=>FN nbr_lines3
  10012.     posligne%=0
  10013.   ENDIF
  10014.   IF play%>0
  10015.     DPOKE r_mod_linepos%,posligne%
  10016.   ELSE
  10017.     GOSUB affiche_c_pattern
  10018.   ENDIF
  10019. RETURN
  10020. PROCEDURE key_instr_sample_drum
  10021.   a%=ADD(keydef_param%(numero_fonction%),numero_touche%)
  10022.   IF drumpad_flag%=0                            ! Numero d'instrument
  10023.     instr%=drumpad%(a%,0)
  10024.     GOSUB affiche_info_sample
  10025.   ELSE IF drumpad_flag%=1                       ! Numero de sample
  10026.     sample%=drumpad%(a%,1)
  10027.     GOSUB affiche_info_sample
  10028.   ELSE                                          ! Sort une note du drumpad
  10029.     IF edit%=1
  10030.       LPOKE FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%)),drumpad%(a%,2)
  10031.       GOSUB next_line
  10032.     ENDIF
  10033.   ENDIF
  10034. RETURN
  10035. PROCEDURE key_rec_instr_sample_drum
  10036.   a%=ADD(keydef_param%(numero_fonction%),numero_touche%)
  10037.   IF drumpad_flag%=0                            ! Instrument
  10038.     drumpad%(a%,0)=instr%
  10039.     GOSUB aff_message("Instrument #"+HEX$(instr%,2)+" recorded on samplepad.")
  10040.   ELSE IF drumpad_flag%=1                       ! Sample
  10041.     drumpad%(a%,1)=sample%
  10042.     GOSUB aff_message("Sample #"+HEX$(instr%,2)+" recorded on samplepad.")
  10043.   ELSE                                          ! Drum
  10044.     b%=LPEEK(FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%)))
  10045.     drumpad%(a%,2)=b%
  10046.     IF (b% AND &HFF000000)>0
  10047.       c%=SHR(b%,24)       ! c% = note
  10048.       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.")
  10049.     ELSE
  10050.       GOSUB aff_message("--- "+HEX$(SHR(b%,16) AND 255)+HEX$(b%,4)+" recorded on drumpad.")
  10051.     ENDIF
  10052.   ENDIF
  10053. RETURN
  10054. PROCEDURE key_help
  10055.   GOSUB help(4)             ! Page des effets
  10056. RETURN
  10057. PROCEDURE key_instr_under_cursor
  10058.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10059.   b%=BYTE{SUCC(a%)}
  10060.   IF b%<>0
  10061.     instr%=b%
  10062.     GOSUB affiche_info_sample
  10063.   ENDIF
  10064. RETURN
  10065. PROCEDURE key_prev_bar
  10066.   posligne%=PRED(posligne%) AND -16
  10067.   IF posligne%<0
  10068.     posligne%=PRED(FN nbr_lines3) AND -16
  10069.   ENDIF
  10070.   IF play%>0
  10071.     DPOKE r_mod_linepos%,posligne%
  10072.   ELSE
  10073.     GOSUB affiche_c_pattern
  10074.   ENDIF
  10075. RETURN
  10076. PROCEDURE key_next_bar
  10077.   posligne%=ADD(posligne%,16) AND -16
  10078.   IF posligne%=>FN nbr_lines3
  10079.     posligne%=0
  10080.   ENDIF
  10081.   IF play%>0
  10082.     DPOKE r_mod_linepos%,posligne%
  10083.   ELSE
  10084.     GOSUB affiche_c_pattern
  10085.   ENDIF
  10086. RETURN
  10087. PROCEDURE key_cursor_left
  10088.   GOSUB curseur_a_gauche
  10089. RETURN
  10090. PROCEDURE key_cursor_right
  10091.   GOSUB curseur_a_droite
  10092. RETURN
  10093. PROCEDURE key_prev_songpos
  10094.   d%=-1
  10095.   GOSUB chg_songpos
  10096. RETURN
  10097. PROCEDURE key_next_songpos
  10098.   d%=1
  10099.   GOSUB chg_songpos
  10100. RETURN
  10101. PROCEDURE key_prev_preset
  10102.   GOSUB chg_preset(PRED(n_preset%) AND 31)
  10103. RETURN
  10104. PROCEDURE key_next_preset
  10105.   GOSUB chg_preset(SUCC(n_preset%) AND 31)
  10106. RETURN
  10107. PROCEDURE key_dec_high
  10108.   haut_lig%=MAX(SUB(haut_lig%,2),1)
  10109.   CARD{ADD(V:para_affiche_pattern$,6)}=haut_lig%
  10110.   GOSUB cadre_ext(1,ADD(MUL(haut_lig%,6),170),SUB(scr_ncol%,3),11,9,9,9,9)
  10111.   GOSUB affiche_cadre_voies
  10112.   GOSUB affiche_info_preset
  10113.   GOSUB affiche_c_pattern
  10114. RETURN
  10115. PROCEDURE key_inc_high
  10116.   haut_lig%=MIN(ADD(haut_lig%,2),DIV(SUB(scr_haut%,180),6) OR 1)
  10117.   CARD{ADD(V:para_affiche_pattern$,6)}=haut_lig%
  10118.   GOSUB affiche_cadre_voies
  10119.   GOSUB affiche_info_preset
  10120.   GOSUB affiche_c_pattern
  10121. RETURN
  10122. PROCEDURE key_play_line
  10123.   IF play%=0
  10124.     FOR i%=0 TO PRED(nbr_track%)
  10125.       b%=LONG{SUCC(FN adr_strk(songpos%,posligne%,i%))}
  10126.       d%=BYTE{FN adr_strk(songpos%,posligne%,i%)}
  10127.       BYTE{ADD(V:pattern_bidon%(8),MUL(i%,5))}=d%
  10128.       LONG{SUCC(ADD(V:pattern_bidon%(8),MUL(i%,5)))}=b%
  10129.     NEXT i%
  10130.     GOSUB next_line
  10131.     GOSUB play_pattern_bidon
  10132.   ENDIF
  10133. RETURN
  10134. PROCEDURE key_play_song
  10135.   GOSUB play_song(0)
  10136. RETURN
  10137. PROCEDURE key_play_pattern
  10138.   GOSUB play_pattern(0)
  10139. RETURN
  10140. ' Touches en mode Edit
  10141. PROCEDURE key_clear_note
  10142.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10143.   LPOKE a%,LPEEK(a%) AND 65535
  10144.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10145.   GOSUB play_pattern_bidon
  10146.   GOSUB next_line
  10147. RETURN
  10148. PROCEDURE key_copy_block_track
  10149.   trackpat_s%=trackpat%
  10150.   trackpat%=0
  10151.   GOSUB paste_block
  10152.   trackpat%=trackpat_s%
  10153.   GOSUB affiche_c_pattern
  10154.   GOSUB aff_message("Track copied.")
  10155. RETURN
  10156. PROCEDURE key_copy_block_pattern
  10157.   trackpat_s%=trackpat%
  10158.   trackpat%=1
  10159.   GOSUB paste_block
  10160.   trackpat%=trackpat_s%
  10161.   GOSUB affiche_c_pattern
  10162.   GOSUB aff_message("Pattern copied.")
  10163. RETURN
  10164. PROCEDURE key_copy_block_preset
  10165.   trackpat_s%=trackpat%
  10166.   trackpat%=2
  10167.   GOSUB paste_block
  10168.   trackpat%=trackpat_s%
  10169.   GOSUB affiche_c_pattern
  10170.   GOSUB aff_message("Preset copied.")
  10171. RETURN
  10172. PROCEDURE key_copy_block_track_cursor
  10173.   trackpat_s%=trackpat%
  10174.   bl_trk_s&=bl_trk&
  10175.   trackpat%=0
  10176.   bl_trk&=preset&(curs_col%,n_preset%)
  10177.   GOSUB paste_block
  10178.   trackpat%=trackpat_s%
  10179.   bl_trk&=bl_trk_s&
  10180.   GOSUB affiche_c_pattern
  10181.   GOSUB aff_message("Track copied.")
  10182. RETURN
  10183. PROCEDURE key_clear_effect
  10184.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10185.   LPOKE a%,LPEEK(a%) AND -65536
  10186.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10187.   GOSUB play_pattern_bidon
  10188.   GOSUB next_line
  10189. RETURN
  10190. PROCEDURE key_clear_volume
  10191.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10192.   POKE ADD(a%,4),0
  10193.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10194.   GOSUB play_pattern_bidon
  10195.   GOSUB next_line
  10196. RETURN
  10197. PROCEDURE key_clear_whole_note
  10198.   a%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  10199.   LPOKE a%,0
  10200.   POKE ADD(a%,4),0
  10201.   BMOVE FN adr_sline(songpos%,posligne%),V:pattern_bidon%(8),MUL(nbr_track%,5)
  10202.   GOSUB play_pattern_bidon
  10203.   GOSUB next_line
  10204. RETURN
  10205. PROCEDURE key_insert_line_pattern
  10206.   GOSUB insert_line_pattern(song&(songpos%),posligne%)
  10207.   GOSUB affiche_c_pattern
  10208. RETURN
  10209. PROCEDURE key_insert_line_track
  10210.   GOSUB insert_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%),STRING$(5,0))
  10211.   GOSUB affiche_c_pattern
  10212. RETURN
  10213. PROCEDURE key_insert_line_preset
  10214.   GOSUB insert_line_preset(song&(songpos%),posligne%)
  10215.   GOSUB affiche_c_pattern
  10216. RETURN
  10217. PROCEDURE key_insert_line_pattern_rotate
  10218.   GOSUB insert_r_line_pattern(song&(songpos%),posligne%)
  10219.   GOSUB affiche_c_pattern
  10220. RETURN
  10221. PROCEDURE key_insert_line_track_rotate
  10222.   GOSUB insert_r_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  10223.   GOSUB affiche_c_pattern
  10224. RETURN
  10225. PROCEDURE key_insert_line_preset_rotate
  10226.   GOSUB insert_r_line_preset(song&(songpos%),posligne%)
  10227.   GOSUB affiche_c_pattern
  10228. RETURN
  10229. PROCEDURE key_delete_line_pattern
  10230.   GOSUB delete_line_pattern(song&(songpos%),posligne%)
  10231.   GOSUB affiche_c_pattern
  10232. RETURN
  10233. PROCEDURE key_delete_line_track
  10234.   GOSUB delete_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%),STRING$(5,0))
  10235.   GOSUB affiche_c_pattern
  10236. RETURN
  10237. PROCEDURE key_delete_line_preset
  10238.   GOSUB delete_line_preset(song&(songpos%),posligne%)
  10239.   GOSUB affiche_c_pattern
  10240. RETURN
  10241. PROCEDURE key_delete_line_pattern_rotate
  10242.   GOSUB delete_r_line_pattern(song&(songpos%),posligne%)
  10243.   GOSUB affiche_c_pattern
  10244. RETURN
  10245. PROCEDURE key_delete_line_track_rotate
  10246.   GOSUB delete_r_line_track(song&(songpos%),posligne%,preset&(curs_col%,n_preset%))
  10247.   GOSUB affiche_c_pattern
  10248. RETURN
  10249. PROCEDURE key_delete_line_preset_rotate
  10250.   GOSUB delete_r_line_preset(song&(songpos%),posligne%)
  10251.   GOSUB affiche_c_pattern
  10252. RETURN
  10253. ' Divers
  10254. PROCEDURE cherche_combinaison_touches(t$,VAR am%,ae%,bm%,be%)
  10255.   LOCAL a$
  10256.   LOCAL a%,p%
  10257.   LOCAL deux_touches!
  10258.   deux_touches!=FALSE
  10259.   am%=&HF000100
  10260.   bm%=&HF000100
  10261.   ae%=0
  10262.   be%=0
  10263.   WHILE LEN(t$)
  10264.     GOSUB separe_chaine(t$,a$)
  10265.     IF a$="NOKEY"
  10266.       am%=0
  10267.       bm%=0
  10268.       ae%=0
  10269.       be%=0
  10270.       t$=""
  10271.     ELSE IF a$="/"
  10272.       deux_touches!=TRUE
  10273.       SWAP am%,bm%
  10274.       SWAP ae%,be%
  10275.     ELSE IF a$="SHIFT"
  10276.       am%=(am% AND -&H3000001) OR &H100         ! Ne prend plus en compte les bits
  10277.       ae%=(ae% AND -&H3000001) OR &H100         ! seuls de Lshift et Rshift
  10278.     ELSE IF a$="RSHIFT"
  10279.       am%=(am% AND -&H101) OR &H1000000         ! Retire l'attribut 'Shift quelconque'
  10280.       ae%=(ae% AND -&H101) OR &H1000000
  10281.     ELSE IF a$="LSHIFT"
  10282.       am%=(am% AND -&H101) OR &H2000000         ! Retire l'attribut 'Shift quelconque'
  10283.       ae%=(ae% AND -&H101) OR &H2000000
  10284.     ELSE IF a$="CTRL"
  10285.       am%=am% OR &H4000000
  10286.       ae%=ae% OR &H4000000
  10287.     ELSE IF a$="ALT"
  10288.       am%=am% OR &H8000000
  10289.       ae%=ae% OR &H8000000
  10290.     ELSE IF a$="CAPS"
  10291.       am%=am% OR &H10000000
  10292.       ae%=ae% OR &H10000000
  10293.     ELSE IF a$="NOCAPS"
  10294.       am%=am% OR &H10000000
  10295.       ae%=ae% AND -&H10000001
  10296.     ELSE IF a$="NUMPAD"
  10297.       am%=(am% AND &HFF00FB00) OR &H200         ! Retire Scan+Ascii+Fkeys
  10298.       ae%=(ae% AND &HFF00FB00) OR &H200
  10299.     ELSE IF a$="FKEYS"
  10300.       am%=(am% AND &HFF00FD00) OR &H400         ! Retire Scan+Ascii+Pad
  10301.       ae%=(ae% AND &HFF00FD00) OR &H400
  10302.     ELSE IF a$="ESC"
  10303.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10304.       ae%=(ae% AND &HFF00FC00) OR &H10000
  10305.     ELSE IF a$="TAB"
  10306.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10307.       ae%=(ae% AND &HFF00FC00) OR &HF0000
  10308.     ELSE IF a$="SPACE"
  10309.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10310.       ae%=(ae% AND &HFF00FC00) OR &H390000
  10311.     ELSE IF a$="RETURN"
  10312.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10313.       ae%=(ae% AND &HFF00FC00) OR &H1C0000
  10314.     ELSE IF a$="BACKSPACE"
  10315.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10316.       ae%=(ae% AND &HFF00FC00) OR &HE0000
  10317.     ELSE IF a$="DEL"
  10318.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10319.       ae%=(ae% AND &HFF00FC00) OR &H530000
  10320.     ELSE IF a$="HELP"
  10321.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10322.       ae%=(ae% AND &HFF00FC00) OR &H620000
  10323.     ELSE IF a$="UNDO"
  10324.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10325.       ae%=(ae% AND &HFF00FC00) OR &H610000
  10326.     ELSE IF a$="INS"
  10327.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10328.       ae%=(ae% AND &HFF00FC00) OR &H520000
  10329.     ELSE IF a$="CLR"
  10330.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10331.       ae%=(ae% AND &HFF00FC00) OR &H470000
  10332.     ELSE IF a$="UP"
  10333.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10334.       ae%=(ae% AND &HFF00FC00) OR &H480000
  10335.     ELSE IF a$="DOWN"
  10336.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10337.       ae%=(ae% AND &HFF00FC00) OR &H500000
  10338.     ELSE IF a$="LEFT"
  10339.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10340.       ae%=(ae% AND &HFF00FC00) OR &H4B0000
  10341.     ELSE IF a$="RIGHT"
  10342.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10343.       ae%=(ae% AND &HFF00FC00) OR &H4D0000
  10344.     ELSE IF a$="PAD0"
  10345.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10346.       ae%=(ae% AND &HFF00FC00) OR &H700000
  10347.     ELSE IF a$="PADPOINT"
  10348.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10349.       ae%=(ae% AND &HFF00FC00) OR &H710000
  10350.     ELSE IF (a$>="F1" AND a$<="F9") OR a$="F10"
  10351.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10352.       a%=ADD(&H3A,VAL(RIGHT$(a$,PRED(LEN(a$)))))
  10353.       ae%=(ae% AND &HFF00FC00) OR SHL(a%,16)
  10354.     ELSE IF a$="#"
  10355.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10356.       ae%=(ae% AND &HFF00FC00) OR &H2B0000
  10357.     ELSE IF a$="<" OR a$=">"
  10358.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10359.       ae%=(ae% AND &HFF00FC00) OR &H600000
  10360.     ELSE IF a$="&" OR a$="1"
  10361.       am%=(am% AND &HFFFFFC00) OR &HFF0000      ! Retire Ascii+Pad+Fkeys et met le Scan
  10362.       ae%=(ae% AND &HFF00FC00) OR &H20000
  10363.     ELSE IF a$>="A" AND a$<="Z"
  10364.       am%=(am% AND &HFF00FCFF) OR &HFF          ! Retire Scan+Pad+Fkeys et met l'Ascii
  10365.       ae%=(ae% AND &HFF00FC00) OR ASC(a$)
  10366.     ENDIF
  10367.   WEND
  10368.   IF deux_touches! OR ae%=0
  10369.     SWAP am%,bm%
  10370.     SWAP ae%,be%
  10371.   ENDIF
  10372. RETURN
  10373. PROCEDURE separe_chaine(VAR reste$,premier$)
  10374.   ' Separe une chaine en 2 elements, separes par un espace
  10375.   LOCAL p%
  10376.   reste$=TRIM$(reste$)
  10377.   p%=INSTR(reste$," ")
  10378.   IF p%=0
  10379.     premier$=reste$
  10380.     reste$=""
  10381.   ELSE
  10382.     premier$=LEFT$(reste$,PRED(p%))
  10383.     reste$=TRIM$(RIGHT$(reste$,SUB(LEN(reste$),p%)))
  10384.   ENDIF
  10385. RETURN
  10386. '
  10387. ' Procedures diverses
  10388. ' -------------------
  10389. PROCEDURE attente_interruptible(secondes%)
  10390.   ' Attend un certain temps, ou qu'on appuie sur une touche ou la souris
  10391.   LOCAL flag_sortie!
  10392.   MUL secondes%,50                              ! Transforme en 50eme de secondes
  10393.   flag_sortie!=FALSE
  10394.   WHILE secondes%>0 AND (NOT flag_sortie!)
  10395.     IF GEMDOS(11)<>0
  10396.       ~GEMDOS(7)
  10397.       flag_sortie!=TRUE
  10398.     ELSE IF MOUSEK<>0
  10399.       flag_sortie!=TRUE
  10400.     ENDIF
  10401.     PAUSE 1
  10402.     DEC secondes%
  10403.   WEND
  10404.   GOSUB vide_buffer_clavier
  10405. RETURN
  10406. PROCEDURE teste_enregistrement2
  10407.   autodestruction_flag!=FALSE          ! I hate to imagine what that was supposed to do. /sjx.
  10408.   flag_registered2!=TRUE
  10409.   ' LOCAL a,b,a$,c$,i,user
  10410.   ' IF FN exist(npath_prog$+treg_str2$)
  10411.   '   OPEN "i",#0,npath_prog$+treg_str2$
  10412.   '    IF LOF(#0)=1032
  10413.   '     c$=STRING$(1032,0)
  10414.   '   BGET #0,V:c$,1032
  10415.   '    a=0                               ! Teste la somme de controle
  10416.   '     b=1
  10417.   '      FOR i=0 TO 1027
  10418.   '     a=a+b*(BYTE{ADD(V:c$,i)} XOR 255)
  10419.   '      b=b+1
  10420.   '     NEXT i
  10421.   '   IF a=LONG{V:c$+1028}
  10422.   '      user=LONG{V:c$+512}
  10423.   '       a=&H5BA3
  10424.   '     a$=""
  10425.   '      FOR i=0 TO 510 STEP 2
  10426.   '         b=CARD{V:c$+i}
  10427.   '    a$=a$+MKI$(b XOR a)
  10428.   '          a=(a-b) AND &HFFFF
  10429.   '  NEXT i
  10430.   '   IF a$=MID$(c$,517,512) AND user<>10
  10431.   '      flag_registered2!=TRUE
  10432.   '     ELSE
  10433.   '        GOTO erreur_user.reg2
  10434.   '       ENDIF
  10435.   '        flag_registered2!=(a$=MID$(c$,517,512) AND user<>10)
  10436.   '  IF user=10
  10437.   '     autodestruction_flag!=TRUE            ! Peut servir...
  10438.   '    ENDIF
  10439.   '   ELSE
  10440.   '      GOTO erreur_user.reg2
  10441.   '     ENDIF
  10442.   '    ELSE
  10443.   '    erreur_user.reg2:
  10444.   '    ENDIF
  10445.   '    CLOSE #0
  10446.   '  ENDIF
  10447. RETURN
  10448. PROCEDURE edite_chaine(aaaa$,xxxx%,yyyy%,llll%,tttt%)
  10449.   ' Edite la chaine a$ en (xxxx%,yyyy%), longueur max llll%, type tttt%
  10450.   ' tttt% : 0=alphanum, 1=hexa, 2=decimal, 3=virgule flo, 4=virgule fixe (non fait)
  10451.   ' Renvoie bbbb$
  10452.   LOCAL curs%,cla%,flig%,i%
  10453.   aaaa$=RIGHT$(aaaa$,llll%)
  10454.   WHILE LEN(aaaa$)<llll%
  10455.     IF tttt%=1
  10456.       aaaa$="0"+aaaa$
  10457.     ELSE IF tttt%=0
  10458.       aaaa$=aaaa$+" "
  10459.     ELSE
  10460.       aaaa$=" "+aaaa$
  10461.     ENDIF
  10462.   WEND
  10463.   IF tttt%=0
  10464.     curs%=1
  10465.   ELSE
  10466.     curs%=llll%
  10467.   ENDIF
  10468.   cla%=0
  10469.   GOSUB vide_buffer_clavier
  10470.   REPEAT
  10471.     GOSUB affchaine_notrans(aaaa$,xxxx%,yyyy%,1)
  10472.     GOSUB affchaine_notrans(CHR$(7),ADD(xxxx%,PRED(curs%)),yyyy%,1)
  10473.     GOSUB affchaine_trans(MID$(aaaa$,curs%,1),SHL(ADD(xxxx%,PRED(curs%)),1),yyyy%,0)
  10474.     cla%=INP(2)
  10475.     IF tttt%=1 AND cla%>96 AND cla%<123
  10476.       SUB cla%,32
  10477.     ENDIF
  10478.     SELECT cla%
  10479.     CASE 8      ! Backspace
  10480.       IF curs%>1
  10481.         aaaa$=LEFT$(aaaa$,SUB(curs%,2))+RIGHT$(aaaa$,SUB(llll%,PRED(curs%)))
  10482.         IF tttt%=1
  10483.           aaaa$=aaaa$+"0"
  10484.         ELSE
  10485.           aaaa$=aaaa$+" "
  10486.         ENDIF
  10487.         DEC curs%
  10488.       ENDIF
  10489.     CASE 127    ! Delete
  10490.       aaaa$=LEFT$(aaaa$,PRED(curs%))+RIGHT$(aaaa$,SUB(llll%,curs%))
  10491.       IF tttt%=1
  10492.         aaaa$=aaaa$+"0"
  10493.       ELSE
  10494.         aaaa$=aaaa$+" "
  10495.       ENDIF
  10496.     CASE 203    ! <-
  10497.       IF curs%>1
  10498.         DEC curs%
  10499.       ENDIF
  10500.     CASE 205    ! ->
  10501.       IF curs%<llll%
  10502.         INC curs%
  10503.       ENDIF
  10504.     CASE 32 TO 126
  10505.       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)))
  10506.         IF curs%<llll%
  10507.           aaaa$=LEFT$(aaaa$,PRED(curs%))+CHR$(cla%)+MID$(aaaa$,curs%,SUB(llll%,curs%))
  10508.           INC curs%
  10509.           flig%=0
  10510.         ELSE
  10511.           IF flig%=1 AND tttt%<>0
  10512.             aaaa$=RIGHT$(aaaa$+CHR$(cla%),llll%)
  10513.           ELSE
  10514.             aaaa$=LEFT$(aaaa$,PRED(curs%))+CHR$(cla%)
  10515.           ENDIF
  10516.           flig%=1
  10517.         ENDIF
  10518.       ENDIF
  10519.     ENDSELECT
  10520.   UNTIL cla%=13
  10521.   GOSUB affchaine_notrans(aaaa$,xxxx%,yyyy%,1)
  10522.   bbbb$=aaaa$
  10523. RETURN
  10524. PROCEDURE edite_mask1(mmmm1$,mmmm2$,xxxx%,yyyy%,ffff%,tttt%)
  10525.   LOCAL aaaa$,pppp%,aaaa%,kkkk1%,kkkk2%
  10526.   HIDEM
  10527.   pppp%=MUL(tttt%,3)
  10528.   GOTO edite_mask1_aff
  10529.   DO
  10530.     kkkk1%=GEMDOS(7)
  10531.     kkkk2%=ASC(UPPER$(CHR$((kkkk1% AND 127))))  ! Code ascii
  10532.     kkkk1%=SHR(kkkk1%,16) AND 255               ! Code clavier
  10533.     IF kkkk1%=75        ! Fleche gauche
  10534.       pppp%=MAX(PRED(pppp%),MUL(tttt%,3))
  10535.     ELSE IF kkkk1%=77   ! Fleche droite
  10536.       pppp%=MIN(SUCC(pppp%),8)
  10537.     ENDIF
  10538.     IF pppp%=0
  10539.       IF kkkk2%=63      ! Point d'interrogation
  10540.         BYTE{V:mmmm1$}=ffff%
  10541.         BYTE{V:mmmm2$}=0
  10542.         pppp%=1
  10543.       ELSE
  10544.         IF kkkk1%=20                    ! Note vide
  10545.           BYTE{V:mmmm1$}=NOT ffff%
  10546.           BYTE{V:mmmm2$}=0
  10547.           pppp%=1
  10548.         ELSE IF kkkk1%<54               ! Note
  10549.           aaaa%=t_note%(kkkk1%)
  10550.           IF aaaa%<>-1 AND ADD(aaaa%,MUL(octave%,12))<60
  10551.             ADD aaaa%,ADD(MUL(octave%,12),24)           ! Ajuste a la bonne note
  10552.             BYTE{V:mmmm1$}=NOT ffff%
  10553.             BYTE{V:mmmm2$}=aaaa%
  10554.             pppp%=1
  10555.           ENDIF
  10556.         ENDIF
  10557.       ENDIF
  10558.     ELSE IF pppp%>0
  10559.       SELECT kkkk2%
  10560.       CASE 63                     ! ?
  10561.         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)))
  10562.         LONG{SUCC(V:mmmm2$)}=LONG{SUCC(V:mmmm2$)} AND (NOT SHR(&HF0000000,SHL(PRED(pppp%),2)))
  10563.         pppp%=MIN(SUCC(pppp%),8)
  10564.       CASE 48 TO 57,65 TO 70      ! Hexa
  10565.         aaaa%=SUB(kkkk2%,48)
  10566.         IF kkkk2%>64
  10567.           SUB aaaa%,7
  10568.         ENDIF
  10569.         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)))
  10570.         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))))
  10571.         pppp%=MIN(SUCC(pppp%),8)
  10572.       ENDSELECT
  10573.     ENDIF
  10574.     ' Affichage
  10575.   edite_mask1_aff:
  10576.     IF tttt%=0
  10577.       IF BYTE{V:mmmm1$}=(ffff% AND 255)
  10578.         aaaa$="?  "
  10579.       ELSE
  10580.         IF BYTE{V:mmmm2$}=0
  10581.           aaaa$="---"
  10582.         ELSE
  10583.           aaaa$=MID$(gamme$,SUCC(SHL(BYTE{V:mmmm2$} MOD 12,1)),2)+STR$(SUB(DIV(BYTE{V:mmmm2$},12),2),1)
  10584.         ENDIF
  10585.       ENDIF
  10586.     ELSE
  10587.       aaaa$=""
  10588.     ENDIF
  10589.     FOR aaaa%=MUL(tttt%,2) TO 7
  10590.       IF (SHL(LONG{SUCC(V:mmmm1$)},SHL(aaaa%,2)) AND &HF0000000)=(ffff% AND &HF0000000)
  10591.         aaaa$=aaaa$+"?"
  10592.       ELSE
  10593.         aaaa$=aaaa$+HEX$(SHR(LONG{SUCC(V:mmmm2$)},SUB(28,SHL(aaaa%,2))) AND 15,1)
  10594.       ENDIF
  10595.     NEXT aaaa%
  10596.     aaaa%=pppp%
  10597.     IF tttt%=1
  10598.       SUB aaaa%,3
  10599.     ELSE
  10600.       IF pppp%>0
  10601.         ADD aaaa%,2
  10602.       ENDIF
  10603.     ENDIF
  10604.     GOSUB affchaine_notrans(aaaa$,xxxx%,yyyy%,1)
  10605.     EXIT IF kkkk2%=13
  10606.     GOSUB affchaine_notrans(CHR$(7),ADD(xxxx%,aaaa%),yyyy%,1)
  10607.     GOSUB affchaine_trans(MID$(aaaa$,SUCC(aaaa%),1),SHL(ADD(xxxx%,aaaa%),1),yyyy%,0)
  10608.   LOOP
  10609.   SHOWM
  10610.   zzzz1$=mmmm1$
  10611.   zzzz2$=mmmm2$
  10612. RETURN
  10613. PROCEDURE dialog(tit$,txt$,but$,x%,y%)
  10614.   ' Boite de dialogue. txt$=texte, | pour changer de ligne, but$=boutons, | pour separer les boutons
  10615.   ' x% et y% milieu de la boite, tit$ titre
  10616.   ' Renvoie bouton% (0 - n-1)
  10617.   LOCAL a%,b%,i%,j%,ntxt%,nbut%,oldp%,ox%,ox2%,oy%,oy2%,p%,tmax1%,tmax2%,tx%,ty%
  10618.   LOCAL xm%,xm2%,ym%,km%
  10619.   LOCAL ok!
  10620.   LOCAL ptxt$,pbut$
  10621.   HIDEM
  10622.   '
  10623.   ' Recherche du nombre de lignes de texte, indices et longueurs
  10624.   '
  10625.   ptxt$=""
  10626.   p%=1
  10627.   oldp%=p%
  10628.   ntxt%=1
  10629.   tmax1%=0
  10630.   REPEAT
  10631.     IF MID$(txt$,p%,1)="|"
  10632.       ptxt$=ptxt$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10633.       tmax1%=MAX(tmax1%,SUB(p%,oldp%))
  10634.       oldp%=SUCC(p%)
  10635.       INC ntxt%
  10636.     ENDIF
  10637.     INC p%
  10638.   UNTIL p%>LEN(txt$)
  10639.   ptxt$=ptxt$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10640.   tmax1%=MAX(tmax1%,SUB(p%,oldp%))
  10641.   '
  10642.   ' Recherche du nombre de boutons, indices et longueurs
  10643.   '
  10644.   pbut$=""
  10645.   p%=1
  10646.   oldp%=p%
  10647.   nbut%=1
  10648.   tmax2%=6
  10649.   REPEAT
  10650.     IF MID$(but$,p%,1)="|"
  10651.       pbut$=pbut$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10652.       tmax2%=MAX(tmax2%,SUB(p%,oldp%))
  10653.       oldp%=SUCC(p%)
  10654.       INC nbut%
  10655.     ENDIF
  10656.     INC p%
  10657.   UNTIL p%>LEN(but$)
  10658.   pbut$=pbut$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  10659.   tmax2%=MAX(tmax2%,SUB(p%,oldp%))
  10660.   ADD tmax2%,2                                  ! 1 espace de chaque cote du bouton
  10661.   '
  10662.   ' Definition de la taille de la boite
  10663.   '
  10664.   tx%=MAX(ADD(tmax1%,4),MUL(ADD(tmax2%,2),nbut%))
  10665.   ty%=ADD(MUL(ntxt%,8),34)                      ! 1+ 12 + 1+4+(8*l-2)+4+1 + 1+1+8+1+1 +1
  10666.   ox%=MIN(MAX(SUB(SHR(x%,3),SHR(tx%,1)),0),SUB(scr_ncol%,SUCC(tx%)))
  10667.   oy%=MIN(MAX(SUB(y%,SUB(ty%,6)),0),SUB(scr_haut%,ADD(ty%,4)))
  10668.   ox2%=SUB(ADD(ox%,tx%),PRED(MUL(ADD(tmax2%,2),nbut%)))
  10669.   oy2%=ADD(oy%,SUB(ty%,12))
  10670.   '
  10671.   ' Affichage de la boite
  10672.   '
  10673.   GOSUB save_background(SHL(ox%,3),oy%,SHL(SUCC(tx%),3),ADD(ty%,4))
  10674.   GOSUB cadre_int(SUCC(ox%),ADD(oy%,4),PRED(tx%),PRED(ty%),0,0,0,0)
  10675.   GOSUB cadre_int(ox%,oy%,PRED(tx%),PRED(ty%),9,9,10,8)
  10676.   GOSUB cadre_ext(SUCC(ox%),ADD(oy%,14),SUB(tx%,3),ADD(SHL(ntxt%,3),5),1,9,8,10)
  10677.   IF tit$<>""
  10678.     GOSUB affchaine_trans(tit$,SHL(SUCC(ox%),1),ADD(oy%,4),8)
  10679.   ENDIF
  10680.   ' Le texte
  10681.   FOR i%=0 TO PRED(ntxt%)
  10682.     a%=CARD{ADD(V:ptxt$,SHL(i%,2))}
  10683.     b%=CARD{ADD(V:ptxt$,ADD(SHL(i%,2),2))}
  10684.     ' GOSUB affchaine_trans(MID$(txt$,a%,b%),SUB(ADD(SHL(ox%,1),tx%),b%),ADD(ADD(oy%,18),SHL(i%,3)),0)
  10685.     ' Texte centre ----^
  10686.     GOSUB affchaine_trans(MID$(txt$,a%,b%),ADD(SHL(ox%,1),4),ADD(ADD(oy%,18),SHL(i%,3)),0)
  10687.   NEXT i%
  10688.   ' Les boutons
  10689.   FOR i%=0 TO PRED(nbut%)
  10690.     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%))
  10691.   NEXT i%
  10692.   '
  10693.   ' Gestion de la souris et du clavier
  10694.   '
  10695.   SHOWM
  10696.   GOSUB wait_mouse(TRUE)
  10697.   bouton%=-1                                    ! Aucun bouton selectionne pour l'instant
  10698.   ok!=FALSE
  10699.   REPEAT
  10700.     REPEAT
  10701.       km%=MOUSEK
  10702.     UNTIL km%<>0 OR GEMDOS(11)<>0               ! Attend qu'on appuie sur le bouton de la souris ou une touche
  10703.     IF km%<>0
  10704.       ' --- Gestion souris ---
  10705.       REPEAT                                    ! Quand on appuie, la selection des boutons suit
  10706.         MOUSE xm%,ym%,km%                       ! la souris jusqu'au relachement
  10707.         xm2%=SHR(xm%,3)
  10708.         a%=DIV(SUB(xm2%,ox2%),ADD(tmax2%,2))
  10709.         b%=SUB(xm2%,ox2%) MOD ADD(tmax2%,2)
  10710.         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
  10711.           IF a%<>bouton%                    ! Si on a change de bouton depuis la derniere fois,
  10712.             IF bouton%>=0                   ! Deselectionne le precedent bouton
  10713.               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)
  10714.             ENDIF
  10715.             bouton%=a%
  10716.             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)
  10717.             ok!=TRUE
  10718.           ENDIF
  10719.         ELSE                                ! On n'est plus sur un bouton
  10720.           IF bouton%>=0                     ! Deselectionne le precedent bouton
  10721.             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)
  10722.           ENDIF
  10723.           bouton%=-1
  10724.           ok!=FALSE
  10725.         ENDIF
  10726.         SHOWM
  10727.       UNTIL km%=0
  10728.     ELSE
  10729.       ' --- Gestion clavier ---
  10730.       a%=GEMDOS(7) AND 255                      ! Caractere ASCII
  10731.       IF a%=>48 AND a%<58                       ! <1> - <0>
  10732.         a%=SUB(a%,39) MOD 10                    ! "1" > 0, ... "9" > 8, "0" > 9
  10733.         IF a%<nbut%                             ! a% numero du bouton selectionne
  10734.           IF bouton%>=0                         ! Deselectionne le precedent bouton
  10735.             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)
  10736.           ENDIF
  10737.           bouton%=a%
  10738.           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)
  10739.         ENDIF
  10740.         ok!=FALSE
  10741.       ELSE IF a%=13 AND bouton%>=0              ! <Return>
  10742.         ok!=TRUE
  10743.       ENDIF
  10744.       SHOWM
  10745.     ENDIF
  10746.   UNTIL bouton%>=0 AND ok!
  10747.   '
  10748.   GOSUB restore_background
  10749. RETURN
  10750. PROCEDURE wait_mouse(flag!)
  10751.   IF flag!
  10752.     REPEAT
  10753.     UNTIL MOUSEK=0
  10754.   ENDIF
  10755. RETURN
  10756. PROCEDURE bee(flag!)
  10757.   ' Souris en forme de fleche (False) ou d'abeille (True)
  10758.   HIDEM
  10759.   DEFMOUSE flag! AND 2
  10760.   SHOWM
  10761. RETURN
  10762. PROCEDURE intel_w(aaaa%)
  10763.   LOCAL bbbb%
  10764.   bbbb%=BYTE{SUCC(aaaa%)}
  10765.   BYTE{SUCC(aaaa%)}=BYTE{aaaa%}
  10766.   BYTE{aaaa%}=bbbb%
  10767. RETURN
  10768. PROCEDURE intel_3(aaaa%)
  10769.   LOCAL bbbb%
  10770.   bbbb%=BYTE{ADD(aaaa%,2)}
  10771.   BYTE{ADD(aaaa%,2)}=BYTE{aaaa%}
  10772.   BYTE{aaaa%}=bbbb%
  10773. RETURN
  10774. PROCEDURE intel_l(aaaa%)
  10775.   LOCAL bbbb%
  10776.   bbbb%=BYTE{ADD(aaaa%,3)}
  10777.   BYTE{ADD(aaaa%,3)}=BYTE{aaaa%}
  10778.   BYTE{aaaa%}=bbbb%
  10779.   bbbb%=BYTE{SUCC(aaaa%)}
  10780.   BYTE{SUCC(aaaa%)}=BYTE{ADD(aaaa%,2)}
  10781.   BYTE{ADD(aaaa%,2)}=bbbb%
  10782. RETURN
  10783. PROCEDURE mem_rotation(aaaa%,llll%,dddd%)
  10784.   ' Rotation de memoire :
  10785.   ' adresse aaaa%, longueur llll%, deplacement dddd%
  10786.   LOCAL bbbb%,tttt%,adr_t%
  10787.   IF llll%>0
  10788.     tttt%=MAX(16384,SUB(FRE(0),16384)) AND -4   ! Laisse toujours 16 Ko de libre mais min 16 Ko.
  10789.     DIM mem_rotation%(PRED(SHR(tttt%,2)))       ! Deplacement par pas de tttt% bytes
  10790.     adr_t%=V:mem_rotation%(0)
  10791.     dddd%=dddd% MOD llll%                       ! Meilleure direction de deplacement
  10792.     IF ABS(dddd%)>SHR(llll%,2)
  10793.       SUB dddd%,MUL(llll%,SGN(dddd%))
  10794.     ENDIF
  10795.     IF dddd%=>0
  10796.       WHILE dddd%>0                             ! Deplacement positif (vers la droite)
  10797.         bbbb%=MIN(dddd%,tttt%)
  10798.         ~C:g_bmove%(L:ADD(aaaa%,SUB(llll%,bbbb%)),L:adr_t%,L:bbbb%)
  10799.         ~C:g_bmove%(L:aaaa%,L:ADD(aaaa%,bbbb%),L:SUB(llll%,bbbb%))
  10800.         ~C:g_bmove%(L:adr_t%,L:aaaa%,L:bbbb%)
  10801.         SUB dddd%,bbbb%
  10802.       WEND
  10803.     ELSE
  10804.       WHILE dddd%<0                             ! Deplacement negatif (vers la gauche)
  10805.         bbbb%=MIN(-dddd%,tttt%)
  10806.         ~C:g_bmove%(L:aaaa%,L:adr_t%,L:bbbb%)
  10807.         ~C:g_bmove%(L:ADD(aaaa%,bbbb%),L:aaaa%,L:SUB(llll%,bbbb%))
  10808.         ~C:g_bmove%(L:adr_t%,L:ADD(aaaa%,SUB(llll%,bbbb%)),L:bbbb%)
  10809.         ADD dddd%,bbbb%
  10810.       WEND
  10811.     ENDIF
  10812.     ERASE mem_rotation%()
  10813.   ENDIF
  10814. RETURN
  10815. PROCEDURE help(page%)
  10816.   LOCAL i%,j%,k%,xp%,yp%,xm%,ym%,km%,flag_fin!,a$
  10817.   HIDEM
  10818.   flag_fin!=FALSE
  10819.   xp%=SUB(SHR(scr_ncol%,1),36)
  10820.   yp%=SUB(SHR(scr_haut%,1),81)
  10821.   GOSUB cadre_texte("PREVIOUS PAGE",xp%,ADD(yp%,152),32)
  10822.   GOSUB cadre_texte("EXIT",ADD(xp%,33),ADD(yp%,152),5)
  10823.   GOSUB cadre_texte("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32)
  10824.   pmax%=&H7FFFFFFF
  10825.   GOSUB aff_helppage(page%,xp%,yp%)
  10826.   REPEAT
  10827.     SHOWM
  10828.     MOUSE xm%,ym%,km%
  10829.     IF ym%>ADD(yp%,162) OR ym%<ADD(yp%,151)
  10830.       km%=0
  10831.     ENDIF
  10832.     DIV xm%,8
  10833.     IF km%<>0
  10834.       IF xm%>PRED(xp%) AND xm%<ADD(xp%,33) AND page%>0
  10835.         GOSUB cadre_texte2("PREVIOUS PAGE",xp%,ADD(yp%,152),32,1)
  10836.         GOSUB wait_mouse(TRUE)
  10837.         DEC page%
  10838.         GOSUB aff_helppage(page%,xp%,yp%)
  10839.         GOSUB cadre_texte("PREVIOUS PAGE",xp%,ADD(yp%,152),32)
  10840.       ELSE IF xm%>ADD(xp%,38) AND xm%<ADD(xp%,72) AND page%<help_pmax%
  10841.         GOSUB cadre_texte2("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32,1)
  10842.         GOSUB wait_mouse(TRUE)
  10843.         INC page%
  10844.         GOSUB aff_helppage(page%,xp%,yp%)
  10845.         GOSUB cadre_texte("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32)
  10846.       ELSE IF xm%>ADD(xp%,32) AND xm%<ADD(xp%,39)
  10847.         flag_fin!=TRUE
  10848.       ENDIF
  10849.     ENDIF
  10850.     IF GEMDOS(11)<>0
  10851.       k%=SHR(GEMDOS(7),16) AND 255
  10852.       GOSUB vide_buffer_clavier
  10853.       SELECT k%
  10854.       CASE 1,28,114
  10855.         flag_fin!=TRUE
  10856.       CASE 75
  10857.         IF page%>0
  10858.           GOSUB cadre_texte2("PREVIOUS PAGE",xp%,ADD(yp%,152),32,1)
  10859.           DEC page%
  10860.           GOSUB aff_helppage(page%,xp%,yp%)
  10861.           GOSUB cadre_texte("PREVIOUS PAGE",xp%,ADD(yp%,152),32)
  10862.         ENDIF
  10863.       CASE 77
  10864.         IF page%<help_pmax%
  10865.           GOSUB cadre_texte2("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32,1)
  10866.           INC page%
  10867.           GOSUB aff_helppage(page%,xp%,yp%)
  10868.           GOSUB cadre_texte("NEXT PAGE",ADD(xp%,39),ADD(yp%,152),32)
  10869.         ENDIF
  10870.       ENDSELECT
  10871.     ENDIF
  10872.   UNTIL flag_fin!
  10873.   GOSUB cadre_texte2("EXIT",ADD(xp%,33),ADD(yp%,152),5,1)
  10874.   GOSUB wait_mouse(TRUE)
  10875.   GOSUB cadre_texte("EXIT",ADD(xp%,33),ADD(yp%,152),5)
  10876.   GOSUB affiche_panneau_principal
  10877.   GOSUB aff_message("GRAOUMF TRACKER v"+STR$(gtk_version%/10000)+mes_registred$)
  10878. RETURN
  10879. PROCEDURE aff_helppage(page%,xp%,yp%)
  10880.   LOCAL j%
  10881.   GOSUB cadre_int(xp%,yp%,71,151,8,8,9,8)
  10882.   GOSUB affiche_one_graoumf_logo(ADD(SHL(xp%,3),128),ADD(yp%,16))
  10883.   FOR j%=0 TO 23
  10884.     GOSUB affchaine_trans(help$(j%,page%),SHL(SUCC(xp%),1),ADD(ADD(yp%,4),MUL(j%,6)),10)
  10885.   NEXT j%
  10886. RETURN
  10887. PROCEDURE prefs                         !!!
  10888.   GOSUB cadre_int(2,16,75,167,9,9,10,8)
  10889.   ~GEMDOS(7)
  10890.   GOSUB affiche_panneau_principal
  10891. RETURN
  10892. PROCEDURE clear_mem(aaaa%,llll%)
  10893.   ' Vide une partie de la memoire (methode rapide en GfA)
  10894.   ' aaaa% = adresse, llll% = longueur
  10895.   ' Ne fait rien si longueur <= 0
  10896.   LOCAL l_clr%
  10897.   ~FRE(0)
  10898.   IF llll%>0
  10899.     l_clr%=1
  10900.     BYTE{aaaa%}=0                               ! Efface le premier octet
  10901.     WHILE l_clr%<=SHR(llll%,1)                  ! Efface au moins la moitie du
  10902.       BMOVE aaaa%,ADD(aaaa%,l_clr%),l_clr%      ! buffer par doublages successifs
  10903.       ADD l_clr%,l_clr%                         ! de la surface effacee
  10904.     WEND
  10905.     BMOVE aaaa%,ADD(aaaa%,l_clr%),SUB(llll%,l_clr%)     ! Le reste
  10906.   ENDIF
  10907. RETURN
  10908. PROCEDURE snapshot
  10909.   ' Effectue un snapshot de l'ecran au format TGA
  10910.   LOCAL a%,c1%,c2%,c3%,i%,j%,x1%,x2%,y1%,y2%
  10911.   LOCAL km%,xm%,ym%
  10912.   LOCAL a$,b$,c1$,c2$,c3$,header$,n$
  10913.   '
  10914.   ' Prend le morceau de l'ecran a capturer
  10915.   '
  10916.   SHOWM
  10917.   REPEAT
  10918.     MOUSE xm%,ym%,km%
  10919.   UNTIL km%<>0
  10920.   x1%=xm%
  10921.   y1%=ym%
  10922.   GOSUB wait_mouse(TRUE)
  10923.   REPEAT
  10924.     MOUSE xm%,ym%,km%
  10925.   UNTIL km%<>0
  10926.   a%=MIN(x1%,xm%)
  10927.   x2%=MAX(x1%,xm%)
  10928.   x1%=a%
  10929.   a%=MIN(y1%,ym%)
  10930.   y2%=MAX(y1%,ym%)
  10931.   y1%=a%
  10932.   INC snapshot_number%                          ! Nouveau snapshot
  10933.   '
  10934.   ' Le nom
  10935.   '
  10936.   a%=snapshot_number%
  10937.   n$=""
  10938.   FOR i%=1 TO 4
  10939.     n$=RIGHT$(STR$(a%),1)+n$
  10940.     DIV a%,10
  10941.   NEXT i%
  10942.   n$=npath_div$+"SNAP"+n$+".TGA"
  10943.   OPEN "o",#1,n$
  10944.   IF snapshot_format%=0
  10945.     '
  10946.     ' Format TGA 16 couleurs avec palette
  10947.     '
  10948.     ' --- Le header ---
  10949.     header$=CHR$(0)+CHR$(1)+CHR$(1)
  10950.     header$=header$+MKI$(0)+MKI$(16)+CHR$(24)
  10951.     header$=header$+MKI$(0)+MKI$(0)
  10952.     header$=header$+MKI$(SUCC(SUB(x2%,x1%)))+MKI$(SUCC(SUB(y2%,y1%)))
  10953.     header$=header$+CHR$(4)+CHR$(&X100000)
  10954.     GOSUB intel_w(ADD(V:header$,3))
  10955.     GOSUB intel_w(ADD(V:header$,5))
  10956.     GOSUB intel_w(ADD(V:header$,8))
  10957.     GOSUB intel_w(ADD(V:header$,10))
  10958.     GOSUB intel_w(ADD(V:header$,12))
  10959.     GOSUB intel_w(ADD(V:header$,14))
  10960.     BPUT #1,V:header$,LEN(header$)
  10961.     ' --- La palette ---
  10962.     a$=""
  10963.     FOR i%=0 TO 15
  10964.       a$=a$+CHR$(PEEK(ADD(&HFFFF9803,SHL(i%,2))))
  10965.       a$=a$+CHR$(PEEK(ADD(&HFFFF9801,SHL(i%,2))))
  10966.       a$=a$+CHR$(PEEK(ADD(&HFFFF9800,SHL(i%,2))))
  10967.     NEXT i%
  10968.     BPUT #1,V:a$,LEN(a$)
  10969.     ' --- L'image ---
  10970.     a$=STRING$(SHR(ADD(SUB(x2%,x1%),2),1),0)
  10971.     FOR j%=y1% TO y2%
  10972.       a%=V:a$
  10973.       FOR i%=x1% TO x2% STEP 2
  10974.         BYTE{a%}=ADD(SHL(PTST(i%,j%),4),PTST(SUCC(i%),j%))
  10975.         INC a%
  10976.       NEXT i%
  10977.       BPUT #1,V:a$,LEN(a$)
  10978.     NEXT j%
  10979.   ELSE
  10980.     '
  10981.     ' Format TGA 24 bits
  10982.     '
  10983.     ' --- Le header ---
  10984.     header$=CHR$(0)+CHR$(0)+CHR$(2)
  10985.     header$=header$+MKI$(0)+MKI$(0)+CHR$(0)
  10986.     header$=header$+MKI$(0)+MKI$(0)
  10987.     header$=header$+MKI$(SUCC(SUB(x2%,x1%)))+MKI$(SUCC(SUB(y2%,y1%)))
  10988.     header$=header$+CHR$(24)+CHR$(&X100000)
  10989.     GOSUB intel_w(ADD(V:header$,3))
  10990.     GOSUB intel_w(ADD(V:header$,5))
  10991.     GOSUB intel_w(ADD(V:header$,8))
  10992.     GOSUB intel_w(ADD(V:header$,10))
  10993.     GOSUB intel_w(ADD(V:header$,12))
  10994.     GOSUB intel_w(ADD(V:header$,14))
  10995.     BPUT #1,V:header$,LEN(header$)
  10996.     ' --- L'image ---
  10997.     c1$=""
  10998.     c2$=""
  10999.     c3$=""
  11000.     FOR i%=0 TO 15
  11001.       c1$=c1$+CHR$(PEEK(ADD(&HFFFF9803,SHL(i%,2))))
  11002.       c2$=c2$+CHR$(PEEK(ADD(&HFFFF9801,SHL(i%,2))))
  11003.       c3$=c3$+CHR$(PEEK(ADD(&HFFFF9800,SHL(i%,2))))
  11004.     NEXT i%
  11005.     a$=STRING$(MUL(SUCC(SUB(x2%,x1%)),3),0)
  11006.     b$=""
  11007.     FOR j%=y1% TO y2%
  11008.       a%=V:a$
  11009.       c1%=V:c1$
  11010.       c2%=V:c2$
  11011.       c3%=V:c3$
  11012.       FOR i%=x1% TO x2%
  11013.         b%=PTST(i%,j%)
  11014.         BYTE{a%}=BYTE{ADD(c1%,b%)}
  11015.         INC a%
  11016.         BYTE{a%}=BYTE{ADD(c2%,b%)}
  11017.         INC a%
  11018.         BYTE{a%}=BYTE{ADD(c3%,b%)}
  11019.         INC a%
  11020.       NEXT i%
  11021.       b$=b$+a$
  11022.       IF LEN(b$)>SUB(32700,LEN(a$)) OR j%=y2%
  11023.         BPUT #1,V:b$,LEN(b$)
  11024.         b$=""
  11025.       ENDIF
  11026.     NEXT j%
  11027.   ENDIF
  11028.   CLOSE #1
  11029. RETURN
  11030. PROCEDURE rec_result(a$,crlf!)
  11031.   ' Enregistre une chaine dans le fichier resultat.
  11032.   ' Ecran pour l'instant.
  11033.   IF NOT flag_autoload!
  11034.     PRINT a$;
  11035.     IF crlf!
  11036.       PRINT
  11037.     ENDIF
  11038.   ENDIF
  11039. RETURN
  11040. PROCEDURE decale_sample(i%,nbs%,adi%)
  11041.   ' adi$ commence au sample 1 et contient des adresses
  11042.   LOCAL a%,b%,c%,d%,j%,pt%
  11043.   a%=FN length(i%)
  11044.   d%=FN adresse(i%)
  11045.   b%=ADD(a%,d%)
  11046.   pt%=LONG{ADD(adi%,SHL(PRED(i%),2))}
  11047.   IF a%>0
  11048.     j%=i%                       ! Scanne les samples suivants
  11049.     WHILE j%<nbs%
  11050.       c%=LONG{ADD(adi%,SHL(j%,2))}
  11051.       EXIT IF c%<b% AND c%>d%
  11052.       INC j%
  11053.     WEND
  11054.     IF j%<nbs% OR flag_keep_buffer!     ! On a trouve un sample qui va se faire ecraser alors on tourne
  11055.       GOSUB mem_rotation(d%,SUB(ADD(pt%,a%),d%),a%)
  11056.       IF i%<nbs%                        ! Repositionne les samples qui etaient avant celui-la
  11057.         FOR j%=SHL(i%,2) TO SHL(PRED(nbs%),2) STEP 4
  11058.           IF LONG{ADD(adi%,j%)}<pt%
  11059.             LONG{ADD(adi%,j%)}=ADD(LONG{ADD(adi%,j%)},a%)
  11060.           ENDIF
  11061.         NEXT j%
  11062.       ENDIF
  11063.       ADD translate%,a%
  11064.     ELSE                        ! Pas de probleme, on effectue une simple copie et un deplacement du reste
  11065.       IF i%<255
  11066.         ~C:g_bmove%(L:d%,L:b%,L:SUB(FN adr_buffer,d%))
  11067.       ENDIF
  11068.       ~C:g_bmove%(L:pt%,L:d%,L:a%)
  11069.     ENDIF
  11070.     IF i%<255                   ! Reajuste les adresses des samples suivants
  11071.       FOR j%=SHL(SUCC(i%),2) TO &H3FC STEP 4
  11072.         LONG{ADD(r_adr_sample%,j%)}=ADD(LONG{ADD(r_adr_sample%,j%)},a%)
  11073.       NEXT j%
  11074.     ENDIF
  11075.   ENDIF
  11076. RETURN
  11077. PROCEDURE next_line
  11078.   SELECT line_step%
  11079.   CASE -255 TO 255
  11080.     ADD posligne%,line_step%
  11081.   CASE 256
  11082.     GOSUB cherche_next_line(&HFFFFFFFF,&HFF)
  11083.   CASE 257
  11084.     GOSUB cherche_next_line(&HFF000000,&H0)
  11085.   CASE 258
  11086.     GOSUB cherche_next_line(&HFFFF,&H0)
  11087.   CASE 259
  11088.     GOSUB cherche_next_line(&H0,&HFF)
  11089.   ENDSELECT
  11090.   WHILE posligne%=>FN nbr_lines3
  11091.     SUB posligne%,FN nbr_lines3
  11092.   WEND
  11093.   WHILE posligne%<0
  11094.     ADD posligne%,FN nbr_lines3
  11095.   WEND
  11096.   GOSUB affiche_c_pattern
  11097. RETURN
  11098. PROCEDURE cherche_next_line(mask1%,mask2%)
  11099.   LOCAL a%,b%,adr%,start%,ligne%
  11100.   start%=posligne%
  11101.   ligne%=start%
  11102.   REPEAT
  11103.     ligne%=SUCC(ligne%) MOD FN nbr_lines3
  11104.     adr%=FN adr_strk(songpos%,ligne%,preset&(curs_col%,n_preset%))
  11105.     a%=LONG{adr%} AND mask1%
  11106.     b%=BYTE{ADD(adr%,4)} AND mask2%
  11107.   UNTIL a%<>0 OR b%<>0 OR ligne%=start%
  11108.   posligne%=ligne%
  11109. RETURN
  11110. PROCEDURE curseur_a_gauche
  11111.   DEC curs_x%
  11112.   IF curs_x%<0
  11113.     curs_x%=VAL(MID$("268",SUCC(type_affpiste%),1))
  11114.     DEC curs_col%
  11115.     IF curs_col%<0
  11116.       curs_col%=PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  11117.     ENDIF
  11118.   ENDIF
  11119.   GOSUB affiche_c_pattern
  11120. RETURN
  11121. PROCEDURE curseur_a_droite
  11122.   INC curs_x%
  11123.   IF curs_x%>VAL(MID$("268",SUCC(type_affpiste%),1))
  11124.     curs_x%=0
  11125.     INC curs_col%
  11126.     IF curs_col%>PRED(MIN(nbr_colonnes%(n_preset%),nbr_col%))
  11127.       curs_col%=0
  11128.     ENDIF
  11129.   ENDIF
  11130.   GOSUB affiche_c_pattern
  11131. RETURN
  11132. PROCEDURE edit_mode_on
  11133.   edit%=1
  11134.   CARD{r_current_edit_mode%}=1
  11135. RETURN
  11136. PROCEDURE edit_mode_off
  11137.   edit%=0
  11138.   CARD{r_current_edit_mode%}=0
  11139. RETURN
  11140. PROCEDURE play_pattern_bidon
  11141.   DPOKE r_mod_songrep%,1
  11142.   DPOKE r_mod_songlen%,2
  11143.   DPOKE r_mod_songpos%,0
  11144.   DPOKE r_mod_numpat%,256
  11145.   DPOKE r_mod_patrep%,0
  11146.   LPOKE r_adr_module%,V:module_bidon%(0)
  11147.   LPOKE r_adr_song%,V:song_bidon%(0)
  11148.   DPOKE r_mod_linepos%,0
  11149.   DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  11150. RETURN
  11151. PROCEDURE play_song(a!)
  11152.   GOSUB play_song2(a!)
  11153.   GOSUB aff_ps_pp_e
  11154.   GOSUB aff_message("Playing song...")
  11155. RETURN
  11156. PROCEDURE play_song2(a!)
  11157.   LOCAL old_play_mode%
  11158.   old_play_mode%=play%
  11159.   IF old_play_mode%=0 OR (NOT a!)
  11160.     GOSUB stop_voices
  11161.     play%=1
  11162.     CARD{r_current_play_mode%}=1
  11163.     LPOKE r_adr_module%,V:module&(0)
  11164.     LPOKE r_adr_song%,V:song&(0)
  11165.     DPOKE r_mod_songrep%,module&(102)
  11166.     DPOKE r_mod_songlen%,module&(101)
  11167.     DPOKE r_mod_songpos%,songpos%
  11168.     DPOKE r_mod_numpat%,song&(songpos%)
  11169.     IF a!
  11170.       DPOKE r_mod_linepos%,posligne%
  11171.     ELSE
  11172.       DPOKE r_mod_linepos%,0
  11173.     ENDIF
  11174.     DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  11175.     debut_temps%=TIMER
  11176.   ELSE
  11177.     play%=1
  11178.     CARD{r_current_play_mode%}=1
  11179.     LPOKE r_adr_module%,V:module&(0)
  11180.     LPOKE r_adr_song%,V:song&(0)
  11181.     DPOKE r_mod_songrep%,module&(102)
  11182.     DPOKE r_mod_songlen%,module&(101)
  11183.   ENDIF
  11184.   IF edit%=0
  11185.     SLPOKE &HFFFF983C,&HE00000  ! Vert
  11186.   ENDIF
  11187. RETURN
  11188. PROCEDURE play_pattern(a!)
  11189.   LOCAL old_play_mode%
  11190.   old_play_mode%=play%
  11191.   IF old_play_mode%=0 OR (NOT a!)
  11192.     GOSUB stop_voices
  11193.     play%=2
  11194.     CARD{r_current_play_mode%}=2
  11195.     LPOKE r_adr_module%,V:module&(0)
  11196.     LPOKE r_adr_song%,V:song&(0)
  11197.     DPOKE r_mod_songrep%,songpos%
  11198.     DPOKE r_mod_songlen%,SUCC(songpos%)
  11199.     DPOKE r_mod_songpos%,songpos%
  11200.     DPOKE r_mod_numpat%,song&(songpos%)
  11201.     IF a!
  11202.       DPOKE r_mod_linepos%,posligne%
  11203.     ELSE
  11204.       DPOKE r_mod_linepos%,0
  11205.     ENDIF
  11206.     DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  11207.     debut_temps%=TIMER
  11208.   ELSE
  11209.     play%=2
  11210.     CARD{r_current_play_mode%}=2
  11211.     LPOKE r_adr_module%,V:module&(0)
  11212.     LPOKE r_adr_song%,V:song&(0)
  11213.     DPOKE r_mod_songrep%,songpos%
  11214.     DPOKE r_mod_songlen%,SUCC(songpos%)
  11215.   ENDIF
  11216.   GOSUB aff_ps_pp_e
  11217.   GOSUB aff_message("Playing pattern...")
  11218.   IF edit%=0
  11219.     SLPOKE &HFFFF983C,&HFF800000  ! Jaune
  11220.   ENDIF
  11221. RETURN
  11222. PROCEDURE stop_voices
  11223.   LOCAL i%
  11224.   FOR i%=0 TO PRED(nbr_track%)
  11225.     LONG{ADD(V:pattern_bidon%(8),MUL(i%,5))}=0
  11226.   NEXT i%
  11227.   CARD{r_current_play_mode%}=0
  11228.   GOSUB play_pattern_bidon
  11229.   DPOKE r_flag_stop_voices%,1
  11230.   play%=0
  11231.   IF edit%=0
  11232.     SLPOKE &HFFFF983C,&HFFFF00FF  ! Blanc
  11233.   ELSE
  11234.     SLPOKE &HFFFF983C,&HFF        ! Bleu
  11235.   ENDIF
  11236.   REPEAT
  11237.   UNTIL DPEEK(r_flag_stop_voices%)=0
  11238. RETURN
  11239. PROCEDURE stop_edit
  11240.   IF play%<>0
  11241.     IF play%=1
  11242.       GOSUB aff_message("Song stopped.")
  11243.     ELSE
  11244.       GOSUB aff_message("Pattern stopped.")
  11245.     ENDIF
  11246.     GOSUB stop_voices
  11247.     GOSUB edit_mode_off
  11248.     SLPOKE &HFFFF983C,&HFFFF00FF                ! Blanc
  11249.     IF NOT flag_cpu_display!
  11250.       GOSUB cadre_int(75,140,3,7,9,9,9,9)       ! Efface le temps machine si on ne le demande pas en mode Stop
  11251.     ENDIF
  11252.   ELSE
  11253.     GOSUB stop_voices
  11254.     IF edit%=0
  11255.       GOSUB edit_mode_on
  11256.       SLPOKE &HFFFF983C,&HFF                    ! Bleu
  11257.       GOSUB aff_message("Edit mode activated.")
  11258.     ELSE
  11259.       GOSUB edit_mode_off
  11260.       SLPOKE &HFFFF983C,&HFFFF00FF              ! Blanc
  11261.       GOSUB aff_message("Edit mode deactivated.")
  11262.     ENDIF
  11263.   ENDIF
  11264.   GOSUB aff_ps_pp_e
  11265. RETURN
  11266. PROCEDURE kill_sample(s%)
  11267.   GOSUB stop_voices
  11268.   GOSUB chg_taille_sample(s%,0)
  11269.   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)
  11270.   BMOVE V:a$,FN adrsamchk(s%),64
  11271. RETURN
  11272. PROCEDURE clear_patterns2
  11273.   ' Se contente de reduire les patterns a leur taille minimum
  11274.   LOCAL a%,b%,c%,i%,a$
  11275.   c%=1                                          ! 1 seule ligne pour tous les patterns vides
  11276.   b%=FN zone_start
  11277.   a%=ADD(MUL(MUL(c%,nbr_track%),5),32)
  11278.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(c%)+MKI$(nbr_track%)
  11279.   FOR i%=0 TO 255
  11280.     CARD{ADD(V:a$,8)}=i%
  11281.     BMOVE V:a$,b%,LEN(a$)
  11282.     GOSUB chg_pat_chunkadr(i%,b%)
  11283.     ADD b%,a%
  11284.   NEXT i%
  11285.   bl_start&=0
  11286.   bl_end&=0
  11287.   bl_pat&=0
  11288. RETURN
  11289. PROCEDURE clear_patterns
  11290.   LOCAL i%
  11291.   GOSUB clear_patterns2
  11292.   FOR i%=0 TO 255
  11293.     GOSUB clear_mem(FN adr_pat(i%),MUL(MUL(FN nbr_track(i%),FN nbr_lines(i%)),5))
  11294.   NEXT i%
  11295.   GOSUB garbage_collection
  11296. RETURN
  11297. PROCEDURE clear_song(flag!)
  11298.   ' Efface la song et les patterns
  11299.   ' Si flag! est faux, songname n'est pas efface
  11300.   LOCAL a%,b%,i%
  11301.   GOSUB stop_voices
  11302.   ARRAYFILL song&(),0
  11303.   GOSUB clear_patterns
  11304.   IF flag!
  11305.     FOR i%=2 TO 97
  11306.       module&(i%)=&H2020
  11307.     NEXT i%
  11308.   ENDIF
  11309.   module&(101)=1
  11310.   module&(102)=0
  11311.   songpos%=0
  11312. RETURN
  11313. PROCEDURE clear_samples
  11314.   ' Efface les samples
  11315.   GOSUB stop_voices
  11316.   GOSUB clear_samples2
  11317.   sample%=1
  11318. RETURN
  11319. PROCEDURE clear_samples2
  11320.   LOCAL i%,j%,a$
  11321.   j%=ADD(FN env_chunkadr(63,2),FN env_chunklen(63,2))
  11322.   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)
  11323.   FOR i%=0 TO 255
  11324.     LONG{ADD(r_adr_sample%,SHL(i%,2))}=ADD(j%,MUL(i%,64))
  11325.     BMOVE V:a$,LONG{ADD(r_adr_sample%,SHL(i%,2))},64
  11326.     CARD{ADD(LONG{ADD(r_adr_sample%,SHL(i%,2))},8)}=i%
  11327.   NEXT i%
  11328.   GOSUB garbage_collection
  11329. RETURN
  11330. PROCEDURE clear_instr
  11331.   ' Efface les instruments (seulement les instr+env, pas les samples)
  11332.   LOCAL a%,b%,i%,j%
  11333.   FOR i%=0 TO 255
  11334.     instrset%(0,i%)=&H494E5354                  ! 'INST'
  11335.     instrset%(1,i%)=316                         ! Taille du chunk
  11336.     instrset%(2,i%)=ADD(SHL(i%,16),&H2020)      ! Numero + Nom
  11337.     FOR j%=3 TO 8
  11338.       instrset%(j%,i%)=&H20202020               ! Nom
  11339.     NEXT j%
  11340.     instrset%(9,i%)=&H20200000                  ! Nom + Type (sample)
  11341.     instrset%(10,i%)=&H100FFFF                  ! Volume + Autobalance
  11342.     instrset%(11,i%)=0                          ! Enveloppe volume + tonalite
  11343.     instrset%(12,i%)=0                          ! Enveloppe panning + reserve
  11344.     instrset%(13,i%)=0                          ! Reserve
  11345.     instrset%(14,i%)=0                          ! Reserve
  11346.     instrset%(15,i%)=SHL(i%,8)
  11347.     a%=ADD(SHL(i%,24),SHL(i%,8))
  11348.     b%=V:instrset%(16,i%)
  11349.     LONG{b%}=a%
  11350.     BMOVE b%,ADD(b%,4),4                        ! Remplit 252 octets avec le meme mot
  11351.     BMOVE b%,ADD(b%,8),8
  11352.     BMOVE b%,ADD(b%,16),16
  11353.     BMOVE b%,ADD(b%,32),32
  11354.     BMOVE b%,ADD(b%,64),64
  11355.     BMOVE b%,ADD(b%,128),124
  11356.   NEXT i%
  11357.   GOSUB clear_enveloppes
  11358. RETURN
  11359. PROCEDURE clear_enveloppes
  11360.   ' Efface les enveloppes de volume, tonalite et panning
  11361.   ' Dans la mem, les env sont rangees dans cet ordre : V T P  V T P  V T P...
  11362.   LOCAL i%,a%,deb%
  11363.   deb%=ADD(FN adr_patchunk(255),FN lon_patchunk(255))
  11364.   FOR i%=0 TO 63
  11365.     a%=ADD(deb%,MUL(i%,102))
  11366.     LONG{a%}=&H56454E56         ! 'VENV'
  11367.     LONG{ADD(a%,4)}=34
  11368.     CARD{ADD(a%,8)}=i%
  11369.     LONG{ADD(a%,10)}=&H20202020
  11370.     LONG{ADD(a%,14)}=&H20202020
  11371.     LONG{ADD(a%,18)}=&H20202020
  11372.     LONG{ADD(a%,22)}=&H20202020
  11373.     LONG{ADD(a%,26)}=&H20202020
  11374.     LONG{ADD(a%,30)}=&H10000
  11375.     GOSUB chg_env_chunkadr(i%,0,a%)
  11376.     a%=ADD(ADD(deb%,34),MUL(i%,102))
  11377.     LONG{a%}=&H54454E56         ! 'TENV'
  11378.     LONG{ADD(a%,4)}=34
  11379.     CARD{ADD(a%,8)}=i%
  11380.     LONG{ADD(a%,10)}=&H20202020
  11381.     LONG{ADD(a%,14)}=&H20202020
  11382.     LONG{ADD(a%,18)}=&H20202020
  11383.     LONG{ADD(a%,22)}=&H20202020
  11384.     LONG{ADD(a%,26)}=&H20202020
  11385.     LONG{ADD(a%,30)}=&H10000
  11386.     GOSUB chg_env_chunkadr(i%,1,a%)
  11387.     a%=ADD(ADD(deb%,68),MUL(i%,102))
  11388.     LONG{a%}=&H50454E56         ! 'PENV'
  11389.     LONG{ADD(a%,4)}=34
  11390.     CARD{ADD(a%,8)}=i%
  11391.     LONG{ADD(a%,10)}=&H20202020
  11392.     LONG{ADD(a%,14)}=&H20202020
  11393.     LONG{ADD(a%,18)}=&H20202020
  11394.     LONG{ADD(a%,22)}=&H20202020
  11395.     LONG{ADD(a%,26)}=&H20202020
  11396.     LONG{ADD(a%,30)}=&H10000
  11397.     GOSUB chg_env_chunkadr(i%,2,a%)
  11398.   NEXT i%
  11399.   env_poscurs&=0
  11400.   env_posaff&=0
  11401.   GOSUB garbage_collection
  11402. RETURN
  11403. PROCEDURE garbage_collection
  11404.   ' Regroupe les patterns, enveloppes et samples
  11405.   ' dans cet ordre, en bas de la memoire.
  11406.   ' garbage% aurorise la manipulation de chaque type de chunk
  11407.   LOCAL i%,j%,na%,oa%,l%
  11408.   ' Les patterns
  11409.   IF garbage%>0
  11410.     FOR i%=0 TO 255
  11411.       oa%=FN adr_patchunk(i%)
  11412.       IF i%>0
  11413.         na%=ADD(FN adr_patchunk(PRED(i%)),FN lon_patchunk(PRED(i%)))
  11414.       ELSE
  11415.         na%=FN zone_start
  11416.       ENDIF
  11417.       IF oa%<>na%
  11418.         l%=FN lon_patchunk(i%)
  11419.         GOSUB chg_pat_chunkadr(i%,na%)
  11420.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  11421.       ENDIF
  11422.     NEXT i%
  11423.   ENDIF
  11424.   ' Les enveloppes
  11425.   IF garbage%>1
  11426.     FOR i%=0 TO 191
  11427.       oa%=FN env_chunkadr(DIV(i%,3),i% MOD 3)
  11428.       IF i%>0
  11429.         na%=ADD(FN env_chunkadr(DIV(PRED(i%),3),PRED(i%) MOD 3),FN env_chunklen(DIV(PRED(i%),3),PRED(i%) MOD 3))
  11430.       ELSE
  11431.         na%=ADD(FN adr_patchunk(255),FN lon_patchunk(255))
  11432.       ENDIF
  11433.       IF oa%<>na%
  11434.         l%=FN env_chunklen(DIV(i%,3),i% MOD 3)
  11435.         GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,na%)
  11436.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  11437.       ENDIF
  11438.     NEXT i%
  11439.   ENDIF
  11440.   ' Les samples
  11441.   IF garbage%>2
  11442.     FOR i%=0 TO 255
  11443.       oa%=FN adrsamchk(i%)
  11444.       IF i%>0
  11445.         na%=ADD(FN adrsamchk(PRED(i%)),FN lonsamchk(PRED(i%)))
  11446.       ELSE
  11447.         na%=ADD(FN env_chunkadr(63,2),FN env_chunklen(63,2))
  11448.       ENDIF
  11449.       IF oa%<>na%
  11450.         l%=FN lonsamchk(i%)
  11451.         GOSUB chg_sam_chunkadr(i%,na%)
  11452.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  11453.       ENDIF
  11454.     NEXT i%
  11455.   ENDIF
  11456. RETURN
  11457. PROCEDURE create_space_patchunk(p%,t%,l%,flag!)
  11458.   ' Demenage la memoire pour obtenir un pattern de t% tracks, l% lignes
  11459.   ' Le header du chunk est modifie mais pas les donnees du pattern
  11460.   ' Si flag! n'est pas mis, seulement les patterns seront deplaces (on devra
  11461.   ' avoir verifie que la place pour cette operation a bien ete inseree entre
  11462.   ' les patterns et les enveloppes).
  11463.   LOCAL a%,b%,c%,i%,oldlen%,newlen%,dif%
  11464.   IF p%<255
  11465.     oldlen%=SUB(FN adr_patchunk(SUCC(p%)),FN adr_patchunk(p%))
  11466.   ELSE
  11467.     oldlen%=SUB(FN env_chunkadr(0,0),FN adr_patchunk(p%))
  11468.   ENDIF
  11469.   newlen%=ADD(MUL(MUL(t%,l%),5),32)
  11470.   dif%=SUB(newlen%,oldlen%)
  11471.   IF dif%<>0
  11472.     a%=ADD(FN adr_patchunk(p%),oldlen%)
  11473.     b%=ADD(FN adr_patchunk(p%),newlen%)
  11474.     c%=SUB(FN adr_buffer,a%)
  11475.     IF p%<255
  11476.       FOR i%=SUCC(p%) TO 255                      ! Change les adresses des patterns
  11477.         GOSUB chg_pat_chunkadr(i%,ADD(FN adr_patchunk(i%),dif%))
  11478.       NEXT i%
  11479.     ENDIF
  11480.     IF flag!
  11481.       FOR i%=0 TO 191                             ! Change les adresses des enveloppes
  11482.         GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),dif%))
  11483.       NEXT i%
  11484.       FOR i%=0 TO 255                             ! Change les adresses des samples
  11485.         GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  11486.       NEXT i%
  11487.     ENDIF
  11488.     IF flag!
  11489.       ~C:g_bmove%(L:a%,L:b%,L:c%)
  11490.     ELSE IF p%<255
  11491.       ~C:g_bmove%(L:a%,L:b%,L:SUB(FN env_chunkadr(0,0),MAX(a%,b%)))
  11492.     ENDIF
  11493.   ENDIF
  11494.   GOSUB chg_pat_chunklen(p%,newlen%)
  11495.   GOSUB chg_pat_nbr_lines(p%,l%)
  11496.   GOSUB chg_pat_nbr_track(p%,t%)
  11497. RETURN
  11498. PROCEDURE create_space_multipatchunk(map$,nbp%,flag!)
  11499.   ' Comme ci-dessus mais pour plusieurs patterns (0...nbp%-1)
  11500.   ' map$ contient (NbTi.w,NbLi.w), i de 0 a nbp%-1
  11501.   ' Tous les chunks sont bien deplaces
  11502.   ' Si flag! est mis, les nouveaux patterns crees sont nettoyes
  11503.   LOCAL a%,b%,c%,d%,i%,dif%
  11504.   LOCAL a$
  11505.   ' Calcul de la place occupee par ces nouveaux patterns
  11506.   a%=0
  11507.   FOR i%=0 TO PRED(nbp%)
  11508.     ADD a%,ADD(MUL(MUL(CARD{ADD(V:map$,SHL(i%,2))},CARD{ADD(V:map$,ADD(SHL(i%,2),2))}),5),32)
  11509.   NEXT i%
  11510.   IF nbp%<256
  11511.     dif%=SUB(ADD(FN zone_start,a%),FN adr_patchunk(nbp%))
  11512.     ~C:g_bmove%(L:FN adr_patchunk(nbp%),L:ADD(FN zone_start,a%),L:SUB(FN adr_buffer,FN adr_patchunk(nbp%)))
  11513.     FOR i%=nbp% TO 255                            ! Change les adresses des patterns suivants
  11514.       GOSUB chg_pat_chunkadr(i%,ADD(FN adr_patchunk(i%),dif%))
  11515.     NEXT i%
  11516.     FOR i%=0 TO 191                               ! Change les adresses des enveloppes
  11517.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),dif%))
  11518.     NEXT i%
  11519.     FOR i%=0 TO 255                               ! Change les adresses des samples
  11520.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  11521.     NEXT i%
  11522.   ELSE
  11523.     GOSUB create_space_for_patterns(SUB(a%,SUB(FN env_chunkadr(0,0),FN zone_start)))
  11524.   ENDIF
  11525.   ' Creation des nouveaux chunks a la bonne taille
  11526.   b%=FN zone_start
  11527.   FOR i%=0 TO PRED(nbp%)
  11528.     c%=CARD{ADD(V:map$,SHL(i%,2))}
  11529.     d%=CARD{ADD(V:map$,ADD(SHL(i%,2),2))}
  11530.     a%=ADD(MUL(MUL(c%,d%),5),32)
  11531.     a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(d%)+MKI$(c%)
  11532.     CARD{ADD(V:a$,8)}=i%
  11533.     BMOVE V:a$,b%,LEN(a$)
  11534.     GOSUB chg_pat_chunkadr(i%,b%)
  11535.     IF flag!
  11536.       GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  11537.     ENDIF
  11538.     ADD b%,a%
  11539.   NEXT i%
  11540. RETURN
  11541. PROCEDURE create_space_for_patterns(l%)
  11542.   ' Deplace les chunks des enveloppes et des samples de facon a laisser
  11543.   ' l% octets en plus pour les patterns.
  11544.   LOCAL a%,b%,c%,i%
  11545.   IF l%>0
  11546.     a%=FN env_chunkadr(0,0)
  11547.     b%=ADD(a%,l%)
  11548.     c%=SUB(FN adr_buffer,a%)
  11549.     FOR i%=0 TO 191                               ! Change les adresses des enveloppes
  11550.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),l%))
  11551.     NEXT i%
  11552.     FOR i%=0 TO 255                               ! Change les adresses des samples
  11553.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),l%))
  11554.     NEXT i%
  11555.     ~C:g_bmove%(L:a%,L:b%,L:c%)
  11556.   ENDIF
  11557. RETURN
  11558. PROCEDURE change_pattern_high(p%,l%)
  11559.   LOCAL ol%
  11560.   ol%=FN nbr_lines(p%)
  11561.   GOSUB create_space_patchunk(p%,nbr_track%,l%,TRUE)
  11562.   IF l%>ol%
  11563.     GOSUB clear_mem(FN adr_line(p%,ol%),MUL(MUL(nbr_track%,SUB(l%,ol%)),5))
  11564.   ENDIF
  11565.   IF p%=bl_pat&
  11566.     bl_end&=MIN(bl_end&,PRED(l%))
  11567.     bl_start&=MIN(bl_start&,bl_end&)
  11568.   ENDIF
  11569. RETURN
  11570. PROCEDURE change_format(t%)
  11571.   LOCAL bouton%,a$,a%
  11572.   a$="DO YOU REALLY WANT TO CHANGE THE|PATTERN SIZE TO "+STR$(t%)+" TRACKS ?"
  11573.   IF t%<nbr_track%
  11574.     a$=a$+"|"+STR$(SUB(nbr_track%,t%))+" TRACK(S) WILL BE LOST"
  11575.     a$=a$+"||1. New song|2. Try to keep the song|3. Abort the operation"
  11576.   ENDIF
  11577.   GOSUB dialog("CHANGE NUMBER OF TRACKS",a$,"NEW|KEEP|CANCEL",xm%,ym%)
  11578.   IF bouton%=0
  11579.     GOSUB aff_message("WAITING : CONVERTING...")
  11580.     GOSUB bee(TRUE)
  11581.     GOSUB new_pattern_format(t%)
  11582.   ELSE IF bouton%=1
  11583.     GOSUB aff_message("WAITING : CONVERTING...")
  11584.     GOSUB bee(TRUE)
  11585.     GOSUB chg_pattern_format(t%)
  11586.   ENDIF
  11587.   GOSUB bee(FALSE)
  11588.   GOSUB affiche_info_song
  11589.   GOSUB affiche_info_preset
  11590. RETURN
  11591. PROCEDURE new_pattern_format(t%)
  11592.   ' Change le nbr de voies t%, de lignes 1 et efface la chanson
  11593.   LOCAL a%,b%,i%,j%
  11594.   LOCAL a$
  11595.   GOSUB stop_voices
  11596.   GOSUB clear_patterns2
  11597.   sample%=1
  11598.   instr%=1
  11599.   songpos%=0
  11600.   posligne%=0
  11601.   curs_col%=0
  11602.   curs_x%=0
  11603.   a%=nbr_track%
  11604.   nbr_track%=t%
  11605.   module&(100)=t%
  11606.   module&(101)=1        ! Longueur song
  11607.   module&(102)=0        ! Pt de bouclage
  11608.   FOR j%=0 TO 31
  11609.     FOR i%=0 TO 31
  11610.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  11611.     NEXT i%
  11612.   NEXT j%
  11613.   GOSUB create_space_for_patterns(MUL(MUL(MAX(SUB(nbr_track%,a%),0),5),256))
  11614.   GOSUB clear_song(FALSE)
  11615.   ARRAYFILL nbr_colonnes%(),nbr_track%
  11616.   para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  11617.   module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  11618.   module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  11619.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  11620.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  11621.   b%=V:pattern_bidon%(0)
  11622.   FOR i%=256 TO 257
  11623.     CARD{ADD(V:a$,8)}=i%
  11624.     BMOVE V:a$,b%,LEN(a$)
  11625.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  11626.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  11627.     ADD b%,a%
  11628.   NEXT i%
  11629.   DPOKE r_master_vol%,DIV(&H3000,ADD(nbr_track%,3))
  11630.   DPOKE r_mod_songpos%,songpos%
  11631.   DPOKE r_mod_numpat%,song&(songpos%)
  11632.   DPOKE r_mod_speed%,6
  11633.   DPOKE r_mod_linepos%,0
  11634.   DPOKE r_mod_nbrtrack%,nbr_track%
  11635.   bl_start&=0
  11636.   bl_end&=0
  11637.   bl_trk&=0
  11638.   bl_pat&=0
  11639.   GOSUB stop_voices
  11640.   GOSUB all_track_on(FALSE)
  11641.   GOSUB balance_reset
  11642. RETURN
  11643. PROCEDURE chg_pattern_format(t%)
  11644.   ' Change le nbr de voies t% et essaie de garder la chanson
  11645.   ' Attention au format 32 piste/256 lignes, car utilisation d'une chaine de
  11646.   ' 32768 octets. Normalement pas de bug car GfA gere les chaines au mot pres
  11647.   LOCAL a%,b%,c%,d%,i%,j%,otp%
  11648.   LOCAL a$,b$
  11649.   GOSUB stop_voices
  11650.   IF t%>nbr_track%
  11651.     a%=0
  11652.     FOR i%=0 TO 255
  11653.       ADD a%,FN nbr_lines(i%)
  11654.     NEXT i%
  11655.     MUL a%,MUL(SUB(t%,nbr_track%),5)
  11656.     GOSUB create_space_for_patterns(a%)
  11657.     FOR i%=0 TO 255
  11658.       otp%=MUL(nbr_track%,FN nbr_lines(i%))
  11659.       a$=STRING$(MUL(otp%,5),0)
  11660.       BMOVE FN adr_pat(i%),V:a$,MUL(otp%,5)
  11661.       GOSUB create_space_patchunk(i%,t%,FN nbr_lines(i%),FALSE)
  11662.       GOSUB clear_mem(FN adr_pat(i%),MUL(MUL(t%,FN nbr_lines(i%)),5))
  11663.       a%=V:a$
  11664.       b%=FN adr_pat(i%)
  11665.       c%=MUL(nbr_track%,5)
  11666.       d%=MUL(t%,5)
  11667.       FOR j%=0 TO PRED(FN nbr_lines(i%))
  11668.         BMOVE a%,b%,c%
  11669.         ADD a%,c%
  11670.         ADD b%,d%
  11671.       NEXT j%
  11672.     NEXT i%
  11673.   ELSE
  11674.     FOR i%=0 TO 255
  11675.       otp%=MUL(nbr_track%,FN nbr_lines(i%))
  11676.       a$=STRING$(MUL(otp%,5),0)
  11677.       BMOVE FN adr_pat(i%),V:a$,MUL(otp%,5)
  11678.       GOSUB create_space_patchunk(i%,t%,FN nbr_lines(i%),FALSE)
  11679.       a%=V:a$
  11680.       b%=FN adr_pat(i%)
  11681.       c%=MUL(nbr_track%,5)
  11682.       d%=MUL(t%,5)
  11683.       FOR j%=0 TO PRED(FN nbr_lines(i%))
  11684.         BMOVE a%,b%,d%
  11685.         ADD a%,c%
  11686.         ADD b%,d%
  11687.       NEXT j%
  11688.     NEXT i%
  11689.   ENDIF
  11690.   GOSUB garbage_collection
  11691.   nbr_track%=t%
  11692.   module&(100)=t%
  11693.   FOR j%=0 TO 31
  11694.     FOR i%=0 TO 31
  11695.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  11696.     NEXT i%
  11697.   NEXT j%
  11698.   ARRAYFILL nbr_colonnes%(),nbr_track%
  11699.   para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  11700.   module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  11701.   module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  11702.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  11703.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  11704.   b%=V:pattern_bidon%(0)
  11705.   FOR i%=256 TO 257
  11706.     CARD{ADD(V:a$,8)}=i%
  11707.     BMOVE V:a$,b%,LEN(a$)
  11708.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  11709.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  11710.     ADD b%,a%
  11711.   NEXT i%
  11712.   curs_col%=0
  11713.   curs_x%=0
  11714.   bl_trk&=0
  11715.   bl_pat&=0
  11716.   DPOKE r_master_vol%,DIV(&H3000,ADD(nbr_track%,3))
  11717.   DPOKE r_mod_linepos%,0
  11718.   DPOKE r_mod_nbrtrack%,nbr_track%
  11719.   GOSUB stop_voices
  11720.   GOSUB all_track_on(FALSE)
  11721. RETURN
  11722. PROCEDURE chg_taille_sample(ns%,ls%)
  11723.   ' Ne teste pas s'il y a assez de place pour agrandir un sample
  11724.   ' N'utilise que les adresses des samples
  11725.   ' Ne change absolument rien aux chunks
  11726.   LOCAL olda%,newa%,lon%,i%,dif%
  11727.   ls%=ls% AND -2
  11728.   IF ns%<255
  11729.     olda%=FN adrsamchk(SUCC(ns%))
  11730.     newa%=ADD(ADD(FN adrsamchk(ns%),64),ls%)
  11731.     lon%=SUB(FN adr_buffer,olda%)
  11732.     ~C:g_bmove%(L:olda%,L:newa%,L:lon%)
  11733.     dif%=SUB(newa%,olda%)
  11734.     FOR i%=SUCC(ns%) TO 255
  11735.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  11736.     NEXT i%
  11737.     GOSUB clear_mem(ADD(newa%,lon%),-dif%)    ! Vide la fin du buffer de sample si on agrandit son espace
  11738.   ENDIF
  11739. RETURN
  11740. PROCEDURE chg_type_affpiste(n%)
  11741.   IF n%=0
  11742.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),6),32)    ! Nombre de pistes affichables sans volume ni effet
  11743.   ELSE IF n%=2
  11744.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),12),32)   ! Nombre de pistes affichables avec volume
  11745.   ELSE
  11746.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),10),32)   ! Nombre de pistes affichables sans volume
  11747.   ENDIF
  11748.   type_affpiste%=n%
  11749. RETURN
  11750. PROCEDURE chg_tempo(tempo%)
  11751.   CARD{r_mod_tempo%}=tempo%
  11752.   GOSUB chg_tempo2(tempo%)
  11753. RETURN
  11754. PROCEDURE chg_tempo2(tempo%)
  11755.   ' Change simplement la duree d'un tick, mais pas la valeur du tempo
  11756.   LOCAL vblpf%,spf%
  11757.   vblpf%=0
  11758.   REPEAT
  11759.     INC vblpf%
  11760.     spf%=ROUND(CARD{r_adr_replay_frequency%}*163840/(tempo%*vblpf%))    ! $10000 * replfreq*60/6/4 / tempo
  11761.   UNTIL spf%<78643200                           ! 1200 * $10000
  11762.   LONG{r_vblsize%}=spf%
  11763.   CARD{r_vblnumber%}=vblpf%
  11764. RETURN
  11765. PROCEDURE chg_speed(speed%)
  11766.   CARD{r_mod_speed%}=speed%
  11767. RETURN
  11768. PROCEDURE chg_songpos
  11769.   IF d%=0
  11770.     GOSUB edite_chaine(HEX$(songpos%,2),ADD(divbi&(0,0,16),12),ADD(divbi&(1,0,16),2),2,1)
  11771.     songpos%=VAL("$"+bbbb$)
  11772.   ELSE
  11773.     ADD songpos%,MUL(d%,MAX(PRED(km%),1))
  11774.   ENDIF
  11775.   songpos%=MIN(MAX(songpos%,0),PRED(module&(101)))
  11776.   GOSUB affiche_info_song
  11777.   GOSUB affiche_c_pattern
  11778.   IF ss_menu%=2 AND ss_menut%=3
  11779.     GOSUB affiche_icones_toolsb3
  11780.   ENDIF
  11781.   IF play%>0
  11782.     posligne%=MIN(DPEEK(r_mod_linepos%),PRED(FN nbr_lines2(songpos%)))
  11783.     DPOKE r_mod_linepos%,posligne%
  11784.     DPOKE r_mod_songpos%,songpos%
  11785.     DPOKE r_mod_numpat%,song&(songpos%)
  11786.   ENDIF
  11787.   IF km%>0 AND km%<3 AND d%<>0
  11788.     PAUSE SUB(13,MUL(km%,5))
  11789.   ENDIF
  11790. RETURN
  11791. PROCEDURE chg_pattern
  11792.   LOCAL a%
  11793.   IF d%=0
  11794.     GOSUB edite_chaine(HEX$(song&(songpos%),2),ADD(divbi&(0,3,16),12),ADD(divbi&(1,3,16),2),2,1)
  11795.     a%=VAL("$"+bbbb$)
  11796.   ELSE
  11797.     a%=ADD(song&(songpos%),MUL(d%,MAX(PRED(km%),1)))
  11798.   ENDIF
  11799.   song&(songpos%)=MIN(MAX(a%,0),255)
  11800.   GOSUB affiche_info_song
  11801.   GOSUB affiche_c_pattern
  11802.   IF ss_menu%=2 AND ss_menut%=3
  11803.     GOSUB affiche_icones_toolsb3
  11804.   ENDIF
  11805.   IF play%>0
  11806.     posligne%=MIN(DPEEK(r_mod_linepos%),PRED(FN nbr_lines2(songpos%)))
  11807.     DPOKE r_mod_linepos%,posligne%
  11808.     DPOKE r_mod_numpat%,song&(songpos%)
  11809.   ENDIF
  11810.   IF km%<3 AND d%<>0
  11811.     PAUSE SUB(13,MUL(km%,5))
  11812.   ENDIF
  11813. RETURN
  11814. PROCEDURE chg_songlen
  11815.   LOCAL a%
  11816.   IF d%=0
  11817.     GOSUB edite_chaine(HEX$(module&(101),2),ADD(divbi&(0,6,16),12),ADD(divbi&(1,6,16),2),2,1)
  11818.     a%=VAL("$"+bbbb$)
  11819.   ELSE
  11820.     a%=ADD(module&(101),MUL(d%,MAX(PRED(km%),1)))
  11821.   ENDIF
  11822.   module&(101)=MIN(MAX(a%,SUCC(songpos%)),256)
  11823.   DPOKE r_mod_songlen%,module&(101)
  11824.   module&(102)=MIN(module&(102),PRED(module&(101)))
  11825.   DPOKE r_mod_songrep%,module&(102)
  11826.   GOSUB affiche_info_song
  11827.   IF ss_menu%=2 AND ss_menut%=3
  11828.     GOSUB affiche_icones_toolsb3
  11829.   ENDIF
  11830.   IF km%<3 AND d%<>0
  11831.     PAUSE SUB(13,MUL(km%,5))
  11832.   ENDIF
  11833. RETURN
  11834. PROCEDURE chg_songrep
  11835.   LOCAL a%
  11836.   IF d%=0
  11837.     GOSUB edite_chaine(HEX$(module&(102),2),ADD(divbi&(0,9,16),12),ADD(divbi&(1,9,16),2),2,1)
  11838.     a%=VAL("$"+bbbb$)
  11839.   ELSE
  11840.     a%=ADD(module&(102),MUL(d%,MAX(PRED(km%),1)))
  11841.   ENDIF
  11842.   module&(102)=MIN(MAX(a%,0),PRED(module&(101)))
  11843.   DPOKE r_mod_songrep%,module&(102)
  11844.   GOSUB affiche_info_song
  11845.   IF ss_menu%=2 AND ss_menut%=3
  11846.     GOSUB affiche_icones_toolsb3
  11847.   ENDIF
  11848.   IF km%<3 AND d%<>0
  11849.     PAUSE SUB(13,MUL(km%,5))
  11850.   ENDIF
  11851. RETURN
  11852. PROCEDURE chg_instrument
  11853.   IF d%=0
  11854.     GOSUB edite_chaine(HEX$(instr%,2),ADD(divbi&(0,12,16),12),ADD(divbi&(1,12,16),2),2,1)
  11855.     instr%=VAL("$"+bbbb$)
  11856.   ELSE
  11857.     ADD instr%,MUL(d%,MAX(PRED(km%),1))
  11858.   ENDIF
  11859.   instr%=MAX(MIN(instr%,255),1)
  11860.   GOSUB affiche_info_sample
  11861.   IF ss_menu%=1
  11862.     GOSUB affiche_icones_diskb
  11863.   ENDIF
  11864.   IF km%<3 AND d%<>0
  11865.     PAUSE SUB(13,MUL(km%,5))
  11866.   ENDIF
  11867. RETURN
  11868. PROCEDURE chg_sample
  11869.   IF d%=0
  11870.     GOSUB edite_chaine(HEX$(sample%,2),ADD(divbi&(0,15,16),12),ADD(divbi&(1,15,16),2),2,1)
  11871.     sample%=VAL("$"+bbbb$)
  11872.   ELSE
  11873.     ADD sample%,MUL(d%,MAX(PRED(km%),1))
  11874.   ENDIF
  11875.   sample%=MAX(MIN(sample%,255),1)
  11876.   GOSUB affiche_info_sample
  11877.   IF ss_menu%=1
  11878.     GOSUB affiche_icones_diskb
  11879.   ENDIF
  11880.   IF km%<3 AND d%<>0
  11881.     PAUSE SUB(13,MUL(km%,5))
  11882.   ENDIF
  11883. RETURN
  11884. PROCEDURE chg_linestep
  11885.   LOCAL a%
  11886.   IF d%=0
  11887.     a%=FN popup(3,4,MOUSEX,MOUSEY)
  11888.     IF a%>=0
  11889.       line_step%=a% AND &HFFFF
  11890.     ENDIF
  11891.   ELSE
  11892.     IF line_step%>-256 AND line_step%<256
  11893.       ADD line_step%,MUL(d%,MAX(PRED(km%),1))
  11894.     ELSE
  11895.       line_step%=1
  11896.     ENDIF
  11897.   ENDIF
  11898.   IF line_step%>-256 AND line_step%<256
  11899.     line_step%=MAX(MIN(line_step%,PRED(FN nbr_lines3)),-PRED(FN nbr_lines3),-15)
  11900.   ENDIF
  11901.   GOSUB affiche_info_song
  11902.   IF km%<3 AND d%<>0
  11903.     PAUSE SUB(13,MUL(km%,5))
  11904.   ENDIF
  11905. RETURN
  11906. PROCEDURE chg_s_sample
  11907.   IF flag_nvl_boucle_sample%<=0
  11908.     IF d%=0
  11909.       GOSUB edite_chaine(HEX$(sample%,2),ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),2,1)
  11910.       sample%=VAL("$"+bbbb$)
  11911.     ELSE
  11912.       ADD sample%,MUL(d%,MAX(PRED(km%),1))
  11913.     ENDIF
  11914.     sample%=MAX(MIN(sample%,255),1)
  11915.     GOSUB affiche_icones_sampleb
  11916.     GOSUB affiche_info_sample
  11917.     IF km%<3 AND d%<>0
  11918.       PAUSE SUB(13,MUL(km%,5))
  11919.     ENDIF
  11920.   ENDIF
  11921. RETURN
  11922. PROCEDURE chg_s_volume
  11923.   LOCAL a%
  11924.   IF d%=0
  11925.     GOSUB edite_chaine(HEX$(FN volume(sample%),3),ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),3,1)
  11926.     a%=VAL("$"+bbbb$)
  11927.   ELSE
  11928.     a%=ADD(FN volume(sample%),MUL(d%,MAX(PRED(km%),1)))
  11929.   ENDIF
  11930.   GOSUB chg_sam_volume(sample%,MIN(MAX(a%,0),&HFFF))
  11931.   GOSUB affiche_icones_sampleb
  11932.   IF km%<3 AND d%<>0
  11933.     PAUSE SUB(13,MUL(km%,5))
  11934.   ENDIF
  11935. RETURN
  11936. PROCEDURE chg_s_length                  !!!
  11937. RETURN
  11938. PROCEDURE chg_s_reppos
  11939.   LOCAL a%
  11940.   IF d%=0
  11941.     GOSUB edite_chaine(HEX$(FN repeat(sample%),6),ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),6,1)
  11942.     a%=VAL("$"+bbbb$)
  11943.   ELSE
  11944.     a%=ADD(FN repeat(sample%),SHL(d%,SUB(MUL(km%,4),3)))
  11945.   ENDIF
  11946.   GOSUB chg_sam_repeat(sample%,MAX(MIN(a% AND -2,SUB(FN length(sample%),FN replen(sample%))),0))
  11947.   GOSUB affiche_icones_sampleb
  11948.   num_nvl_boucle_sample%=sample%
  11949.   flag_nvl_boucle_sample%=4
  11950.   IF km%<3 AND d%<>0
  11951.     PAUSE SUB(13,MUL(km%,5))
  11952.   ENDIF
  11953. RETURN
  11954. PROCEDURE chg_s_replen
  11955.   LOCAL a%
  11956.   IF d%=0
  11957.     GOSUB edite_chaine(HEX$(FN replen(sample%),6),ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),6,1)
  11958.     a%=VAL("$"+bbbb$)
  11959.   ELSE
  11960.     a%=ADD(FN replen(sample%),SHL(d%,SUB(MUL(km%,4),3)))
  11961.   ENDIF
  11962.   GOSUB chg_sam_replen(sample%,MAX(MIN(a% AND -2,SUB(FN length(sample%),FN repeat(sample%))),2))
  11963.   GOSUB affiche_icones_sampleb
  11964.   flag_nvl_boucle_sample%=4
  11965.   num_nvl_boucle_sample%=sample%
  11966.   IF km%<3 AND d%<>0
  11967.     PAUSE SUB(13,MUL(km%,5))
  11968.   ENDIF
  11969. RETURN
  11970. PROCEDURE chg_s_finetune
  11971.   LOCAL a%,b%
  11972.   IF d%=0
  11973.   ELSE
  11974.     a%=ADD(FN finetune(sample%),d%)
  11975.   ENDIF
  11976.   GOSUB chg_sam_finetune(sample%,MIN(MAX(a%,-8),7))
  11977.   GOSUB affiche_icones_sampleb
  11978.   IF km%<3 AND d%<>0
  11979.     PAUSE SUB(13,MUL(km%,5))
  11980.   ENDIF
  11981. RETURN
  11982. PROCEDURE chg_s_balance
  11983.   LOCAL a%,a$
  11984.   a%=FN autobal(sample%)
  11985.   IF d%=0
  11986.     IF a%<=&HFFF
  11987.       a$=HEX$(FN autobal(sample%),3)
  11988.     ELSE
  11989.       a$="???"
  11990.     ENDIF
  11991.     GOSUB edite_chaine(a$,ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),3,0)
  11992.     IF INSTR(bbbb$,"?")>0
  11993.       a%=-1
  11994.     ELSE
  11995.       a%=VAL("$"+bbbb$)
  11996.     ENDIF
  11997.   ELSE
  11998.     IF a%>&HFFF
  11999.       a%=-1
  12000.     ENDIF
  12001.     a%=ADD(a%,SHL(d%,SUB(MUL(km%,4),3))) AND -2
  12002.   ENDIF
  12003.   GOSUB chg_sam_balance(sample%,MAX(MIN(a%,&HFFF),-1) AND &HFFFF)
  12004.   GOSUB affiche_icones_sampleb
  12005.   IF km%<3 AND d%<>0
  12006.     PAUSE SUB(13,MUL(km%,5))
  12007.   ENDIF
  12008. RETURN
  12009. PROCEDURE chg_s_freqech
  12010.   LOCAL a%
  12011.   IF d%=0
  12012.     GOSUB edite_chaine(STR$(FN freqech(sample%),5),ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),5,2)
  12013.     a%=VAL(bbbb$)
  12014.   ELSE
  12015.     a%=ADD(FN freqech(sample%),MUL(d%,20^PRED(km%)))
  12016.   ENDIF
  12017.   GOSUB chg_sam_freq(sample%,MAX(MIN(a%,65000),2000))
  12018.   GOSUB affiche_icones_sampleb
  12019.   IF km%<3 AND d%<>0
  12020.     PAUSE 3
  12021.   ENDIF
  12022. RETURN
  12023. PROCEDURE chg_songname(nnnn$)
  12024.   LOCAL iiii%
  12025.   FOR iiii%=2 TO 17
  12026.     module&(iiii%)=&H2020
  12027.   NEXT iiii%
  12028.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),32))
  12029.     BYTE{ADD(V:module&(2),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12030.   NEXT iiii%
  12031. RETURN
  12032. PROCEDURE chg_songname2(aaaa%,llll%)
  12033.   LOCAL iiii%
  12034.   FOR iiii%=0 TO 31
  12035.     IF iiii%<llll%
  12036.       BYTE{ADD(V:module&(2),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12037.     ELSE
  12038.       BYTE{ADD(V:module&(2),iiii%)}=32
  12039.     ENDIF
  12040.   NEXT iiii%
  12041. RETURN
  12042. PROCEDURE chg_songcomment(nnnn$)
  12043.   LOCAL iiii%
  12044.   FOR iiii%=18 TO 97
  12045.     module&(iiii%)=&H2020
  12046.   NEXT iiii%
  12047.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),160))
  12048.     BYTE{ADD(V:module&(18),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12049.   NEXT iiii%
  12050. RETURN
  12051. PROCEDURE chg_songcomment2(aaaa%,llll%)
  12052.   LOCAL iiii%
  12053.   FOR iiii%=0 TO 159
  12054.     IF iiii%<llll%
  12055.       BYTE{ADD(V:module&(18),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12056.     ELSE
  12057.       BYTE{ADD(V:module&(18),iiii%)}=32
  12058.     ENDIF
  12059.   NEXT iiii%
  12060. RETURN
  12061. PROCEDURE chg_preset(p%)
  12062.   GOSUB cadre_texte(STR$(SUCC(n_preset%)),ADD(8,SHL(n_preset%,1)),130,1)
  12063.   n_preset%=p%
  12064.   GOSUB affiche_info_preset
  12065. RETURN
  12066. ' Piste
  12067. PROCEDURE chg_track_onoff(t%,state%)
  12068.   ' Ne change pas l'affichage
  12069.   ' state% = 0 ou 1
  12070.   DPOKE ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,t%)),state%
  12071. RETURN
  12072. PROCEDURE chg_a_track_onoff(t%,state%)
  12073.   ' Change l'affichage
  12074.   ' state% = 0 ou 1
  12075.   GOSUB chg_track_onoff(t%,state%)
  12076.   GOSUB cadre_texte2(STR$(SUCC(t%)),ADD(8,SHL(t%,1)),120,1,FN track_onoff(t%) XOR 1)
  12077.   GOSUB affiche_info_preset
  12078. RETURN
  12079. PROCEDURE all_track_on(flag!)
  12080.   LOCAL i%
  12081.   FOR i%=0 TO 31
  12082.     GOSUB chg_track_onoff(i%,1)
  12083.     IF flag!
  12084.       GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  12085.     ENDIF
  12086.   NEXT i%
  12087. RETURN
  12088. PROCEDURE balance_reset
  12089.   LOCAL i%
  12090.   FOR i%=0 TO 31
  12091.     GOSUB chg_t_balance(i%,MUL(SHR(SUCC(i%),1) AND 1,&HFFF))
  12092.   NEXT i%
  12093. RETURN
  12094. PROCEDURE set_balance(a$)
  12095.   LOCAL i%
  12096.   FOR i%=0 TO 31
  12097.     GOSUB chg_t_balance(i%,CARD{ADD(V:a$,SHL(i%,1))})
  12098.   NEXT i%
  12099. RETURN
  12100. PROCEDURE chg_t_balance(t%,b%)
  12101.   CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,t%))}=b%
  12102. RETURN
  12103. PROCEDURE track_volume_reset
  12104.   LOCAL i%
  12105.   FOR i%=0 TO 31
  12106.     GOSUB chg_t_mix_volume(i%,&H1000)
  12107.   NEXT i%
  12108. RETURN
  12109. PROCEDURE chg_t_mix_volume(t%,b%)
  12110.   CARD{ADD(ADD(r_info_track%,r_mix_volume_t%),MUL(r_itl%,t%))}=b%
  12111.   CARD{ADD(ADD(r_info_track%,r_mix_volume_e_t%),MUL(r_itl%,t%))}=FN vol_lin_2_exp(b%)
  12112. RETURN
  12113. PROCEDURE chg_t_mix_volume_e(t%,b%)
  12114.   CARD{ADD(ADD(r_info_track%,r_mix_volume_t%),MUL(r_itl%,t%))}=FN vol_exp_2_lin(b%)
  12115.   CARD{ADD(ADD(r_info_track%,r_mix_volume_e_t%),MUL(r_itl%,t%))}=b%
  12116. RETURN
  12117. PROCEDURE set_track_volume(a$)
  12118.   LOCAL i%
  12119.   FOR i%=0 TO 31
  12120.     GOSUB chg_t_mix_volume(i%,CARD{ADD(V:a$,SHL(i%,1))})
  12121.   NEXT i%
  12122. RETURN
  12123. ' Pattern
  12124. PROCEDURE chg_pat_chunkadr(pppp%,aaaa%)
  12125.   LONG{ADD(r_adr_pattern%,SHL(pppp%,2))}=aaaa%
  12126. RETURN
  12127. PROCEDURE chg_pat_chunklen(pppp%,aaaa%)
  12128.   LONG{ADD(FN adr_patchunk(pppp%),4)}=aaaa%
  12129. RETURN
  12130. PROCEDURE chg_pat_nbr_track(pppp%,aaaa%)
  12131.   CARD{ADD(FN adr_patchunk(pppp%),30)}=aaaa%
  12132. RETURN
  12133. PROCEDURE chg_pat_nbr_lines(pppp%,aaaa%)
  12134.   CARD{ADD(FN adr_patchunk(pppp%),28)}=aaaa%
  12135. RETURN
  12136. PROCEDURE chg_patternname(nnnn$,pppp%)
  12137.   IF LEN(nnnn$)<16
  12138.     nnnn$=nnnn$+SPACE$(SUB(16,LEN(nnnn$)))
  12139.   ENDIF
  12140.   nnnn$=LEFT$(nnnn$,16)
  12141.   BMOVE V:nnnn$,ADD(FN adr_patchunk(pppp%),10),16
  12142. RETURN
  12143. PROCEDURE chg_patternname2(aaaa%,llll%,pppp%)
  12144.   LOCAL iiii%
  12145.   FOR iiii%=0 TO 15
  12146.     IF iiii%<llll%
  12147.       BYTE{ADD(ADD(FN adr_patchunk(pppp%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12148.     ELSE
  12149.       BYTE{ADD(ADD(FN adr_patchunk(pppp%),10),iiii%)}=32
  12150.     ENDIF
  12151.   NEXT iiii%
  12152. RETURN
  12153. ' Sample
  12154. PROCEDURE chg_sam_chunkadr(ssss%,ffff%)
  12155.   LONG{ADD(r_adr_sample%,SHL(ssss%,2))}=ffff%
  12156. RETURN
  12157. PROCEDURE chg_sam_freq(ssss%,ffff%)
  12158.   CARD{ADD(FN adrsamchk(ssss%),44)}=ffff%
  12159. RETURN
  12160. PROCEDURE chg_sam_balance(ssss%,ffff%)
  12161.   CARD{ADD(FN adrsamchk(ssss%),40)}=ffff%
  12162. RETURN
  12163. PROCEDURE chg_sam_volume(ssss%,ffff%)
  12164.   CARD{ADD(FN adrsamchk(ssss%),58)}=ffff%
  12165. RETURN
  12166. PROCEDURE chg_sam_nbits(ssss%,ffff%)
  12167.   CARD{ADD(FN adrsamchk(ssss%),42)}=SHL(ffff%,3)
  12168. RETURN
  12169. PROCEDURE chg_sam_length(ssss%,ffff%)
  12170.   LONG{ADD(FN adrsamchk(ssss%),46)}=ffff%
  12171.   LONG{ADD(FN adrsamchk(ssss%),4)}=ADD(ffff%,64)
  12172. RETURN
  12173. PROCEDURE chg_sam_repeat(ssss%,ffff%)
  12174.   LONG{ADD(FN adrsamchk(ssss%),50)}=ffff%
  12175. RETURN
  12176. PROCEDURE chg_sam_replen(ssss%,ffff%)
  12177.   LONG{ADD(FN adrsamchk(ssss%),54)}=MAX(ffff%,2)
  12178. RETURN
  12179. PROCEDURE chg_sam_finetune(ssss%,ffff%)
  12180.   INT{ADD(FN adrsamchk(ssss%),60)}=ffff%
  12181. RETURN
  12182. PROCEDURE chg_samplename(nnnn$,ssss%)
  12183.   LOCAL iiii%
  12184.   FOR iiii%=10 TO 34 STEP 4
  12185.     LONG{ADD(FN adrsamchk(ssss%),iiii%)}=&H20202020
  12186.   NEXT iiii%
  12187.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),28))
  12188.     BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12189.   NEXT iiii%
  12190. RETURN
  12191. PROCEDURE chg_samplename2(aaaa%,llll%,ssss%)
  12192.   LOCAL iiii%
  12193.   FOR iiii%=0 TO 27
  12194.     IF iiii%<llll%
  12195.       BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12196.     ELSE
  12197.       BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=32
  12198.     ENDIF
  12199.   NEXT iiii%
  12200. RETURN
  12201. ' Instrument
  12202. PROCEDURE chg_ins_balance(ssss%,ffff%)
  12203.   CARD{ADD(V:instrset%(0,ssss%),42)}=ffff%
  12204. RETURN
  12205. PROCEDURE chg_ins_volume(ssss%,ffff%)
  12206.   CARD{ADD(V:instrset%(0,ssss%),40)}=ffff%
  12207. RETURN
  12208. PROCEDURE chg_ins_evol(ssss%,ffff%)
  12209.   CARD{ADD(V:instrset%(0,ssss%),44)}=ffff%
  12210. RETURN
  12211. PROCEDURE chg_ins_eton(ssss%,ffff%)
  12212.   CARD{ADD(V:instrset%(0,ssss%),46)}=ffff%
  12213. RETURN
  12214. PROCEDURE chg_ins_epan(ssss%,ffff%)
  12215.   CARD{ADD(V:instrset%(0,ssss%),48)}=ffff%
  12216. RETURN
  12217. PROCEDURE chg_ins_transp(ssss%,ffff%,gggg%)
  12218.   BYTE{ADD(V:instrset%(15,ssss%),SUCC(SHL(ffff%,1)))}=gggg%
  12219. RETURN
  12220. PROCEDURE chg_ins_sample(ssss%,ffff%,gggg%)
  12221.   BYTE{ADD(V:instrset%(15,ssss%),SHL(ffff%,1))}=gggg%
  12222. RETURN
  12223. PROCEDURE chg_instrname(nnnn$,ssss%)
  12224.   LOCAL iiii%
  12225.   FOR iiii%=10 TO 34 STEP 4
  12226.     LONG{ADD(V:instrset%(0,ssss%),iiii%)}=&H20202020
  12227.   NEXT iiii%
  12228.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),28))
  12229.     BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  12230.   NEXT iiii%
  12231. RETURN
  12232. PROCEDURE chg_instrname2(aaaa%,llll%,ssss%)
  12233.   LOCAL iiii%
  12234.   FOR iiii%=0 TO 27
  12235.     IF iiii%<llll%
  12236.       BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  12237.     ELSE
  12238.       BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=32
  12239.     ENDIF
  12240.   NEXT iiii%
  12241. RETURN
  12242. ' Envelopes
  12243. PROCEDURE chg_env_chunkadr(num%,type%,adr%)
  12244.   SELECT type%
  12245.   CASE 0
  12246.     LONG{ADD(r_adr_evol%,SHL(num%,2))}=adr%
  12247.   CASE 1
  12248.     LONG{ADD(r_adr_eton%,SHL(num%,2))}=adr%
  12249.   CASE 2
  12250.     LONG{ADD(r_adr_epan%,SHL(num%,2))}=adr%
  12251.   ENDSELECT
  12252. RETURN
  12253. PROCEDURE chg_env_length(num%,type%,sect%,lon%)
  12254.   ' Change la longueur d'une section d'enveloppe
  12255.   ' Les commandes sont effacees
  12256.   LOCAL a%
  12257.   a%=SUB(lon%,FN env_sectlen(num%,type%,sect%))
  12258.   GOSUB chg_env_rellength(num%,type%,sect%,0,a%)
  12259.   a%=FN env_sectadr(num%,type%,sect%)
  12260.   FOR a%=a% TO PRED(ADD(a%,FN env_sectlen(num%,type%,sect%)))
  12261.     BYTE{a%}=0
  12262.   NEXT a%
  12263. RETURN
  12264. PROCEDURE chg_env_rellength(num%,type%,sect%,pos%,rlon%)
  12265.   ' Insere un certain nombre d'octets dans une enveloppe
  12266.   ' Marche aussi pour la reduction de la taille de l'enveloppe (lon% negatif)
  12267.   ' Pos% est en numero de commande et non en octets
  12268.   ' Le chunk est mis a jour
  12269.   LOCAL d%,i%,j%,l%,s%
  12270.   ' Calcul des adresses source et destination, et de la longueur du bloc a deplacer
  12271.   IF rlon%>=0                                   ! Deplacement positif
  12272.     s%=ADD(FN env_sectadr(num%,type%,sect%),FN pos_enveloppe(num%,type%,sect%,pos%))
  12273.     d%=ADD(s%,rlon%)
  12274.   ELSE                                          ! Deplacement negatif
  12275.     d%=ADD(FN env_sectadr(num%,type%,sect%),FN pos_enveloppe(num%,type%,sect%,pos%))
  12276.     s%=SUB(d%,rlon%)
  12277.   ENDIF
  12278.   l%=SUB(FN adr_buffer,s%)
  12279.   ' Deplacement des adresses des chunks d'enveloppes suivants
  12280.   IF num%<63 OR type%<2
  12281.     FOR i%=SUCC(ADD(MUL(num%,3),type%)) TO 191
  12282.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),rlon%))
  12283.     NEXT i%
  12284.   ENDIF
  12285.   ' Deplacement des adresses des chunks de samples suivants
  12286.   FOR i%=0 TO 255
  12287.     GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),rlon%))
  12288.   NEXT i%
  12289.   ' Deplacement du bloc en memoire
  12290.   ~C:g_bmove%(L:s%,L:d%,L:l%)
  12291.   LONG{ADD(FN env_chunkadr(num%,type%),4)}=ADD(FN env_chunklen(num%,type%),rlon%)
  12292.   IF sect%=0
  12293.     CARD{ADD(FN env_chunkadr(num%,type%),30)}=ADD(CARD{ADD(FN env_chunkadr(num%,type%),30)},rlon%)
  12294.   ENDIF
  12295. RETURN
  12296. PROCEDURE chg_env_adrjump(num%,type%,sect%,pos%,lon%)
  12297.   ' Change les adresses de saut apres une insertion ou destruction de commande
  12298.   ' Pos% en octets
  12299.   LOCAL a%,b%,c%,i%,l%
  12300.   a%=FN env_sectadr(num%,type%,sect%)
  12301.   l%=FN env_sectlen(num%,type%,sect%)
  12302.   WHILE i%<l%
  12303.     c%=BYTE{ADD(a%,i%)}
  12304.     IF c%=&H1 OR c%=&H4
  12305.       b%=CARD{SUCC(ADD(a%,i%))}
  12306.       IF b%>pos%
  12307.         CARD{SUCC(ADD(a%,i%))}=ADD(b%,lon%)
  12308.       ENDIF
  12309.     ENDIF
  12310.     ADD i%,FN env_comlen(c%)
  12311.   WEND
  12312. RETURN
  12313. PROCEDURE chg_envelopename(nnnn$,eeee%,tttt%)
  12314.   LOCAL a%,b%,i%
  12315.   a%=FN env_chunkadr(eeee%,tttt%)
  12316.   FOR i%=ADD(a%,10) TO ADD(a%,26) STEP 4
  12317.     LONG{i%}=&H20202020
  12318.   NEXT i%
  12319.   IF nnnn$<>""
  12320.     b%=V:nnnn$
  12321.     FOR i%=ADD(a%,10) TO ADD(a%,ADD(MIN(LEN(nnnn$),20),9))
  12322.       BYTE{i%}=MAX(BYTE{b%},32)
  12323.       INC b%
  12324.     NEXT i%
  12325.   ENDIF
  12326. RETURN
  12327. PROCEDURE chg_envelopename2(aaaa%,llll%,eeee%,tttt%)
  12328.   LOCAL a%,b%,i%
  12329.   a%=FN env_chunkadr(eeee%,tttt%)
  12330.   FOR i%=ADD(a%,10) TO ADD(a%,26) STEP 4
  12331.     LONG{i%}=&H20202020
  12332.   NEXT i%
  12333.   IF llll%>0
  12334.     FOR i%=ADD(a%,10) TO ADD(a%,ADD(MIN(LEN(nnnn$),20),9))
  12335.       BYTE{i%}=MAX(BYTE{aaaa%},32)
  12336.       INC aaaa%
  12337.     NEXT i%
  12338.   ENDIF
  12339. RETURN
  12340. ' Midi
  12341. PROCEDURE chg_midi_monomode_channel_nbr(num%)
  12342.   midi_monomode_channel_nbr%=num%
  12343. RETURN
  12344. PROCEDURE chg_midi_monomode_instr_nbr(num%)
  12345.   midi_monomode_instr_nbr%=num%
  12346. RETURN
  12347. PROCEDURE chg_midi_in_instr(can%,ins%)
  12348.   ' can%: 0-15
  12349.   LOCAL i%
  12350.   midi_in_instr%(can%)=ins%
  12351.   FOR i%=0 TO 15
  12352.     CARD{ADD(r_midi_instr_map%,SHL(i%,1))}=midi_in_instr%(i%)
  12353.   NEXT i%
  12354. RETURN
  12355. PROCEDURE chg_midi_polymode_channel(trk%,can%)
  12356.   ' can%: 0, 1-16
  12357.   midi_in_channel%(trk%)=can%
  12358.   IF midi_polyphonic_mode!
  12359.     GOSUB reset_midi_track_state(trk%)
  12360.   ENDIF
  12361. RETURN
  12362. PROCEDURE chg_midi_flag_data_in(val!)
  12363.   midi_flag_data_in!=val!
  12364.   CARD{r_midi_in_on%}=val!
  12365. RETURN
  12366. PROCEDURE chg_midi_flag_note_off(can%,val%)
  12367.   ' can%: 1-16
  12368.   CARD{ADD(r_midi_in_noteoff_flag%,SHL(PRED(can%),1))}=val%
  12369. RETURN
  12370. PROCEDURE chg_midi_flag_velocity(can%,val!)
  12371.   ' can%: 1-16
  12372.   CARD{ADD(r_midi_in_velo_flag%,SHL(PRED(can%),1))}=val!
  12373. RETURN
  12374. PROCEDURE reset_all_midi_track_state
  12375.   ' Reinitialise toutes les pistes MIDI en mode Polyphonique
  12376.   LOCAL trk%,can%
  12377.   FOR trk%=0 TO 31
  12378.     GOSUB reset_midi_track_state(trk%)
  12379.   NEXT trk%
  12380.   FOR can%=0 TO 15
  12381.     GOSUB chg_midi_in_instr(can%,midi_in_instr%(can%))
  12382.   NEXT can%
  12383. RETURN
  12384. PROCEDURE reset_midi_track_state(trk%)
  12385.   ' Reinitialise une piste MIDI en mode Polyphonique
  12386.   LOCAL adr%
  12387.   adr%=ADD(r_midi_track_state%,MUL(trk%,r_midi_ts_next%))
  12388.   IF trk%<nbr_track%
  12389.     CARD{adr%}=midi_in_channel%(trk%)
  12390.   ELSE
  12391.     CARD{adr%}=0
  12392.   ENDIF
  12393.   CARD{ADD(adr%,2)}=0
  12394.   CARD{ADD(adr%,4)}=0
  12395.   CARD{ADD(adr%,6)}=0
  12396.   CARD{ADD(adr%,8)}=0
  12397.   LONG{ADD(adr%,10)}=0
  12398.   BYTE{ADD(adr%,14)}=0
  12399. RETURN
  12400. PROCEDURE chg_midi_flag_data_out(val!)
  12401.   midi_flag_data_out!=val!
  12402.   CARD{r_midi_out_on%}=val!
  12403. RETURN
  12404. '
  12405. ' Fonctions de bloc
  12406. ' -----------------
  12407. PROCEDURE insert_line_track(pat%,lig%,trk%,fil$)
  12408.   LOCAL i%,k%
  12409.   IF lig%<PRED(FN nbr_lines(pat%))
  12410.     k%=MUL(nbr_track%,5)
  12411.     FOR i%=FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%) TO FN adr_trk(pat%,SUCC(lig%),trk%) STEP -k%
  12412.       BMOVE SUB(i%,k%),i%,5
  12413.     NEXT i%
  12414.   ENDIF
  12415.   BMOVE V:fil$,FN adr_trk(pat%,lig%,trk%),5
  12416. RETURN
  12417. PROCEDURE insert_line_pattern(pat%,lig%)
  12418.   LOCAL j%
  12419.   FOR j%=0 TO PRED(nbr_track%)
  12420.     GOSUB insert_line_track(pat%,lig%,j%,STRING$(5,0))
  12421.   NEXT j%
  12422. RETURN
  12423. PROCEDURE insert_line_preset(pat%,lig%)
  12424.   LOCAL j%
  12425.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12426.     GOSUB insert_line_track(pat%,lig%,preset&(j%,n_preset%),STRING$(5,0))
  12427.   NEXT j%
  12428. RETURN
  12429. PROCEDURE insert_r_line_track(pat%,lig%,trk%)
  12430.   LOCAL a$
  12431.   a$=STRING$(5,0)
  12432.   BMOVE FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%),V:a$,5
  12433.   GOSUB insert_line_track(pat%,lig%,trk%,a$)
  12434. RETURN
  12435. PROCEDURE insert_r_line_pattern(pat%,lig%)
  12436.   LOCAL j%
  12437.   FOR j%=0 TO PRED(nbr_track%)
  12438.     GOSUB insert_r_line_track(pat%,lig%,j%)
  12439.   NEXT j%
  12440. RETURN
  12441. PROCEDURE insert_r_line_preset(pat%,lig%)
  12442.   LOCAL j%
  12443.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12444.     GOSUB insert_r_line_track(pat%,lig%,preset&(j%,n_preset%))
  12445.   NEXT j%
  12446. RETURN
  12447. PROCEDURE delete_line_track(pat%,lig%,trk%,fil$)
  12448.   LOCAL i%,k%
  12449.   IF lig%<PRED(FN nbr_lines(pat%))
  12450.     k%=MUL(nbr_track%,5)
  12451.     FOR i%=FN adr_trk(pat%,SUCC(lig%),trk%) TO FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%) STEP k%
  12452.       BMOVE i%,SUB(i%,k%),5
  12453.     NEXT i%
  12454.   ENDIF
  12455.   BMOVE V:fil$,FN adr_trk(pat%,PRED(FN nbr_lines(pat%)),trk%),5
  12456. RETURN
  12457. PROCEDURE delete_line_pattern(pat%,lig%)
  12458.   LOCAL j%
  12459.   FOR j%=0 TO PRED(nbr_track%)
  12460.     GOSUB delete_line_track(pat%,lig%,j%,STRING$(5,0))
  12461.   NEXT j%
  12462. RETURN
  12463. PROCEDURE delete_line_preset(pat%,lig%)
  12464.   LOCAL j%
  12465.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12466.     GOSUB delete_line_track(pat%,lig%,preset&(j%,n_preset%),STRING$(5,0))
  12467.   NEXT j%
  12468. RETURN
  12469. PROCEDURE delete_r_line_track(pat%,lig%,trk%)
  12470.   LOCAL a$
  12471.   a$=STRING$(5,0)
  12472.   BMOVE FN adr_trk(pat%,lig%,trk%),V:a$,5
  12473.   GOSUB delete_line_track(pat%,lig%,trk%,a$)
  12474. RETURN
  12475. PROCEDURE delete_r_line_pattern(pat%,lig%)
  12476.   LOCAL j%
  12477.   FOR j%=0 TO PRED(nbr_track%)
  12478.     GOSUB delete_r_line_track(pat%,lig%,j%)
  12479.   NEXT j%
  12480. RETURN
  12481. PROCEDURE delete_r_line_preset(pat%,lig%)
  12482.   LOCAL j%
  12483.   FOR j%=0 TO PRED(nbr_colonnes%(n_preset%))
  12484.     GOSUB delete_r_line_track(pat%,lig%,preset&(j%,n_preset%))
  12485.   NEXT j%
  12486. RETURN
  12487. PROCEDURE block_start
  12488.   bl_pat&=song&(songpos%)
  12489.   bl_start&=posligne%
  12490.   bl_end&=MIN(MAX(bl_end&,posligne%),FN nbr_lines(bl_pat&))
  12491.   bl_trk&=preset&(curs_col%,n_preset%)
  12492.   REPEAT
  12493.   UNTIL MOUSEK=0
  12494.   GOSUB affiche_barre_info
  12495. RETURN
  12496. PROCEDURE block_end
  12497.   bl_pat&=song&(songpos%)
  12498.   bl_end&=posligne%
  12499.   bl_start&=MIN(bl_start&,posligne%)
  12500.   bl_trk&=preset&(curs_col%,n_preset%)
  12501.   REPEAT
  12502.   UNTIL MOUSEK=0
  12503.   GOSUB affiche_barre_info
  12504. RETURN
  12505. PROCEDURE paste_block
  12506.   LOCAL i&,l&,s%,d%,a%,i%,j%,k%,inf$
  12507.   i&=MUL(nbr_track%,5)
  12508.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),SUB(FN nbr_lines3,posligne%))
  12509.   IF trackpat%=0
  12510.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12511.     d%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  12512.     SUB d%,s%
  12513.     IF d%>0
  12514.       ADD s%,MUL(PRED(l&),i&)
  12515.       i&=-i&
  12516.     ENDIF
  12517.     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%))
  12518.     a%=V:inf$
  12519.     ~C:g_paste_note_block%(L:a%)
  12520.   ELSE IF trackpat%=1
  12521.     s%=FN adr_line(bl_pat&,bl_start&)
  12522.     d%=FN adr_sline(songpos%,posligne%)
  12523.     SUB d%,s%
  12524.     e%=ADD(s%,MUL(PRED(l&),i&))
  12525.     IF d%>0
  12526.       SWAP s%,e%
  12527.       i&=-i&
  12528.     ENDIF
  12529.     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%))
  12530.     a%=V:inf$
  12531.     ~C:g_paste_note_block%(L:a%)
  12532.   ELSE
  12533.     s%=FN adr_line(bl_pat&,bl_start&)
  12534.     d%=FN adr_sline(songpos%,posligne%)
  12535.     SUB d%,s%
  12536.     IF d%>0
  12537.       ADD s%,MUL(PRED(l&),i&)
  12538.       i&=-i&
  12539.     ENDIF
  12540.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12541.     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%))
  12542.     a%=V:inf$
  12543.     ~C:g_paste_note_block%(L:a%)
  12544.   ENDIF
  12545. RETURN
  12546. PROCEDURE insert_block
  12547.   LOCAL bls2&,ble2&,blp2&,blt2&,pl2%
  12548.   IF NOT (posligne%<=bl_end& AND bl_pat&=song&(songpos%) AND ((bl_trk&=preset&(curs_col%,n_preset%) AND trackpat%=0) OR trackpat%>0))
  12549.     IF ADD(SUB(bl_end&,bl_start&),posligne%)<PRED(FN nbr_lines3)
  12550.       bls2&=posligne%
  12551.       ble2&=ADD(posligne%,SUB(bl_end&,bl_start&))
  12552.       blp2&=song&(songpos%)
  12553.       blt2&=bl_trk&
  12554.       pl2%=SUCC(ble2&)
  12555.       SWAP bl_start&,bls2&
  12556.       SWAP bl_end&,ble2&
  12557.       SWAP bl_pat&,blp2&
  12558.       SWAP posligne%,pl2%
  12559.       bl_trk&=preset&(curs_col%,n_preset%)
  12560.       GOSUB paste_block           ! Decale le morceau de pattern si necessaire
  12561.       SWAP bl_start&,bls2&
  12562.       SWAP bl_end&,ble2&
  12563.       SWAP bl_pat&,blp2&
  12564.       SWAP posligne%,pl2%
  12565.       bl_trk&=blt2&
  12566.     ENDIF
  12567.     GOSUB paste_block
  12568.   ENDIF
  12569. RETURN
  12570. PROCEDURE clear_block
  12571.   LOCAL i&,l&,s%,a%,i%,j%,k%
  12572.   i&=MUL(nbr_track%,5)
  12573.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),SUB(FN nbr_lines(bl_pat&),posligne%))
  12574.   IF trackpat%=0
  12575.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12576.     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%))
  12577.     a%=V:inf$
  12578.     ~C:g_clear_note_block%(L:a%)
  12579.   ELSE IF trackpat%=1
  12580.     s%=FN adr_line(bl_pat&,bl_start&)
  12581.     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%))
  12582.     a%=V:inf$
  12583.     ~C:g_clear_note_block%(L:a%)
  12584.   ELSE
  12585.     s%=FN adr_line(bl_pat&,bl_start&)
  12586.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12587.     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%))
  12588.     a%=V:inf$
  12589.     ~C:g_clear_note_block%(L:a%)
  12590.   ENDIF
  12591. RETURN
  12592. PROCEDURE delete_block
  12593.   LOCAL bls2&,ble2&,pl2%
  12594.   bls2&=SUCC(bl_end&)
  12595.   ble2&=PRED(FN nbr_lines3)
  12596.   SWAP bl_start&,bls2&
  12597.   SWAP bl_end&,ble2&
  12598.   IF ble2&<PRED(FN nbr_lines3)
  12599.     pl2%=bls2&
  12600.     SWAP posligne%,pl2%
  12601.     GOSUB paste_block           ! Decale le morceau de pattern si necessaire
  12602.     SWAP posligne%,pl2%
  12603.   ENDIF
  12604.   bl_start&=SUB(FN nbr_lines3,SUCC(SUB(ble2&,bls2&)))
  12605.   GOSUB clear_block
  12606.   SWAP bl_start&,bls2&
  12607.   SWAP bl_end&,ble2&
  12608. RETURN
  12609. PROCEDURE note_up_general
  12610.   LOCAL i%,p%,oldp%
  12611.   IF bl_flagsong!               ! Scanne tous les patterns utilises par la song
  12612.     oldp%=bl_pat&
  12613.     FOR p%=0 TO FN last_pat_util
  12614.       i%=0
  12615.       REPEAT
  12616.         IF song&(i%)=p%
  12617.           bl_pat&=p%
  12618.           GOSUB note_up_block
  12619.           i%=FN song_length
  12620.         ELSE
  12621.           INC i%
  12622.         ENDIF
  12623.       UNTIL i%=>FN song_length
  12624.     NEXT p%
  12625.     bl_pat&=oldp%
  12626.   ELSE                          ! Simplement sur le bloc
  12627.     GOSUB note_up_block
  12628.   ENDIF
  12629. RETURN
  12630. PROCEDURE note_up_block
  12631.   LOCAL i&,l&,s%,a%,i%,j%,k%
  12632.   i&=MUL(nbr_track%,5)
  12633.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),FN nbr_lines(bl_pat&))
  12634.   IF trackpat%=0
  12635.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12636.     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%))
  12637.     a%=V:inf$
  12638.     ~C:g_transpose_note_block%(L:a%)
  12639.   ELSE IF trackpat%=1
  12640.     s%=FN adr_line(bl_pat&,bl_start&)
  12641.     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%))
  12642.     a%=V:inf$
  12643.     ~C:g_transpose_note_block%(L:a%)
  12644.   ELSE
  12645.     s%=FN adr_line(bl_pat&,bl_start&)
  12646.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12647.     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%))
  12648.     a%=V:inf$
  12649.     ~C:g_transpose_note_block%(L:a%)
  12650.   ENDIF
  12651. RETURN
  12652. PROCEDURE note_down_general
  12653.   LOCAL i%,p%,oldp%
  12654.   IF bl_flagsong!               ! Scanne tous les patterns utilises par la song
  12655.     oldp%=bl_pat&
  12656.     FOR p%=0 TO FN last_pat_util
  12657.       i%=0
  12658.       REPEAT
  12659.         IF song&(i%)=p%
  12660.           bl_pat&=p%
  12661.           GOSUB note_down_block
  12662.           i%=FN song_length
  12663.         ELSE
  12664.           INC i%
  12665.         ENDIF
  12666.       UNTIL i%=>FN song_length
  12667.     NEXT p%
  12668.     bl_pat&=oldp%
  12669.   ELSE                          ! Simplement sur le bloc
  12670.     GOSUB note_down_block
  12671.   ENDIF
  12672. RETURN
  12673. PROCEDURE note_down_block
  12674.   LOCAL i&,l&,s%,a%,i%,j%,k%
  12675.   i&=MUL(nbr_track%,5)
  12676.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),FN nbr_lines(bl_pat&))
  12677.   IF trackpat%=0
  12678.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12679.     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%))
  12680.     a%=V:inf$
  12681.     ~C:g_transpose_note_block%(L:a%)
  12682.   ELSE IF trackpat%=1
  12683.     s%=FN adr_line(bl_pat&,bl_start&)
  12684.     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%))
  12685.     a%=V:inf$
  12686.     ~C:g_transpose_note_block%(L:a%)
  12687.   ELSE
  12688.     s%=FN adr_line(bl_pat&,bl_start&)
  12689.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12690.     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%))
  12691.     a%=V:inf$
  12692.     ~C:g_transpose_note_block%(L:a%)
  12693.   ENDIF
  12694. RETURN
  12695. PROCEDURE swap_block
  12696.   LOCAL i&,l&,s%,d%,a%,i%,j%,k%
  12697.   i&=MUL(nbr_track%,5)
  12698.   l&=MIN(SUCC(SUB(bl_end&,bl_start&)),SUB(FN nbr_lines3,posligne%))
  12699.   IF trackpat%=0
  12700.     s%=FN adr_trk(bl_pat&,bl_start&,bl_trk&)
  12701.     d%=FN adr_strk(songpos%,posligne%,preset&(curs_col%,n_preset%))
  12702.     SUB d%,s%
  12703.     IF d%>0
  12704.       ADD s%,MUL(PRED(l&),i&)
  12705.       i&=-i&
  12706.     ENDIF
  12707.     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%))
  12708.     a%=V:inf$
  12709.     ~C:g_swap_note_block%(L:a%)
  12710.   ELSE IF trackpat%=1
  12711.     s%=FN adr_line(bl_pat&,bl_start&)
  12712.     d%=FN adr_sline(songpos%,posligne%)
  12713.     SUB d%,s%
  12714.     e%=ADD(s%,MUL(PRED(l&),i&))
  12715.     IF d%>0
  12716.       SWAP s%,e%
  12717.       i&=-i&
  12718.     ENDIF
  12719.     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%))
  12720.     a%=V:inf$
  12721.     ~C:g_swap_note_block%(L:a%)
  12722.   ELSE
  12723.     s%=FN adr_line(bl_pat&,bl_start&)
  12724.     d%=FN adr_sline(songpos%,posligne%)
  12725.     SUB d%,s%
  12726.     IF d%>0
  12727.       ADD s%,MUL(PRED(l&),i&)
  12728.       i&=-i&
  12729.     ENDIF
  12730.     a%=MIN(nbr_col%,nbr_colonnes%(n_preset%))
  12731.     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%))
  12732.     a%=V:inf$
  12733.     ~C:g_swap_note_block%(L:a%)
  12734.   ENDIF
  12735. RETURN
  12736. PROCEDURE echo_block                    !!!
  12737.   ' Ne fait pour l'instant que sur une piste
  12738.   LOCAL a%,b%,i%,pt%
  12739.   LOCAL buf$
  12740.   buf$=STRING$(MUL(bl_echo_lines%,5),0)
  12741.   pt%=0
  12742.   FOR i%=bl_start& TO bl_end&
  12743.     a%=FN adr_trk(bl_pat&,i%,bl_trk&)
  12744.     ' Sortie du buffer
  12745.     IF BYTE{a%}=0 AND BYTE{ADD(V:buf$,pt%)}<>0
  12746.       LONG{a%}=LONG{ADD(V:buf$,pt%)}
  12747.       BYTE{ADD(a%,4)}=BYTE{ADD(ADD(V:buf$,pt%),4)}
  12748.     ENDIF
  12749.     ' Entree dans le buffer
  12750.     IF BYTE{a%}<>0
  12751.       IF NOT bl_echo_cont!
  12752.         buf$=STRING$(MUL(bl_echo_lines%,5),0)
  12753.       ENDIF
  12754.       b%=LONG{a%}
  12755.       LONG{ADD(V:buf$,pt%)}=b%
  12756.       IF (b% AND &HF000)=&H2000
  12757.         b%=MIN(b% AND &H1FF,&H100)
  12758.         CARD{ADD(ADD(V:buf$,pt%),2)}=0
  12759.       ELSE
  12760.         b%=BYTE{ADD(a%,4)}
  12761.         IF b%=0
  12762.           IF BYTE{ADD(a%,2)}=0
  12763.             b%=&H100
  12764.           ELSE
  12765.             b%=FN volume(BYTE{SUCC(a%)})
  12766.           ENDIF
  12767.         ENDIF
  12768.       ENDIF
  12769.       IF bl_echo_fdbk!                  ! Avec feedback
  12770.         b%=DIV(MUL(b%,bl_echo_feedback%),100)
  12771.       ELSE                              ! Avec fade
  12772.         b%=MAX(SUB(b%,bl_echo_fadestep%),0)
  12773.       ENDIF
  12774.       BYTE{ADD(ADD(V:buf$,pt%),4)}=b%
  12775.       IF b%=0
  12776.         LONG{ADD(V:buf$,pt%)}=0
  12777.       ENDIF
  12778.     ENDIF
  12779.     pt%=ADD(pt%,5) MOD MUL(bl_echo_lines%,5)
  12780.   NEXT i%
  12781. RETURN
  12782. PROCEDURE volume_slide(pat%,lig%,trk%)
  12783.   LOCAL a%,b%,c%,d%,i%,v1%,v2%
  12784.   b%=-1
  12785.   c%=-1
  12786.   ' Recherche du premier effet de volume a partir du curseur en montant
  12787.   a%=lig%
  12788.   REPEAT
  12789.     d%=FN adr_trk(pat%,a%,trk%)
  12790.     IF BYTE{ADD(d%,4)}<>0 OR (BYTE{ADD(d%,2)} AND &HF0)=&H20 OR (BYTE{ADD(d%,2)} AND &HF0)=&H30
  12791.       b%=a%
  12792.     ENDIF
  12793.     DEC a%
  12794.   UNTIL a%<0 OR b%>=0
  12795.   ' Recherche du premier effet de volume a partir du curseur en descendant
  12796.   a%=lig%
  12797.   REPEAT
  12798.     d%=FN adr_trk(pat%,a%,trk%)
  12799.     IF BYTE{ADD(d%,4)}<>0 OR (BYTE{ADD(d%,2)} AND &HF0)=&H20 OR (BYTE{ADD(d%,2)} AND &HF0)=&H30
  12800.       c%=a%
  12801.     ENDIF
  12802.     INC a%
  12803.   UNTIL a%>=FN nbr_lines(pat%) OR c%>=0
  12804.   IF b%>=0 AND c%>=0 AND SUB(c%,b%)>1
  12805.     ' Volume de depart
  12806.     a%=FN adr_trk(pat%,b%,trk%)
  12807.     v1%=BYTE{ADD(a%,4)}
  12808.     IF (BYTE{ADD(a%,2)} AND &HF0)=&H20
  12809.       v1%=MIN(CARD{ADD(a%,2)} AND &HFFF,&H100)
  12810.     ELSE IF (BYTE{ADD(a%,2)} AND &HF0)=&H30
  12811.       v1%=2^(MIN(CARD{ADD(a%,2)} AND &HFFF,&H800)/256)
  12812.     ENDIF
  12813.     ' Volume d'arrivee
  12814.     a%=FN adr_trk(pat%,c%,trk%)
  12815.     v2%=BYTE{ADD(a%,4)}
  12816.     IF (BYTE{ADD(a%,2)} AND &HF0)=&H20
  12817.       v2%=MIN(CARD{ADD(a%,2)} AND &HFFF,&H100)
  12818.     ELSE IF (BYTE{ADD(a%,2)} AND &HF0)=&H30
  12819.       v2%=2^(MIN(CARD{ADD(a%,2)} AND &HFFF,&H800)/256)
  12820.     ENDIF
  12821.     ' Volume fade
  12822.     FOR i%=SUCC(b%) TO PRED(c%)
  12823.       a%=FN adr_trk(pat%,i%,trk%)
  12824.       d%=ADD(v1%,DIV(MUL(SUB(v2%,v1%),SUB(i%,b%)),SUB(c%,b%)))
  12825.       BYTE{ADD(a%,4)}=MIN(255,MAX(1,d%))
  12826.     NEXT i%
  12827.   ENDIF
  12828. RETURN
  12829. '
  12830. '
  12831. '
  12832. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  12833. ' *                                                                          *
  12834. ' *                      Procedures pour le Drum Editor                      *
  12835. ' *                                                                          *
  12836. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  12837. '
  12838. ' General
  12839. ' -------
  12840. PROCEDURE drum_editor           !!!
  12841.   LOCAL de.nbr_lines%
  12842.   de.nbr_lines%=MIN(DIV(SUB(scr_haut%,ADD(divbi&(1,34,30),5)),SUCC(divbi&(3,34,30))),nbr_track%)
  12843.   GOSUB affiche_panneau_drum
  12844.   ~GEMDOS(7)
  12845. RETURN
  12846. PROCEDURE affiche_panneau_drum  !!!
  12847.   LOCAL i%,j%
  12848.   DEFMOUSE 0
  12849.   HIDEM
  12850.   GOSUB cadre_int(0,0,PRED(scr_ncol%),39,9,9,10,8)
  12851.   GOSUB cadre_int(0,40,PRED(scr_ncol%),SUB(PRED(scr_haut%),40),9,9,10,8)
  12852.   GOSUB affiche_bloc_icones(0,23,30,0,0)
  12853.   GOSUB cadre_ext(ADD(divbi&(0,4,30),8),ADD(divbi&(1,4,30),2),2,5,0,13,12,14)
  12854.   GOSUB cadre_ext(ADD(divbi&(0,7,30),9),ADD(divbi&(1,7,30),2),1,5,0,13,12,14)
  12855.   GOSUB cadre_ext(ADD(divbi&(0,10,30),8),ADD(divbi&(1,10,30),2),2,5,0,13,12,14)
  12856.   GOSUB cadre_ext(ADD(divbi&(0,13,30),8),ADD(divbi&(1,13,30),2),2,5,0,13,12,14)
  12857.   IF de.display_type%=0
  12858.     FOR i%=0 TO PRED(de.nbr_lines%)
  12859.       GOSUB affiche_icone(34,30,0,MUL(i%,10),FALSE)
  12860.       GOSUB affiche_icone(35,30,0,MUL(i%,10),FALSE)
  12861.       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)
  12862.     NEXT i%
  12863.     GOSUB cadre_ext(15,62,SUB(scr_ncol%,17),5,0,13,12,14)
  12864.     GOSUB cadre_ext(15,70,SUB(scr_ncol%,17),PRED(MUL(de.nbr_lines%,10)),0,13,12,14)
  12865.   ELSE
  12866.     FOR i%=0 TO PRED(de.nbr_lines%)
  12867.       FOR j%=23 TO 33
  12868.         GOSUB affiche_icone(j%,30,0,MUL(i%,10),FALSE)
  12869.       NEXT j%
  12870.       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)
  12871.       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)
  12872.       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)
  12873.       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)
  12874.       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)
  12875.     NEXT i%
  12876.     IF scr_ncol%>=86
  12877.       GOSUB cadre_ext(81,62,SUB(scr_ncol%,83),5,0,13,12,14)
  12878.       GOSUB cadre_ext(81,70,SUB(scr_ncol%,83),PRED(MUL(de.nbr_lines%,10)),0,13,12,14)
  12879.     ENDIF
  12880.   ENDIF
  12881. RETURN
  12882. '
  12883. '
  12884. '
  12885. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  12886. ' *                                                                          *
  12887. ' *                     Procedures pour le Sample Editor                     *
  12888. ' *                                                                          *
  12889. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  12890. '
  12891. ' General
  12892. ' -------
  12893. PROCEDURE sample_editor                 !!!
  12894.   ' Le buffer doit avoir une taille de 4 au minimum, et sa longueur doit etre paire
  12895.   ' La longueur de la fenetre affichee doit etre paire et avoir une taille minimum de 2
  12896.   ' Sa position aussi doit etre paire
  12897.   ' Idem pour l'espace entre les curseurs
  12898.   LOCAL a%,b%,c%,d%,i%,j%,k%,noact_delay%,orx%,ory%,orc%,hwin%,lwin%,xm%,xm2%,ym%,ym2%,km%,srt%
  12899.   LOCAL a,temp1,temp2,temp3
  12900.   LOCAL flag_exit!,flag_relachement!
  12901.   LOCAL a$,b$,info_tr$,aaaa$
  12902.   se.sample_editor_flag!=TRUE
  12903.   se.pas_sous_menu!=FALSE
  12904.   ~FRE(0)
  12905.   CLS
  12906.   GOSUB bee(TRUE)
  12907.   info_tr$=STRING$(34,0)        ! Des infos pour le replay des samples
  12908.   flag_relachement!=TRUE        ! Il faut relâcher le bouton apres avoir clique sur une icone
  12909.   a%=FN adr_buffer
  12910.   b%=FN lon_buffer
  12911.   ~C:g_invert_memory%(L:a%,L:b%,W:2)                            ! Remet le buffer dans le bon sens
  12912.   GOSUB mise_a_jour_sample_buffer(TRUE)
  12913.   orx%=SHR(SUB(scr_larg%,640),1) AND -8                         ! Origine X du panneau
  12914.   orc%=SHR(orx%,3)                                              ! Idem, en colonnes
  12915.   IF scr_haut%>399
  12916.     hwin%=MIN(SUB(scr_haut%,148),152) AND -4                    ! Hauteur de la fenetre du sample
  12917.   ELSE IF scr_haut%>240 OR scr_haut%<220
  12918.     hwin%=MIN(SUB(scr_haut%,148),72) AND -4
  12919.   ELSE
  12920.     hwin%=DIV(SUB(scr_haut%,156),2) AND -4
  12921.   ENDIF
  12922.   lwin%=SUB(scr_larg%,96)                                       ! Sa largeur
  12923.   ory%=ADD(hwin%,8)                                             ! Origine Y du panneau
  12924.   GOSUB affiche_panneau_sample
  12925.   '
  12926.   ' Boucle principale
  12927.   '
  12928.   flag_exit!=FALSE
  12929.   REPEAT
  12930.     SHOWM
  12931.     MOUSE xm%,ym%,km%
  12932.     ' Curseurs
  12933.     IF km%>0 AND xm%>=16 AND xm%<ADD(lwin%,16) AND ym%>3 AND ym%<ADD(4,hwin%)
  12934.       IF km%=1                  ! Curseur gauche
  12935.         HIDEM
  12936.         GOSUB efface_2_curs
  12937.         temp1=SUB(xm%,16)
  12938.         temp2=win_lon%-1.0E-07
  12939.         temp3=PRED(lwin%)
  12940.         a%=MIN(SUB(ADD(mark_1%,mark_len%),2),ADD(INT(temp1*temp2/temp3),win_pos%)) AND -2
  12941.         mark_len%=SUB(ADD(mark_1%,mark_len%),a%)
  12942.         mark_1%=a%
  12943.         GOSUB affiche_2_curs
  12944.         SHOWM
  12945.         GOSUB affchaine_notrans(HEX$(mark_1%,6),ADD(orc%,8),ADD(ory%,2),1)
  12946.         se.volume_ok!=FALSE
  12947.         noact_delay%=5
  12948.       ELSE IF km%=2             ! Curseur droit
  12949.         HIDEM
  12950.         GOSUB efface_2_curs
  12951.         temp1=SUB(xm%,16)
  12952.         temp2=win_lon%
  12953.         temp3=PRED(lwin%)
  12954.         a%=INT(temp1*temp2/temp3) AND -2
  12955.         mark_len%=MAX(MIN(SUB(ADD(a%,win_pos%),mark_1%),SUB(FN lon_buffer,mark_1%)),2)
  12956.         GOSUB affiche_2_curs
  12957.         SHOWM
  12958.         GOSUB affchaine_notrans(HEX$(ADD(mark_1%,mark_len%),6),ADD(orc%,66),ADD(ory%,2),1)
  12959.         se.volume_ok!=FALSE
  12960.         noact_delay%=5
  12961.       ENDIF
  12962.       GOSUB affchaine_notrans(HEX$(mark_len%,6),ADD(orc%,29),ADD(ory%,2),1)
  12963.     ENDIF
  12964.     ' Test des icones
  12965.     xm2%=SUB(xm%,orx%)
  12966.     ym2%=SUB(ym%,ory%)
  12967.     IF km%>0
  12968.       ' Bloc d'icones principal
  12969.       a%=V:divbi&(0,0,0)
  12970.       srt%=C:g_teste_icones%(L:a%,W:2,W:xm2%,W:ym2%)
  12971.       IF srt%=>0
  12972.         GOSUB sample_editor.icones_principales
  12973.       ELSE
  12974.         a%=V:divbi&(0,0,0)
  12975.         srt%=C:g_teste_icones%(L:a%,W:3,W:xm2%,W:ym2%)
  12976.         IF srt%=>0
  12977.           GOSUB sample_editor.indicateurs_principaux
  12978.         ELSE
  12979.           a%=V:divbi&(0,0,0)
  12980.           srt%=C:g_teste_icones%(L:a%,W:4,W:xm2%,W:ym2%)
  12981.           IF srt%>=0
  12982.             ss_menu2%=SUCC(srt%)
  12983.             GOSUB sample_editor.affiche_sm
  12984.           ENDIF
  12985.         ENDIF
  12986.       ENDIF
  12987.     ENDIF
  12988.     ' Test des sous-menus (souris et touches)
  12989.     SELECT ss_menu2%
  12990.     CASE 1 TO 4
  12991.       ON ss_menu2% GOSUB se.sm_gere_volume,se.sm_gere_mix,se.sm_gere_record,se.sm_gere_marks
  12992.     CASE 5 TO 8
  12993.       ON SUB(ss_menu2%,4) GOSUB se.sm_gere_freq,se.sm_gere_delay,se.sm_gere_flanger,se.sm_gere_reverb
  12994.     CASE 9 TO 12
  12995.       ON SUB(ss_menu2%,8) GOSUB se.sm_gere_song2disk,se.sm_gere_compression,se.sm_gere_distortion
  12996.     ENDSELECT
  12997.     ' Test du clavier
  12998.     GOSUB sample_editor.touches
  12999.     IF noact_delay%>0
  13000.       DEC noact_delay%
  13001.     ENDIF
  13002.   UNTIL flag_exit!
  13003.   '
  13004.   CLS
  13005.   b%=FN lon_buffer                              ! Inverse le buffer pour pouvoir
  13006.   a%=FN adr_buffer                              ! garder son debut si les
  13007.   ~C:g_invert_memory%(L:a%,L:b%,W:2)            ! samples grandissent
  13008.   se.sample_editor_flag!=FALSE
  13009. RETURN
  13010. PROCEDURE sample_editor.icones_principales
  13011.   GOSUB affiche_icone(srt%,2,orc%,ory%,1)
  13012.   GOSUB wait_mouse(TRUE)
  13013.   SELECT srt%
  13014.   CASE 0                        ! Exit
  13015.     flag_exit!=TRUE
  13016.   CASE 1                        ! Zoom : saisit l'image entre les curseurs
  13017.     win_pos%=mark_1%
  13018.     win_lon%=mark_len%
  13019.     GOSUB affiche_sample
  13020.   CASE 2                        ! Zoom out : longueur de fenetre multipliee par 2
  13021.     win_pos%=MAX(0,SUB(win_pos%,SHR(win_lon%,1)) AND -2)
  13022.     win_lon%=MIN(SHL(win_lon%,1),SUB(FN lon_buffer,win_pos%))
  13023.     GOSUB affiche_sample
  13024.   CASE 3                        ! Copy sample => block
  13025.     GOSUB copy_sample_to_block
  13026.     se.volume_ok!=FALSE
  13027.     noact_delay%=5
  13028.   CASE 4                        ! Copy block => sample
  13029.     GOSUB copy_block_to_sample
  13030.   CASE 5                        ! Swap block <=> sample
  13031.     GOSUB swap_sample_and_block
  13032.     se.volume_ok!=FALSE
  13033.     noact_delay%=5
  13034.   CASE 6                        ! Clear
  13035.     GOSUB dialog("CLEAR","Clear block ?","Ok|Cancel",xm%,ym%)
  13036.     IF bouton%=0
  13037.       GOSUB bee(TRUE)
  13038.       GOSUB clear_mem(ADD(FN adr_buffer,mark_1%),mark_len%)
  13039.     ENDIF
  13040.     se.volume_ok!=FALSE
  13041.     noact_delay%=5
  13042.     GOSUB affiche_sample
  13043.   CASE 7                        ! Cut
  13044.     GOSUB dialog("CUT","Cut block ?","Ok|Cancel",xm%,ym%)
  13045.     IF bouton%=0
  13046.       GOSUB bee(TRUE)
  13047.       GOSUB se.sm_chg_marks(ADD(mark_1%,mark_len%),mark_1%)
  13048.       IF ADD(mark_1%,mark_len%)<FN lon_buffer
  13049.         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%))
  13050.       ENDIF
  13051.       GOSUB clear_mem(ADD(FN adr_buffer,SUB(FN lon_buffer,mark_len%)),mark_len%)
  13052.     ENDIF
  13053.     se.volume_ok!=FALSE
  13054.     noact_delay%=5
  13055.     GOSUB affiche_sample
  13056.   CASE 8                        ! Keep
  13057.     GOSUB dialog("KEEP","Keep your block|and clear the rest ?","Ok|Cancel",xm%,ym%)
  13058.     IF bouton%=0
  13059.       GOSUB bee(TRUE)
  13060.       IF mark_1%>0
  13061.         BMOVE ADD(FN adr_buffer,mark_1%),FN adr_buffer,mark_len%
  13062.         mark_1%=0
  13063.         win_pos%=0
  13064.         win_lon%=FN lon_buffer
  13065.       ENDIF
  13066.       IF mark_len%<FN lon_buffer
  13067.         GOSUB clear_mem(ADD(FN adr_buffer,ADD(mark_1%,mark_len%)),SUB(FN lon_buffer,ADD(mark_1%,mark_len%)))
  13068.       ENDIF
  13069.     ENDIF
  13070.     GOSUB affiche_sample
  13071.   CASE 9                        ! Flip
  13072.     GOSUB bee(TRUE)
  13073.     a%=ADD(FN adr_buffer,mark_1%)
  13074.     ~C:g_invert_memory%(L:a%,L:mark_len%,W:win_bits%)
  13075.     GOSUB affiche_sample
  13076.   CASE 10                       ! Gap (block)
  13077.     GOSUB dialog("GAP","Insert blank space in the buffer,|length of the block ?","Ok|Cancel",MOUSEX,MOUSEY)
  13078.     IF bouton%=0
  13079.       GOSUB bee(TRUE)
  13080.       GOSUB se.sm_chg_marks(mark_1%,ADD(mark_1%,mark_len%))
  13081.       a%=ADD(FN adr_buffer,mark_1%)
  13082.       IF ADD(mark_1%,mark_len%)<FN lon_buffer
  13083.         BMOVE a%,ADD(a%,mark_len%),SUB(FN lon_buffer,ADD(mark_1%,mark_len%))
  13084.       ENDIF
  13085.       GOSUB clear_mem(a%,mark_len%)
  13086.     ENDIF
  13087.     se.volume_ok!=FALSE
  13088.     noact_delay%=5
  13089.     GOSUB affiche_sample
  13090.   CASE 11                       ! Gap (sample)
  13091.     GOSUB dialog("GAP","Insert blank space in the buffer,|length of the sample #"+HEX$(sample%,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  13092.     IF bouton%=0
  13093.       GOSUB bee(TRUE)
  13094.       a%=ADD(FN adr_buffer,mark_1%)
  13095.       b%=MUL(DIV(FN length(sample%),FN resol(sample%)),win_bits%)
  13096.       IF ADD(mark_1%,b%)<FN lon_buffer
  13097.         GOSUB se.sm_chg_marks(mark_1%,ADD(mark_1%,b%))
  13098.         BMOVE a%,ADD(a%,b%),SUB(FN lon_buffer,ADD(mark_1%,b%))
  13099.       ENDIF
  13100.       GOSUB clear_mem(a%,MIN(b%,SUB(FN lon_buffer,mark_1%)))
  13101.     ENDIF
  13102.     se.volume_ok!=FALSE
  13103.     noact_delay%=5
  13104.     GOSUB affiche_sample
  13105.   CASE 12                       ! Play
  13106.     GOSUB play_one_sample(48)
  13107.     GOSUB affiche_sample
  13108.   CASE 13                       ! Fine
  13109.     GOSUB dialog("ADJUST FINE POSITION","What cursor do you|want to adjust?","Left|Right|Cancel",MOUSEX,MOUSEY)
  13110.     IF bouton%=0
  13111.       a%=FN sample_editor.set_fine_position(mark_1%)
  13112.       mark_len%=SUB(ADD(mark_1%,mark_len%),a%)
  13113.       mark_1%=a%
  13114.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13115.     ELSE IF bouton%=1
  13116.       a%=FN sample_editor.set_fine_position(ADD(mark_1%,mark_len%))
  13117.       mark_len%=SUB(a%,mark_1%)
  13118.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13119.     ENDIF
  13120.     GOSUB affiche_panneau_sample
  13121.   CASE 14                       ! Swap cursor
  13122.     GOSUB swap_block_cursors
  13123.     GOSUB mise_a_jour_sample_buffer(TRUE)
  13124.     GOSUB affiche_sample
  13125.   CASE 15                       ! Reset cursors
  13126.     IF win_lon%<>FN lon_buffer
  13127.       win_pos%=0                        ! 1) Fenetre maximale
  13128.       win_lon%=FN lon_buffer
  13129.     ELSE
  13130.       mark_1%=0                         ! 2) Block maximum
  13131.       mark_len%=FN lon_buffer
  13132.       se.volume_ok!=FALSE
  13133.       noact_delay%=5
  13134.     ENDIF
  13135.     GOSUB affiche_sample
  13136.   CASE 16                       ! Load sample
  13137.     se.pas_sous_menu!=TRUE
  13138.     GOSUB load_sample(TRUE)
  13139.     se.pas_sous_menu!=FALSE
  13140.   CASE 17                       ! Save sample
  13141.     se.pas_sous_menu!=TRUE
  13142.     GOSUB save_sample(TRUE)
  13143.     se.pas_sous_menu!=FALSE
  13144.   ENDSELECT
  13145.   GOSUB affiche_icone(srt%,2,orc%,ory%,0)
  13146. RETURN
  13147. PROCEDURE sample_editor.indicateurs_principaux
  13148.   SELECT srt%
  13149.     ' ------------------------------------------------------------------------
  13150.   CASE 0                        ! Left position
  13151.     GOSUB edite_chaine(HEX$(win_pos%,6),ADD(orc%,divbi&(0,0,3)),ADD(ory%,ADD(divbi&(1,0,3),2)),6,1)
  13152.     a%=VAL("$"+bbbb$) AND -2
  13153.     IF a%>=0 AND a%<=mark_1%
  13154.       win_pos%=a%
  13155.     ENDIF
  13156.     ' ------------------------------------------------------------------------
  13157.   CASE 1                        ! Left cursor
  13158.     GOSUB edite_chaine(HEX$(mark_1%,6),ADD(orc%,divbi&(0,1,3)),ADD(ory%,ADD(divbi&(1,1,3),2)),6,1)
  13159.     a%=VAL("$"+bbbb$) AND -2
  13160.     IF a%>=0 AND a%<ADD(mark_1%,mark_len%)
  13161.       mark_len%=SUB(ADD(mark_1%,mark_len%),a%)
  13162.       mark_1%=a%
  13163.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13164.     ENDIF
  13165.     ' ------------------------------------------------------------------------
  13166.   CASE 2                        ! Bits
  13167.     GOSUB dialog("CONVERT BUFFER","DO YOU REALLY WANT|TO CONVERT BUFFER|TO "+STR$(SHL(SUB(3,win_bits%),3))+" BITS ?","OK|CANCEL",MOUSEX,MOUSEY)
  13168.     IF bouton%=0
  13169.       GOSUB bee(TRUE)
  13170.       a%=FN adr_buffer
  13171.       IF win_bits%=1                      ! De 8 a 16
  13172.         MUL mark_1%,2
  13173.         MUL mark_len%,2
  13174.         MUL mark_2%,2
  13175.         MUL mark_rep%,2
  13176.         MUL win_pos%,2
  13177.         MUL win_lon%,2
  13178.         win_bits%=2
  13179.         GOSUB mise_a_jour_sample_buffer(TRUE)
  13180.         b%=SHR(FN lon_buffer,1)
  13181.         ~C:g_copy_sample_8_2_16%(L:a%,L:a%,L:b%)
  13182.       ELSE                                ! de 16 a 8
  13183.         mark_1%=SHR(mark_1%,1) AND -2
  13184.         mark_len%=SHR(mark_len%,1) AND -2
  13185.         mark_2%=SHR(mark_2%,1) AND -2
  13186.         mark_rep%=SHR(mark_rep%,1) AND -2
  13187.         win_pos%=SHR(win_pos%,1) AND -2
  13188.         win_lon%=SHR(win_lon%,1) AND -2
  13189.         win_bits%=1
  13190.         GOSUB mise_a_jour_sample_buffer(TRUE)
  13191.         b%=FN lon_buffer
  13192.         ~C:g_copy_sample_16_2_8%(L:a%,L:a%,L:b%)
  13193.         b%=SHR(b%,1)
  13194.         GOSUB clear_mem(ADD(a%,b%),b%)
  13195.       ENDIF
  13196.     ENDIF
  13197.     GOSUB affiche_sample
  13198.     ' ------------------------------------------------------------------------
  13199.   CASE 3                        ! Block length
  13200.     GOSUB edite_chaine(HEX$(mark_len%,6),ADD(orc%,divbi&(0,3,3)),ADD(ory%,ADD(divbi&(1,3,3),2)),6,1)
  13201.     a%=VAL("$"+bbbb$) AND -2
  13202.     IF a%>0 AND ADD(mark_1%,a%)<=FN lon_buffer
  13203.       mark_len%=a%
  13204.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13205.     ENDIF
  13206.     ' ------------------------------------------------------------------------
  13207.   CASE 5                        ! Repeat pos
  13208.     GOSUB edite_chaine(HEX$(mark_rep%,6),ADD(orc%,divbi&(0,5,3)),ADD(ory%,ADD(divbi&(1,5,3),2)),6,1)
  13209.     a%=VAL("$"+bbbb$) AND -2
  13210.     IF a%>=0 AND a%<FN lon_buffer
  13211.       mark_rep%=a%
  13212.     ENDIF
  13213.     ' ------------------------------------------------------------------------
  13214.   CASE 6                        ! Buffer frequency
  13215.     GOSUB edite_chaine(STR$(freq_buffer%,5),ADD(orc%,divbi&(0,6,3)),ADD(ory%,ADD(divbi&(1,6,3),2)),5,2)
  13216.     GOSUB se.change_buffer_frequency(VAL(bbbb$),TRUE)
  13217.     ' ------------------------------------------------------------------------
  13218.   CASE 7                        ! Sample number
  13219.     IF km%=1                            ! Bouton gauche : edite le numero
  13220.       GOSUB edite_chaine(HEX$(sample%,2),ADD(orc%,divbi&(0,7,3)),ADD(ory%,ADD(divbi&(1,7,3),2)),2,1)
  13221.       a%=VAL("$"+bbbb$)
  13222.       IF a%>0
  13223.         sample%=a%
  13224.       ENDIF
  13225.     ELSE                                ! Bouton droit : menu 'Samples' du panneau principal
  13226.       GOSUB wait_mouse(TRUE)
  13227.       GOSUB affiche_icones_sample
  13228.       GOSUB bee(FALSE)
  13229.       ss_menu%=4
  13230.       REPEAT
  13231.         SHOWM
  13232.         MOUSE xm%,ym%,km%
  13233.         IF km%<>0 AND ym%>34 AND ym%<105 AND xm%>159 AND xm%<640
  13234.           GOSUB gere_icones_sample
  13235.         ELSE IF km%<>0
  13236.           a%=1
  13237.         ELSE
  13238.           a%=0
  13239.         ENDIF
  13240.         IF GEMDOS(11)<>0
  13241.           a%=SHR(GEMDOS(7),16)
  13242.         ENDIF
  13243.       UNTIL (a% AND 255)=1              ! ESC pour sortir de la
  13244.       GOSUB affiche_panneau_sample
  13245.     ENDIF
  13246.     ' ------------------------------------------------------------------------
  13247.   CASE 8                        ! Right cursor
  13248.     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)
  13249.     a%=VAL("$"+bbbb$) AND -2
  13250.     IF a%>mark_1% AND a%<=FN lon_buffer
  13251.       mark_len%=SUB(a%,mark_1%)
  13252.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13253.     ENDIF
  13254.     ' ------------------------------------------------------------------------
  13255.   CASE 9                        ! Right position
  13256.     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)
  13257.     a%=VAL("$"+bbbb$) AND -2
  13258.     IF a%>ADD(mark_1%,mark_len%) AND a%<=FN lon_buffer
  13259.       win_lon%=SUB(a%,win_pos%)
  13260.     ENDIF
  13261.     ' ------------------------------------------------------------------------
  13262.   ENDSELECT
  13263.   GOSUB affiche_sample
  13264. RETURN
  13265. PROCEDURE sample_editor.touches
  13266.   IF GEMDOS(11)<>0            ! Une touche ?
  13267.     clavier%=GEMDOS(7)
  13268.     GOSUB vide_buffer_clavier
  13269.     touch_ascii%=clavier% AND 255
  13270.     clavier%=SHR(clavier%,16) AND 4095
  13271.     GOSUB vide_buffer_clavier
  13272.     SELECT clavier%
  13273.       ' ----------------------------------------------------------------------
  13274.     CASE 57                   ! Espace : Swap cursors
  13275.       GOSUB swap_block_cursors
  13276.       GOSUB mise_a_jour_sample_buffer(TRUE)
  13277.       GOSUB affiche_sample
  13278.       ' ----------------------------------------------------------------------
  13279.     CASE 71                   ! Clr Home : sample + 1
  13280.       sample%=MIN(SUCC(sample%),255)
  13281.       GOSUB affiche_sample
  13282.       ' ----------------------------------------------------------------------
  13283.     CASE 82                   ! Insert : sample - 1
  13284.       sample%=MAX(PRED(sample%),1)
  13285.       GOSUB affiche_sample
  13286.       ' ----------------------------------------------------------------------
  13287.     CASE 3097                 ! Ctrl + Alt + P : SnapShot
  13288.       GOSUB snapshot
  13289.       ' ----------------------------------------------------------------------
  13290.     ENDSELECT
  13291.   ENDIF
  13292. RETURN
  13293. PROCEDURE sample_editor.affiche_sm
  13294.   LOCAL iii%
  13295.   FOR iii%=0 TO 10
  13296.     IF iii%=PRED(ss_menu2%)
  13297.       GOSUB cadre_texte2_b(divbn$(iii%,4),ADD(orc%,divbi&(0,iii%,4)),ADD(ory%,divbi&(1,iii%,4)),divbi&(2,iii%,4),-1)
  13298.     ELSE
  13299.       GOSUB cadre_texte2(divbn$(iii%,4),ADD(orc%,divbi&(0,iii%,4)),ADD(ory%,divbi&(1,iii%,4)),divbi&(2,iii%,4),0)
  13300.     ENDIF
  13301.   NEXT iii%
  13302.   GOSUB cadre_int(orc%,ADD(ory%,80),79,59,13,13,14,12)
  13303.   GOSUB wait_mouse(TRUE)
  13304.   SELECT ss_menu2%
  13305.   CASE 1 TO 4
  13306.     ON ss_menu2% GOSUB se.sm_affsm_volume,se.sm_affsm_mix,se.sm_affsm_record,se.sm_affsm_marks
  13307.   CASE 5 TO 8
  13308.     ON SUB(ss_menu2%,4) GOSUB se.sm_affsm_freq,se.sm_affsm_delay,se.sm_affsm_flanger,se.sm_affsm_reverb
  13309.   CASE 9 TO 12
  13310.     ON SUB(ss_menu2%,8) GOSUB se.sm_affsm_song2disk,se.sm_affsm_compression,se.sm_affsm_distortion
  13311.   ENDSELECT
  13312. RETURN
  13313. FUNCTION sample_editor.set_fine_position(curs%)
  13314.   LOCAL a%,b%,oldcurs%
  13315.   LOCAL clavier%,ascii_code%,scan_code%
  13316.   LOCAL exit_flag!
  13317.   ' Detourne les variables suivantes:
  13318.   LOCAL hwin%,lwin%,win_pos%,win_lon%
  13319.   LOCAL xm%,ym%,km%
  13320.   '
  13321.   ' Affichage de la fenetre Sample plein ecran
  13322.   '
  13323.   CLS
  13324.   hwin%=SUB(scr_haut%,8) AND -8
  13325.   lwin%=SUB(scr_larg%,32)
  13326.   GOSUB cadre_int(0,0,PRED(scr_ncol%),ADD(hwin%,7),9,9,10,8)
  13327.   GOSUB cadre_ext(2,4,PRED(SHR(lwin%,3)),PRED(hwin%),0,9,8,10)   ! Fenetre du sample
  13328.   win_lon%=SHL(SUB(scr_ncol%,4),3)
  13329.   GOSUB sample_editor.set_fine_position.redraw
  13330.   '
  13331.   ' Gestion du curseur
  13332.   '
  13333.   exit_flag!=FALSE
  13334.   REPEAT
  13335.     oldcurs%=curs%
  13336.     IF GEMDOS(11)<>0
  13337.       KEYGET clavier%
  13338.       GOSUB vide_buffer_clavier
  13339.       clavier%=clavier% AND &H1FFF00FF
  13340.       a%=FN key_trafique_code_clavier(clavier%)
  13341.       clavier%=LONG{a%}
  13342.       scan_code%=SHR(clavier%,16) AND 255
  13343.       ascii_code%=clavier% AND 255
  13344.       SELECT scan_code%
  13345.       CASE 1,57       ! Esc, Space bar
  13346.         exit_flag!=TRUE
  13347.       CASE 75         ! Left
  13348.         GOSUB sample_editor.set_fine_position.to_left
  13349.       CASE 77         ! Right
  13350.         GOSUB sample_editor.set_fine_position.to_right
  13351.       DEFAULT
  13352.         SELECT ascii_code
  13353.         CASE 13       ! Return/Enter
  13354.           exit_flag!=TRUE
  13355.         ENDSELECT
  13356.       ENDSELECT
  13357.     ENDIF
  13358.     MOUSE xm%,ym%,km%
  13359.     IF km%=1
  13360.       IF xm%>=16 AND xm%<ADD(lwin%,16)
  13361.         curs%=ADD(win_pos%,SUB(xm%,16))
  13362.       ELSE
  13363.         IF xm%<16
  13364.           GOSUB sample_editor.set_fine_position.to_left
  13365.         ELSE
  13366.           GOSUB sample_editor.set_fine_position.to_right
  13367.         ENDIF
  13368.       ENDIF
  13369.     ELSE IF km%=2
  13370.       exit_flag!=TRUE
  13371.     ENDIF
  13372.     IF curs%<>oldcurs%
  13373.       HIDEM
  13374.       GOSUB efface_curseur(SUB(oldcurs%,win_pos%),1)
  13375.       GOSUB affiche_curseur(SUB(curs%,win_pos%),1)
  13376.       SHOWM
  13377.     ENDIF
  13378.   UNTIL exit_flag!
  13379.   RETURN curs%
  13380. ENDFUNC
  13381. PROCEDURE sample_editor.set_fine_position.to_left
  13382.   curs%=MIN(win_pos%,ADD(win_pos%,SUB(SHR(win_lon%,1),128)))
  13383.   oldcurs%=curs%
  13384.   GOSUB sample_editor.set_fine_position.redraw
  13385. RETURN
  13386. PROCEDURE sample_editor.set_fine_position.to_right
  13387.   curs%=MIN(MAX(ADD(win_pos%,win_lon%),ADD(win_pos%,ADD(SHR(win_lon%,1),128))),FN lon_buffer) AND -2
  13388.   oldcurs%=curs%
  13389.   GOSUB sample_editor.set_fine_position.redraw
  13390. RETURN
  13391. PROCEDURE sample_editor.set_fine_position.redraw
  13392.   win_pos%=MIN(MAX(SUB(curs%,SHR(win_lon%,1)),0),SUB(FN lon_buffer,win_lon%)) AND -2
  13393.   a%=ADD(FN adr_buffer,win_pos%)
  13394.   b%=SHR(SUB(scr_ncol%,4),1)
  13395.   HIDEM
  13396.   ~C:g_affiche_sample%(L:a%,L:win_lon%,W:win_bits%,W:4,W:b%,W:hwin%)
  13397.   GOSUB affiche_curseur(SUB(curs%,win_pos%),1)
  13398.   SHOWM
  13399. RETURN
  13400. ' Affichage
  13401. PROCEDURE affiche_sample                !!!
  13402.   ' Point de repetition a afficher
  13403.   LOCAL a%,b%,c%,d%,e%,i%,k,l
  13404.   GOSUB mise_a_jour_sample_buffer(FALSE)
  13405.   GOSUB bee(FALSE)
  13406.   ~FRE(0)
  13407.   IF win_lon%>0
  13408.     a%=ADD(FN adr_buffer,win_pos%)
  13409.     b%=SHR(lwin%,4)
  13410.     HIDEM
  13411.     ~C:g_affiche_sample%(L:a%,L:win_lon%,W:win_bits%,W:4,W:b%,W:hwin%)
  13412.   ENDIF
  13413.   GOSUB affchaine_notrans(HEX$(win_pos%,6),ADD(orc%,divbi&(0,0,3)),ADD(ory%,2),1)
  13414.   GOSUB affchaine_notrans(HEX$(mark_1%,6),ADD(orc%,divbi&(0,1,3)),ADD(ory%,2),1)
  13415.   GOSUB affchaine_notrans(STR$(SHL(win_bits%,3),2),ADD(orc%,divbi&(0,2,3)),ADD(ory%,2),1)
  13416.   GOSUB affchaine_notrans(HEX$(mark_len%,6),ADD(orc%,divbi&(0,3,3)),ADD(ory%,2),1)
  13417.   GOSUB affchaine_notrans(HEX$(FN lon_buffer,6),ADD(orc%,divbi&(0,4,3)),ADD(ory%,2),1)
  13418.   GOSUB affchaine_notrans(HEX$(mark_rep%,6),ADD(orc%,divbi&(0,5,3)),ADD(ory%,2),1)
  13419.   GOSUB affchaine_notrans(STR$(freq_buffer%,5),ADD(orc%,divbi&(0,6,3)),ADD(ory%,2),1)
  13420.   GOSUB affchaine_notrans(HEX$(sample%,2),ADD(orc%,divbi&(0,7,3)),ADD(ory%,2),1)
  13421.   GOSUB affchaine_notrans(HEX$(ADD(mark_1%,mark_len%),6),ADD(orc%,divbi&(0,8,3)),ADD(ory%,2),1)
  13422.   GOSUB affchaine_notrans(HEX$(ADD(win_pos%,win_lon%),6),ADD(orc%,divbi&(0,9,3)),ADD(ory%,2),1)
  13423.   GOSUB affiche_2_curs
  13424.   SHOWM
  13425. RETURN
  13426. PROCEDURE affiche_fft
  13427.   ' Affichage de la FFT
  13428.   LOCAL a%,b%,c%,d%,e%,i%,k,l
  13429.   IF scr_haut%>=220
  13430.     GOSUB bee(FALSE)
  13431.     e%=SUB(scr_larg%,32)
  13432.     GOSUB cadre_ext(2,ADD(ory%,144),PRED(SHR(e%,3)),SUB(scr_haut%,ADD(ory%,149)),0,9,8,10)
  13433.     IF se.freq_fftdisp%=1
  13434.       k=SUB(scr_haut%,ADD(ory%,148))/LOG(&H7FFF)
  13435.     ELSE
  13436.       a%=1
  13437.       FOR i%=0 TO PRED(se.freq_fftlon%)
  13438.         a%=MAX(a%,fft&(i%))
  13439.       NEXT i%
  13440.       k=SUB(scr_haut%,ADD(ory%,148))/a%
  13441.     ENDIF
  13442.     l=se.freq_fftlon%/e%
  13443.     HIDEM
  13444.     FOR i%=0 TO PRED(e%)
  13445.       IF se.freq_fftdisp%=1
  13446.         b%=LOG(MAX(fft&(INT(i%*l)),1))*k
  13447.       ELSE
  13448.         b%=fft&(INT(i%*l))*k
  13449.       ENDIF
  13450.       IF b%>=1
  13451.         a%=SUB(scr_haut%,ADD(b%,4))
  13452.         c%=i%
  13453.         ~C:g_affiche_marqueur_sample%(L:e%,W:1,W:a%,W:e%,W:b%,L:c%,W:0)
  13454.       ENDIF
  13455.     NEXT i%
  13456.     IF se.freq_fftnoteon!
  13457.       c%=MUL(SUB(se.freq_ofn%,se.freq_fftmin%),e%)/SUB(se.freq_fftmax%,se.freq_fftmin%)
  13458.       IF c%>=0 AND c%<e%                            ! La note proposee pour le sample
  13459.         a%=ADD(ory%,144)
  13460.         b%=SUB(scr_haut%,ADD(ory%,148))
  13461.         ~C:g_affiche_marqueur_sample%(L:e%,W:1,W:a%,W:e%,W:b%,L:c%,W:1)
  13462.       ENDIF
  13463.     ENDIF
  13464.   ENDIF
  13465.   SHOWM
  13466. RETURN
  13467. PROCEDURE affiche_panneau_sample
  13468.   ' En entree : orc%, ory%, hwin%, scr_ncol% et parametres de fenetre
  13469.   LOCAL i%
  13470.   CLS
  13471.   GOSUB bee(FALSE)
  13472.   GOSUB cadre_int(0,0,PRED(scr_ncol%),ADD(hwin%,7),9,9,10,8)
  13473.   GOSUB cadre_ext(2,4,PRED(SHR(lwin%,3)),PRED(hwin%),0,9,8,10)  ! Fenetre du sample
  13474.   GOSUB cadre_ext(ADD(SHR(lwin%,3),4),4,1,PRED(hwin%),0,9,8,10) ! Vu-metre G
  13475.   GOSUB cadre_ext(ADD(SHR(lwin%,3),8),4,1,PRED(hwin%),0,9,8,10) ! Vu-metre D
  13476.   GOSUB cadre_int(orc%,ory%,79,19,13,13,14,12)                  ! Infos buffer
  13477.   GOSUB cadre_int(orc%,ADD(ory%,20),79,59,9,9,10,8)             ! Menu general
  13478.   FOR i%=0 TO 9
  13479.     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)
  13480.     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)
  13481.   NEXT i%
  13482.   GOSUB affiche_bloc_icones(0,18,2,orc%,ory%)
  13483.   GOSUB grise_icone(5,2,orc%,ory%)              ! Swap Sample and Block
  13484.   GOSUB sample_editor.affiche_sm
  13485.   GOSUB affiche_sample
  13486. RETURN
  13487. PROCEDURE affiche_curseur(pos%,plan%)
  13488.   ' Affiche un curseur de sample
  13489.   ~C:g_affiche_marqueur_sample%(L:win_lon%,W:win_bits%,W:4,W:lwin%,W:hwin%,L:pos%,W:plan%)
  13490. RETURN
  13491. PROCEDURE efface_curseur(pos%,plan%)
  13492.   ' Efface un curseur de sample
  13493.   ~C:g_efface_marqueur_sample%(L:win_lon%,W:win_bits%,W:4,W:lwin%,W:hwin%,L:pos%,W:plan%)
  13494. RETURN
  13495. PROCEDURE affiche_2_curs
  13496.   HIDEM
  13497.   GOSUB affiche_curseur(SUB(mark_1%,win_pos%),1)
  13498.   GOSUB affiche_curseur(SUB(ADD(mark_1%,mark_len%),win_pos%),1)
  13499.   IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13500.     GOSUB affiche_curseur(SUB(mark_2%,win_pos%),2)
  13501.   ENDIF
  13502.   SHOWM
  13503. RETURN
  13504. PROCEDURE efface_2_curs
  13505.   HIDEM
  13506.   IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13507.     GOSUB efface_curseur(SUB(mark_2%,win_pos%),2)
  13508.   ENDIF
  13509.   GOSUB efface_curseur(SUB(ADD(mark_1%,mark_len%),win_pos%),1)
  13510.   GOSUB efface_curseur(SUB(mark_1%,win_pos%),1)
  13511.   SHOWM
  13512. RETURN
  13513. ' Divers
  13514. PROCEDURE se.change_buffer_frequency(freq%,disp!)
  13515.   ' Change proprement la frequence du buffer
  13516.   ' Pas de changement si la valeur est trop petite/trop grande
  13517.   ' Reinitialise les parametres FFT
  13518.   IF freq%>=2000 AND freq%<65536
  13519.     freq_buffer%=freq%
  13520.   ENDIF
  13521.   se.freq_fft_pend%=SHR(freq_buffer%,1)
  13522.   se.freq_fft_pstart%=0
  13523.   IF disp!
  13524.     GOSUB affiche_sample
  13525.     IF ss_menu2%=5
  13526.       GOSUB se.sm_actsm_freq
  13527.     ENDIF
  13528.   ENDIF
  13529. RETURN
  13530. PROCEDURE mise_a_jour_sample_buffer(flag!)
  13531.   ' Mise a jour de la fenetre
  13532.   mark_1%=MAX(MIN(SUB(FN lon_buffer,2),mark_1%),0) AND -2               ! Marqueur de debut de bloc dans le sample
  13533.   mark_len%=MAX(MIN(mark_len%,SUB(FN lon_buffer,mark_1%)),2) AND -2     ! Marqueur de fin de bloc
  13534.   mark_2%=MAX(MIN(mark_2%,FN lon_buffer),0) AND -2                      ! Ancien marqueur de fin (pointilles)
  13535.   mark_rep%=MIN(MAX(mark_1%,mark_rep%),ADD(mark_1%,SUB(mark_len%,2)))   ! Marqueur de repetition
  13536.   win_pos%=MAX(MIN(win_pos%,mark_1%),0) AND -2                          ! Debut de la fenetre de sample
  13537.   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
  13538.   IF flag!
  13539.     se.volume_ok!=FALSE                                           ! Le bloc a pu etre modifie
  13540.   ENDIF
  13541.   noact_delay%=5
  13542. RETURN
  13543. PROCEDURE play_one_sample(note%)
  13544.   ' Joue le buffer a la note note%
  13545.   ' Sans repetition pour l'instant
  13546.   LOCAL a%,b%,adr_arret%,old_note%,old_mark_2%
  13547.   LOCAL flag_a!
  13548.   LOCAL repeatbuffer$
  13549.   repeatbuffer$=STRING$(1024,0)
  13550.   old_note%=note%                               ! Memorise la note d'entree
  13551.   old_mark_2%=mark_2%
  13552.   HIDEM
  13553.   REPEAT
  13554.     IF MOUSEK=1                                 ! Bouton gauche de la souris : rejoue la note
  13555.       note%=old_note%
  13556.     ENDIF
  13557.     IF note%<>0
  13558.       CARD{ADD(V:info_tr$,2)}=win_bits%
  13559.       CARD{ADD(V:info_tr$,4)}=freq_buffer%
  13560.       CARD{ADD(V:info_tr$,6)}=&H800
  13561.       CARD{ADD(V:info_tr$,10)}=note%
  13562.       LONG{ADD(V:info_tr$,12)}=ADD(FN adr_buffer,mark_1%)
  13563.       LONG{ADD(V:info_tr$,22)}=MAX(SUB(mark_len%,2),0)
  13564.       LONG{ADD(V:info_tr$,26)}=2
  13565.       LONG{ADD(V:info_tr$,30)}=V:repeatbuffer$
  13566.       a%=V:info_tr$
  13567.       b%=preset&(curs_col%,n_preset%)
  13568.       adr_arret%=C:rr_play_one_sample%(L:a%,W:b%)
  13569.       note%=0
  13570.       flag_a!=FALSE
  13571.       GOSUB wait_mouse(TRUE)
  13572.     ENDIF
  13573.     IF GEMDOS(11)<>0
  13574.       ~GEMDOS(7)
  13575.       flag_a!=TRUE
  13576.     ELSE IF MOUSEK=2
  13577.       flag_a!=TRUE
  13578.     ENDIF
  13579.     VSYNC
  13580.     IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13581.       GOSUB efface_curseur(SUB(mark_2%,win_pos%),2)
  13582.     ENDIF
  13583.     mark_2%=ADD(mark_1%,LONG{ADD(adr_arret%,16)}) AND -2        ! Memorise la position du sample
  13584.     IF mark_2%=>win_pos% AND mark_2%<=ADD(win_pos%,win_lon%)
  13585.       GOSUB affiche_curseur(SUB(mark_2%,win_pos%),2)
  13586.     ENDIF
  13587.   UNTIL LONG{ADD(adr_arret%,22)}=0 OR flag_a!   ! Attend la fin naturelle du sample ou stop utilisateur
  13588.   IF NOT flag_a!                                ! Pas de stop utilisateur: ne memorise pas la nouvelle position
  13589.     mark_2%=old_mark_2%
  13590.   ENDIF
  13591.   CARD{ADD(V:info_tr$,2)}=win_bits%             ! Stop
  13592.   CARD{ADD(V:info_tr$,4)}=freq_buffer%
  13593.   CARD{ADD(V:info_tr$,6)}=0
  13594.   CARD{ADD(V:info_tr$,10)}=48
  13595.   LONG{ADD(V:info_tr$,12)}=FN adr_buffer
  13596.   LONG{ADD(V:info_tr$,22)}=0
  13597.   LONG{ADD(V:info_tr$,26)}=2
  13598.   LONG{ADD(V:info_tr$,30)}=FN adr_buffer
  13599.   a%=V:info_tr$
  13600.   b%=preset&(curs_col%,n_preset%)
  13601.   ~C:rr_play_one_sample%(L:a%,W:b%)
  13602.   GOSUB wait_mouse(TRUE)
  13603. RETURN
  13604. PROCEDURE copy_sample_to_block
  13605.   LOCAL a%,b%,c%,d%
  13606.   a%=MUL(DIV(FN length(sample%),FN resol(sample%)),win_bits%) AND -2    ! Place prise dans le buffer apres conversion
  13607.   b%=FN adresse(sample%)                ! Adresse du sample
  13608.   c%=ADD(FN adr_buffer,mark_1%)         ! Adresse destination
  13609.   IF win_bits%<>FN resol(sample%)       ! On doit faire une conversion de resolution ?
  13610.     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)
  13611.     IF bouton%=0        ! Conversion ok
  13612.       IF a%>mark_len%
  13613.         GOSUB dialog("COPY TO BLOCK","Copy sample #"+HEX$(sample%,2)+" to block.|Sample is too large :","Clip|Overflow|Cancel",xm%,ym%)
  13614.         IF bouton%=0            ! Clip
  13615.           GOSUB bee(TRUE)
  13616.           IF win_bits%=2
  13617.             d%=SHR(mark_len%,1)
  13618.             ~C:g_copy_sample_8_2_16%(L:b%,L:c%,L:d%)
  13619.           ELSE
  13620.             d%=SHL(mark_len%,1)
  13621.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  13622.           ENDIF
  13623.           mark_2%=MIN(ADD(mark_1%,a%),FN lon_buffer)    ! Pointe sur la fin virtuelle du sample
  13624.         ELSE IF bouton%=1       ! Overflow
  13625.           mark_2%=ADD(mark_1%,mark_len%)        ! Sauve l'ancienne position
  13626.           mark_len%=MIN(a%,SUB(FN lon_buffer,mark_1%))
  13627.           GOSUB bee(TRUE)
  13628.           IF win_bits%=2
  13629.             d%=SHR(mark_len%,1)
  13630.             ~C:g_copy_sample_8_2_16%(L:b%,L:c%,L:d%)
  13631.           ELSE
  13632.             d%=SHL(mark_len%,1)
  13633.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  13634.           ENDIF
  13635.         ENDIF
  13636.       ELSE                      ! Ca tient
  13637.         GOSUB bee(TRUE)
  13638.         IF win_bits%=2
  13639.           d%=SHR(a%,1)
  13640.           ~C:g_copy_sample_8_2_16%(L:b%,L:c%,L:d%)
  13641.         ELSE
  13642.           d%=SHL(a%,1)
  13643.           ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  13644.         ENDIF
  13645.         mark_2%=ADD(mark_1%,a%)         ! Pointe sur la fin du sample
  13646.       ENDIF
  13647.       freq_buffer%=FN freqech(sample%)
  13648.     ENDIF
  13649.   ELSE                  ! C'est le meme nombre de bits pour le buffer et le sample
  13650.     IF a%>mark_len%
  13651.       GOSUB dialog("COPY TO BLOCK","Copy sample #"+HEX$(sample%,2)+" to block.|Sample is too large :","Clip|Overflow|Cancel",xm%,ym%)
  13652.       IF bouton%=0      ! Clip
  13653.         GOSUB bee(TRUE)
  13654.         BMOVE b%,c%,mark_len%
  13655.         mark_2%=MIN(ADD(mark_1%,a%),FN lon_buffer)      ! Pointe sur la fin virtuelle du sample
  13656.         freq_buffer%=FN freqech(sample%)
  13657.       ELSE IF bouton%=1 ! Overflow
  13658.         GOSUB bee(TRUE)
  13659.         mark_2%=ADD(mark_1%,mark_len%)  ! Sauve l'ancienne position
  13660.         mark_len%=MIN(a%,SUB(FN lon_buffer,mark_1%))
  13661.         BMOVE b%,c%,mark_len%
  13662.         freq_buffer%=FN freqech(sample%)
  13663.       ENDIF
  13664.     ELSE                ! Ca tient
  13665.       GOSUB bee(TRUE)
  13666.       BMOVE b%,c%,a%
  13667.       mark_2%=ADD(mark_1%,a%)   ! Pointe sur la fin du sample
  13668.       freq_buffer%=FN freqech(sample%)
  13669.     ENDIF
  13670.   ENDIF
  13671.   GOSUB mise_a_jour_sample_buffer(TRUE)
  13672.   GOSUB bee(FALSE)
  13673.   GOSUB affiche_sample
  13674. RETURN
  13675. PROCEDURE copy_block_to_sample
  13676.   LOCAL a%,b%
  13677.   GOSUB dialog("COPY TO SAMPLE","Copy block to|sample #"+HEX$(sample%,2)+" ?","Ok|Cancel",MOUSEX,MOUSEY)
  13678.   a%=SUB(mark_len%,FN length(sample%))  ! Difference de taille entre le nouveau et l'ancien sample
  13679.   IF bouton%=0
  13680.     GOSUB bee(TRUE)
  13681.     IF a%>0             ! On manque de place
  13682.       IF SUB(FN lon_buffer,ADD(mark_1%,mark_len%))<a%
  13683.         ' S'il n'y a pas assez de place a droite du block pour creer un nouveau sample, rotation
  13684.         b%=FN length(sample%)
  13685.         GOSUB chg_taille_sample(sample%,0)      ! Vide d'abord le sample
  13686.         GOSUB chg_sam_length(sample%,0)
  13687.         GOSUB chg_sam_repeat(sample%,0)
  13688.         GOSUB chg_sam_replen(sample%,2)
  13689.         mark_len%=MIN(mark_len%,SUB(FN lon_buffer,256))   ! Si jamais on essaie de remplacer tt le buffer (->len=0)
  13690.         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)
  13691.         GOSUB mem_rotation(FN adresse(sample%),SUB(ADD(FN adr_buffer,ADD(mark_1%,mark_len%)),FN adresse(sample%)),mark_len%)
  13692.         GOSUB chg_sam_length(sample%,mark_len%)
  13693.         IF sample%<255                          ! Reactualise les adresses des samples deplaces
  13694.           FOR i%=SUCC(sample%) TO 255
  13695.             LONG{ADD(r_adr_sample%,SHL(i%,2))}=ADD(LONG{ADD(r_adr_sample%,SHL(i%,2))},mark_len%)
  13696.           NEXT i%
  13697.         ENDIF
  13698.         GOSUB mise_a_jour_sample_buffer(TRUE)
  13699.       ELSE              ! Sinon on elimine la fin du buffer pour faire de la place dans les samples
  13700.         BMOVE FN adr_buffer,ADD(FN adr_buffer,a%),SUB(FN lon_buffer,a%)
  13701.         GOSUB chg_taille_sample(sample%,mark_len%)
  13702.         GOSUB chg_sam_length(sample%,mark_len%)
  13703.         GOSUB mise_a_jour_sample_buffer(FALSE)
  13704.         BMOVE ADD(FN adr_buffer,mark_1%),FN adresse(sample%),mark_len%
  13705.       ENDIF
  13706.     ELSE IF a%<0        ! On va creer de la place
  13707.       GOSUB chg_taille_sample(sample%,mark_len%)        ! Deplace d'abord les samples
  13708.       GOSUB chg_sam_length(sample%,mark_len%)
  13709.       GOSUB mise_a_jour_sample_buffer(FALSE)
  13710.       BMOVE SUB(FN adr_buffer,a%),FN adr_buffer,ADD(FN lon_buffer,a%)   ! Puis le buffer (les FN... sont pour le nouveau buffer)
  13711.       GOSUB clear_mem(ADD(FN adr_buffer,ADD(FN lon_buffer,a%)),-a%)
  13712.       BMOVE ADD(FN adr_buffer,mark_1%),FN adresse(sample%),mark_len%
  13713.     ELSE
  13714.       BMOVE ADD(FN adr_buffer,mark_1%),FN adresse(sample%),mark_len%
  13715.     ENDIF
  13716.     GOSUB chg_sam_freq(sample%,freq_buffer%)
  13717.     GOSUB chg_sam_nbits(sample%,win_bits%)
  13718.     GOSUB chg_sam_repeat(sample%,0)
  13719.     GOSUB chg_sam_replen(sample%,2)
  13720.     GOSUB chg_sam_volume(sample%,&H100)
  13721.     ~C:rr_boucle_sample%(W:sample%)
  13722.   ENDIF
  13723.   GOSUB bee(FALSE)
  13724.   GOSUB affiche_sample
  13725. RETURN
  13726. PROCEDURE swap_sample_and_block         !!!
  13727. RETURN
  13728. PROCEDURE swap_block_cursors
  13729.   LOCAL a%
  13730.   IF mark_2%>mark_1%
  13731.     a%=mark_2%
  13732.     mark_2%=ADD(mark_1%,mark_len%)
  13733.     mark_len%=SUB(a%,mark_1%)
  13734.   ENDIF
  13735. RETURN
  13736. '
  13737. ' Sous-menus du Sample Editor
  13738. ' ---------------------------
  13739. ' Volume
  13740. PROCEDURE se.sm_affsm_volume
  13741.   GOSUB cadre_int(orc%,ADD(ory%,80),29,29,13,13,14,12)          ! Cadre volume
  13742.   GOSUB cadre_int(orc%,ADD(ory%,110),29,29,13,13,14,12)         ! Cadre volume sur effets
  13743.   GOSUB cadre_int(ADD(orc%,30),ADD(ory%,80),17,59,13,13,14,12)  ! Cadre gain
  13744.   GOSUB cadre_int(ADD(orc%,48),ADD(ory%,80),31,59,13,13,14,12)  ! Cadre fade
  13745.   GOSUB affchaine_trans("GAIN",ADD(SHL(orc%,1),62),ADD(ory%,82),14)
  13746.   GOSUB affchaine_trans("FADE",ADD(SHL(orc%,1),98),ADD(ory%,82),14)
  13747.   GOSUB affchaine_trans("FADE PARAMETERS",ADD(SHL(orc%,1),98),ADD(ory%,107),14)
  13748.   GOSUB affchaine_trans("PRESETS",ADD(SHL(orc%,1),144),ADD(ory%,107),14)
  13749.   GOSUB affchaine_trans("VOLUME ON EFFECTS",ADD(SHL(orc%,1),2),ADD(ory%,117),14)
  13750.   GOSUB affiche_bloc_icones_b(0,15,5,orc%,ory%)
  13751.   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
  13752.   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
  13753.   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
  13754.   GOSUB se.sm_actsm_volume
  13755. RETURN
  13756. PROCEDURE se.sm_actsm_volume
  13757.   ' Var locales de Sample_Editor :
  13758.   ' Utilise aaaa$
  13759.   GOSUB affiche_icone_b(15,5,orc%,ory%,NOT se.flag_best_volume!)
  13760.   GOSUB affiche_icone_b(16,5,orc%,ory%,se.flag_best_volume!)
  13761.   IF se.volume_ok!
  13762.     aaaa$=FN pourcent$(se.volume_spl%,32768)
  13763.   ELSE
  13764.     aaaa$="     "
  13765.   ENDIF
  13766.   GOSUB affchaine_notrans(aaaa$,ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),1)
  13767.   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)
  13768.   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)
  13769.   GOSUB grise_icone(16,5,orc%,ory%)
  13770.   SHOWM
  13771. RETURN
  13772. PROCEDURE se.sm_gere_volume
  13773.   ' Var locales de Sample_Editor :
  13774.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  13775.   ' Utilise srt%, a%, aaaa$
  13776.   ~FRE(0)
  13777.   IF km%>0
  13778.     a%=V:divbi&(0,0,0)
  13779.     srt%=C:g_teste_icones%(L:a%,W:5,W:xm2%,W:ym2%)
  13780.     IF srt%>=0
  13781.       SELECT srt%
  13782.         ' Radio-boutons, Flip-flops ou champs de texte
  13783.         ' --------------------------------------------------------------------
  13784.       CASE 0                    ! Set volume
  13785.         IF NOT se.volume_ok!            ! Calcule le volume actuel si ce n'est deja fait
  13786.           GOSUB bee(TRUE)
  13787.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  13788.         ENDIF
  13789.         aaaa$=FN pourcent$(se.volume_spl%,32768)
  13790.         GOSUB edite_chaine(aaaa$,ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),5,3)
  13791.         GOSUB bee(TRUE)
  13792.         a%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)                  ! Nouveau volume
  13793.         GOSUB spl_chg_volume(mark_1%,mark_len%,VAL(aaaa$)*327.68,a%,a%,win_bits%)
  13794.         se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  13795.         se.volume_ok!=TRUE
  13796.         GOSUB affiche_sample
  13797.         GOSUB se.sm_actsm_volume
  13798.         ' --------------------------------------------------------------------
  13799.       CASE 11                   ! Fade start
  13800.         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)
  13801.         se.volume_fade_start%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)       ! Nouveau volume de debut de fade
  13802.         GOSUB se.sm_actsm_volume
  13803.         ' --------------------------------------------------------------------
  13804.       CASE 12                   ! Fade end
  13805.         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)
  13806.         se.volume_fade_end%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100) ! Nouveau volume de fin de fade
  13807.         GOSUB se.sm_actsm_volume
  13808.         ' --------------------------------------------------------------------
  13809.       CASE 15                   ! Volume : No change
  13810.         se.flag_best_volume!=FALSE
  13811.         GOSUB se.sm_actsm_volume
  13812.         ' --------------------------------------------------------------------
  13813.       CASE 16                   ! Volume : Best *** Non selectionnable pour l'instant ***
  13814.         ' se.flag_best_volume!=TRUE
  13815.         ' GOSUB se.sm_actsm_volume
  13816.         ' --------------------------------------------------------------------
  13817.       DEFAULT
  13818.         ' Icones normales
  13819.         GOSUB affiche_icone_b(srt%,5,orc%,ory%,-1)
  13820.         GOSUB wait_mouse(TRUE)
  13821.         SELECT srt%
  13822.           ' ------------------------------------------------------------------
  13823.         CASE 1                  ! Volume ?
  13824.           GOSUB bee(TRUE)
  13825.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  13826.           se.volume_ok!=TRUE
  13827.           GOSUB bee(FALSE)
  13828.           GOSUB se.sm_actsm_volume
  13829.           ' ------------------------------------------------------------------
  13830.         CASE 2 TO 9             ! +1, +2, +3, +6, -1, -2, -3, -6 dB
  13831.           GOSUB bee(TRUE)
  13832.           a%=10000*(10^(VAL(MID$("+1+2+3+6-1-2-3-6",SUB(SHL(srt%,1),3),2))/10))
  13833.           GOSUB spl_chg_volume(mark_1%,mark_len%,10000,a%,a%,win_bits%)
  13834.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  13835.           se.volume_ok!=TRUE
  13836.           GOSUB affiche_sample
  13837.           GOSUB se.sm_actsm_volume
  13838.           ' ------------------------------------------------------------------
  13839.         CASE 10                 ! Fade !
  13840.           GOSUB bee(TRUE)
  13841.           GOSUB spl_chg_volume(mark_1%,mark_len%,32768,se.volume_fade_start%,se.volume_fade_end%,win_bits%)
  13842.           se.volume_spl%=FN spl_cherche_volume(mark_1%,mark_len%,win_bits%)
  13843.           se.volume_ok!=TRUE
  13844.           GOSUB affiche_sample
  13845.           GOSUB se.sm_actsm_volume
  13846.           ' ------------------------------------------------------------------
  13847.         CASE 13                 ! Fade in
  13848.           se.volume_fade_start%=0
  13849.           se.volume_fade_end%=32768
  13850.           GOSUB se.sm_actsm_volume
  13851.           ' ------------------------------------------------------------------
  13852.         CASE 14                 ! Fade out
  13853.           se.volume_fade_start%=32768
  13854.           se.volume_fade_end%=0
  13855.           GOSUB se.sm_actsm_volume
  13856.           ' ------------------------------------------------------------------
  13857.         ENDSELECT
  13858.         GOSUB affiche_icone_b(srt%,5,orc%,ory%,0)
  13859.       ENDSELECT
  13860.       GOSUB wait_mouse(TRUE)
  13861.       GOSUB vide_buffer_clavier
  13862.     ENDIF
  13863.   ENDIF
  13864.   IF noact_delay%=1 AND (NOT se.volume_ok!)     ! Si le volume n'est plus valable suite a une manip
  13865.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,0,5),7)),ADD(ory%,ADD(divbi&(1,0,5),2)),1)
  13866.   ENDIF
  13867. RETURN
  13868. PROCEDURE spl_chg_volume(dddd%,llll%,vvvv1%,vvvv2%,vvvv3%,bbbb%)
  13869.   ' Change le volume du sample position dddd%, longueur llll%,
  13870.   ' ancien volume vvvv1%, nouveaux volumes vvvv2% et 3 (debut-fin)
  13871.   ' Bbbb% est la resolution du sample (1 ou 2)
  13872.   LOCAL aaaa%,iiii1%,iiii2%,vvvv4%
  13873.   IF llll%>0 AND vvvv1%<>0
  13874.     aaaa%=ADD(FN adr_buffer,dddd%)
  13875.     vvvv4%=vvvv2%*32768/vvvv1%
  13876.     iiii1%=INT(SUB(vvvv3%,vvvv2%)*32768/vvvv1%/SHR(llll%,PRED(bbbb%)))
  13877.     iiii2%=(SUB(vvvv3%,vvvv2%)*32768/vvvv1%/SHR(llll%,PRED(bbbb%))-iiii1%)*2147483647
  13878.     ~C:g_change_volume_sample%(L:aaaa%,L:llll%,L:vvvv4%,L:iiii1%,L:iiii2%,W:bbbb%)
  13879.   ENDIF
  13880. RETURN
  13881. ' Mixage
  13882. PROCEDURE se.sm_affsm_mix
  13883.   ' Var locales de Sample_Editor :
  13884.   ' Utilise i%, a% et b%
  13885.   GOSUB cadre_int(orc%,ADD(ory%,80),13,19,13,13,14,12)                  ! Cadre mix!
  13886.   GOSUB cadre_int(ADD(orc%,14),ADD(ory%,80),15,19,13,13,14,12)          ! Cadre master
  13887.   GOSUB cadre_int(ADD(orc%,30),ADD(ory%,80),9,19,13,13,14,12)           ! Cadre presets
  13888.   FOR i%=1 TO 5
  13889.     a%=ADD(orc%,MUL(DIV(i%,3),40))
  13890.     b%=ADD(ory%,ADD(80,MUL(i% MOD 3,20)))
  13891.     GOSUB cadre_int(a%,b%,1,19,13,13,14,12)                             ! Cadre piste 1a
  13892.     GOSUB cadre_int(ADD(a%,38),b%,1,19,13,13,14,12)                     ! Cadre piste 1b
  13893.     GOSUB cadre_int(SUCC(a%),b%,5,19,13,13,14,12)                       ! Cadre piste 2
  13894.     GOSUB affchaine_trans(STR$(i%),ADD(SHL(a%,1),5),ADD(b%,2),14)       ! Numero de piste
  13895.   NEXT i%
  13896.   GOSUB affiche_bloc_icones_b(0,46,6,orc%,ory%)
  13897.   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
  13898.   FOR i%=7 TO 43 STEP 8
  13899.     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
  13900.     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
  13901.     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
  13902.     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
  13903.   NEXT i%
  13904.   GOSUB se.sm_actsm_mix
  13905. RETURN
  13906. PROCEDURE se.sm_actsm_mix
  13907.   ' Var locales de Sample_Editor :
  13908.   ' Utilise a%, i%, j%, aaaa$
  13909.   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)
  13910.   FOR i%=0 TO 4
  13911.     j%=ADD(MUL(i%,8),6)
  13912.     GOSUB affiche_icone_b(j%,6,orc%,ory%,se.mix_param%(0,i%) AND 1)             ! On
  13913.     GOSUB affiche_icone_b(ADD(j%,3),6,orc%,ory%,se.mix_param%(0,i%) AND 2)      ! Loop
  13914.     a%=se.mix_param%(1,i%)                              ! Numero de sample
  13915.     IF a%>0
  13916.       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)
  13917.       aaaa$=FN samplename$(a%)
  13918.     ELSE
  13919.       GOSUB affchaine_notrans("  ",ADD(orc%,SUCC(divbi&(0,ADD(j%,4),6))),ADD(ory%,ADD(divbi&(1,ADD(j%,4),6),2)),1)
  13920.       aaaa$="Block                       "
  13921.     ENDIF
  13922.     GOSUB affchaine_notrans(aaaa$,ADD(orc%,SUCC(divbi&(0,ADD(j%,7),6))),ADD(ory%,ADD(divbi&(1,ADD(j%,7),6),2)),1)
  13923.     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
  13924.     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
  13925.   NEXT i%
  13926.   SHOWM
  13927. RETURN
  13928. PROCEDURE se.sm_gere_mix
  13929.   ' Var locales de Sample_Editor :
  13930.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  13931.   ' Utilise srt%, a%, i%, flag_relachement!, aaaa$
  13932.   ~FRE(0)
  13933.   IF km%>0
  13934.     a%=V:divbi&(0,0,0)
  13935.     srt%=C:g_teste_icones%(L:a%,W:6,W:xm2%,W:ym2%)
  13936.     IF srt%>=0
  13937.       SELECT srt%
  13938.         ' Radio-boutons, Flip-flops ou champs de texte
  13939.         ' --------------------------------------------------------------------
  13940.       CASE 6,14,22,30,38        ! Sample On/Off
  13941.         se.mix_param%(0,DIV(SUB(srt%,6),8))=se.mix_param%(0,DIV(SUB(srt%,6),8)) XOR 1
  13942.         GOSUB se.sm_actsm_mix
  13943.         ' --------------------------------------------------------------------
  13944.       CASE 9,17,25,33,41        ! Loop on/off
  13945.         se.mix_param%(0,DIV(SUB(srt%,9),8))=se.mix_param%(0,DIV(SUB(srt%,9),8)) XOR 2
  13946.         GOSUB se.sm_actsm_mix
  13947.         ' --------------------------------------------------------------------
  13948.       CASE 1                    ! Master volume
  13949.         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)
  13950.         se.mix_master_volume%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  13951.         GOSUB se.sm_actsm_mix
  13952.         ' --------------------------------------------------------------------
  13953.       CASE 7,15,23,31,39        ! Volume de debut
  13954.         IF km%=2
  13955.           se.mix_param%(2,DIV(SUB(srt%,7),8))=se.mix_param%(3,DIV(SUB(srt%,7),8))
  13956.         ELSE
  13957.           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)
  13958.           se.mix_param%(2,DIV(SUB(srt%,7),8))=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  13959.         ENDIF
  13960.         GOSUB se.sm_actsm_mix
  13961.         ' --------------------------------------------------------------------
  13962.       CASE 8,16,24,32,40        ! Volume de fin
  13963.         IF km%=2
  13964.           se.mix_param%(3,DIV(SUB(srt%,8),8))=se.mix_param%(2,DIV(SUB(srt%,8),8))
  13965.         ELSE
  13966.           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)
  13967.           se.mix_param%(3,DIV(SUB(srt%,8),8))=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  13968.         ENDIF
  13969.         GOSUB se.sm_actsm_mix
  13970.         ' --------------------------------------------------------------------
  13971.       CASE 10,18,26,34,42       ! Numero de sample
  13972.         IF km%=1
  13973.           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)
  13974.           se.mix_param%(1,DIV(SUB(srt%,10),8))=VAL("$"+bbbb$)
  13975.         ELSE
  13976.           se.mix_param%(1,DIV(SUB(srt%,10),8))=sample%
  13977.         ENDIF
  13978.         GOSUB se.sm_actsm_mix
  13979.         ' --------------------------------------------------------------------
  13980.       CASE 11,12,19,20,27,28,35,36,43,44        ! Sample + ou -
  13981.         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)
  13982.         GOSUB se.sm_actsm_mix
  13983.         IF km%=1
  13984.           PAUSE 2
  13985.         ENDIF
  13986.         flag_relachement!=FALSE
  13987.         ' --------------------------------------------------------------------
  13988.       CASE 13,21,29,37,45       ! Simples icones non cliquables
  13989.         ' --------------------------------------------------------------------
  13990.       DEFAULT
  13991.         ' Icones normales
  13992.         GOSUB affiche_icone_b(srt%,6,orc%,ory%,-1)
  13993.         GOSUB wait_mouse(TRUE)
  13994.         SELECT srt%
  13995.           ' ------------------------------------------------------------------
  13996.         CASE 0                  ! Mix !
  13997.           GOSUB bee(TRUE)
  13998.           GOSUB spl_mixage_samples(mark_1%,mark_len%,win_bits%,se.mix_master_volume%)
  13999.           se.volume_ok!=FALSE
  14000.           noact_delay%=5
  14001.           GOSUB affiche_sample
  14002.           ' ------------------------------------------------------------------
  14003.         CASE 2 TO 5             ! Presets
  14004.           se.mix_master_volume%=DIV(32768,srt%)
  14005.           FOR i%=0 TO 4
  14006.             IF i%<srt%  ! On
  14007.               se.mix_param%(0,i%)=se.mix_param%(0,i%) OR 1
  14008.               se.mix_param%(2,i%)=32768
  14009.               se.mix_param%(3,i%)=32768
  14010.             ELSE        ! Off
  14011.               se.mix_param%(0,i%)=se.mix_param%(0,i%) AND -2
  14012.             ENDIF
  14013.           NEXT i%
  14014.           GOSUB se.sm_actsm_mix
  14015.           ' ------------------------------------------------------------------
  14016.         ENDSELECT
  14017.         GOSUB affiche_icone_b(srt%,6,orc%,ory%,0)
  14018.       ENDSELECT
  14019.       GOSUB wait_mouse(flag_relachement!)
  14020.       flag_relachement!=TRUE
  14021.       GOSUB vide_buffer_clavier
  14022.     ENDIF
  14023.   ENDIF
  14024. RETURN
  14025. PROCEDURE spl_mixage_samples(dddd%,llll%,bbbb%,mmmm%)
  14026.   ' Mixe plusieurs samples (infos dans se.mix_param%())
  14027.   ' Buffer commencant en position dddd%, de longueur llll%,
  14028.   ' de resolution bbbb% (1 ou 2)
  14029.   ' Master volume mmmm% (/32768)
  14030.   LOCAL iiii%,iiii1%,iiii2%,ssss%,aaaa$
  14031.   IF llll%>0
  14032.     aaaa$=""
  14033.     nnnn%=0
  14034.     FOR iiii%=0 TO 4
  14035.       IF BTST(se.mix_param%(0,iiii%),0)
  14036.         ssss%=se.mix_param%(1,iiii%)
  14037.         IF ssss%=0                                              ! Buffer
  14038.           aaaa$=aaaa$+MKI$(bbbb%)+MKL$(ADD(FN adr_buffer,dddd%))+MKL$(-1)+MKL$(llll%)+MKL$(0)
  14039.         ELSE                                                    ! Sample
  14040.           aaaa$=aaaa$+MKI$(FN resol(ssss%))+MKL$(FN adresse(ssss%))
  14041.           IF ADD(FN repeat(ssss%),FN replen(ssss%))>2 AND BTST(se.mix_param%(0,iiii%),1)        ! Boucle
  14042.             aaaa$=aaaa$+MKL$(FN repeat(ssss%))+MKL$(ADD(FN repeat(ssss%),FN replen(ssss%)))+MKL$(0)
  14043.           ELSE                                                  ! Pas boucle
  14044.             aaaa$=aaaa$+MKL$(-1)+MKL$(FN length(ssss%))+MKL$(0)
  14045.           ENDIF
  14046.         ENDIF
  14047.         aaaa$=aaaa$+MKL$(se.mix_param%(2,iiii%)*mmmm%/32768)+MKL$(0)
  14048.         iiii1%=INT(SUB(se.mix_param%(3,iiii%),se.mix_param%(2,iiii%))*mmmm%/SHR(llll%,PRED(bbbb%))/32768)        ! Calcul des increments de volume
  14049.         iiii2%=SHL((SUB(se.mix_param%(3,iiii%),se.mix_param%(2,iiii%))*mmmm%/SHR(llll%,PRED(bbbb%))/32768-iiii1%)*2147483647,1)
  14050.         aaaa$=aaaa$+MKL$(iiii1%)+MKL$(iiii2%)
  14051.         INC nnnn%
  14052.       ENDIF
  14053.     NEXT iiii%
  14054.     IF nnnn%>0
  14055.       aaaa$=MKL$(ADD(FN adr_buffer,dddd%))+MKL$(llll%)+MKI$(bbbb%)+MKI$(nnnn%)+aaaa$
  14056.       aaaa%=V:aaaa$
  14057.       ~C:g_mixage_sample%(L:aaaa%)
  14058.     ENDIF
  14059.   ENDIF
  14060. RETURN
  14061. ' Record
  14062. PROCEDURE se.sm_affsm_record
  14063.   GOSUB cadre_int(orc%,ADD(ory%,80),23,19,13,13,14,12)          ! Cadre Sample/presample
  14064.   GOSUB cadre_int(orc%,ADD(ory%,100),23,39,13,13,14,12)         ! Cadre Trigger/frequency
  14065.   GOSUB cadre_int(ADD(orc%,24),ADD(ory%,80),13,29,13,13,14,12)  ! Cadre Channel
  14066.   GOSUB cadre_int(ADD(orc%,24),ADD(ory%,110),13,29,13,13,14,12) ! Cadre Monitor
  14067.   GOSUB cadre_int(ADD(orc%,38),ADD(ory%,80),25,59,13,13,14,12)  ! Cadre Input Device
  14068.   GOSUB cadre_int(ADD(orc%,64),ADD(ory%,80),15,59,13,13,14,12)  ! Cadre Input Level
  14069.   GOSUB affiche_bloc_icones_b(0,12,7,orc%,ory%)
  14070.   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
  14071.   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
  14072.   GOSUB cadre_ext(ADD(orc%,65),ADD(ory%,97),4,5,0,13,12,14)     ! Level (L)
  14073.   GOSUB cadre_ext(ADD(orc%,74),ADD(ory%,97),4,5,0,13,12,14)     ! Level (R)
  14074.   GOSUB affchaine_trans("INPUT LEVEL",ADD(SHL(orc%,1),133),ADD(ory%,117),14)
  14075.   GOSUB affchaine_trans("LEFT",ADD(SHL(orc%,1),131),ADD(ory%,87),14)
  14076.   GOSUB affchaine_trans("RIGHT",ADD(SHL(orc%,1),148),ADD(ory%,87),14)
  14077.   GOSUB affchaine_trans("dB",ADD(SHL(orc%,1),142),ADD(ory%,97),14)
  14078.   GOSUB affchaine_trans("CHANNEL",SUB(SHL(ADD(orc%,divbi&(0,14,7)),1),3),SUB(ADD(ory%,divbi&(1,14,7)),8),14)
  14079.   GOSUB affchaine_trans("INPUT DEVICE",SHL(ADD(orc%,45),1),ADD(ory%,87),14)
  14080.   GOSUB se.sm_actsm_record
  14081. RETURN
  14082. PROCEDURE se.sm_actsm_record
  14083.   ' Variable locales de Sample_Editor :
  14084.   ' Utilise aaaa$
  14085.   GOSUB affiche_icone_b(12,7,orc%,ory%,se.rec_flag_trigger!)    ! Trigger on/off
  14086.   GOSUB affiche_icone_b(13,7,orc%,ory%,se.rec_canal%=1)         ! Left
  14087.   GOSUB affiche_icone_b(14,7,orc%,ory%,se.rec_canal%=3)         ! Left+Right
  14088.   GOSUB affiche_icone_b(15,7,orc%,ory%,se.rec_canal%=2)         ! Right
  14089.   GOSUB affiche_icone_b(16,7,orc%,ory%,se.rec_input_device%=0)  ! Falcon ADC
  14090.   GOSUB affiche_icone_b(17,7,orc%,ory%,se.rec_input_device%=1)  ! ST Replay pro
  14091.   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
  14092.   IF se.rec_input_device%=0             ! DAC CODEC Falcon
  14093.     aaaa$=MID$("xxxxx4917032780245851966816390xxxxx12292xxxxx 9834xxxxx 8195",SUCC(MUL(se.rec_adc_freq%,5)),5)
  14094.   ELSE
  14095.     aaaa$=STR$(se.rec_ext_freq%,5)      ! DAC exterieur
  14096.   ENDIF
  14097.   GOSUB affchaine_notrans(aaaa$,ADD(orc%,ADD(divbi&(0,7,7),10)),ADD(ory%,ADD(divbi&(1,7,7),2)),1)
  14098.   GOSUB affchaine_notrans(STR$(-(SHR(NOT PEEK(&HFFFF8939),4) AND 15)*1.5,5),ADD(orc%,65),ADD(ory%,97),1)   ! Level (L)
  14099.   GOSUB affchaine_notrans(STR$(-((NOT PEEK(&HFFFF8939)) AND 15)*1.5,5),ADD(orc%,74),ADD(ory%,97),1)        ! Level (R)
  14100.   GOSUB grise_icone(17,7,orc%,ory%)
  14101.   SHOWM
  14102. RETURN
  14103. PROCEDURE se.sm_gere_record             !!!
  14104.   ' Var locales de Sample_Editor :
  14105.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14106.   ' Utilise srt%, a%, b%, c%, i%, flag_relachement!, aaaa$
  14107.   ~FRE(0)
  14108.   IF km%>0
  14109.     a%=V:divbi&(0,0,0)
  14110.     srt%=C:g_teste_icones%(L:a%,W:7,W:xm2%,W:ym2%)
  14111.     IF srt%>=0
  14112.       SELECT srt%
  14113.         ' Radio-boutons, Flip-flops ou champs de texte
  14114.         ' --------------------------------------------------------------------
  14115.       CASE 2,3                  ! Level +/- (L)
  14116.         SPOKE &HFFFF8939,ADD(PEEK(&HFFFF8939) AND 15,MAX(0,MIN(240,ADD(PEEK(&HFFFF8939) AND 240,SUB(80,SHL(srt%,5))))))
  14117.         GOSUB se.sm_actsm_record
  14118.         IF km%=1
  14119.           PAUSE 4
  14120.         ENDIF
  14121.         flag_relachement!=FALSE
  14122.         ' --------------------------------------------------------------------
  14123.       CASE 4,5                  ! Level +/- (R)
  14124.         SPOKE &HFFFF8939,ADD(PEEK(&HFFFF8939) AND 240,MAX(0,MIN(15,ADD(PEEK(&HFFFF8939) AND 15,SUB(9,SHL(srt%,1))))))
  14125.         GOSUB se.sm_actsm_record
  14126.         IF km%=1
  14127.           PAUSE 4
  14128.         ENDIF
  14129.         flag_relachement!=FALSE
  14130.         ' --------------------------------------------------------------------
  14131.       CASE 8                    ! Frequence +
  14132.         IF se.rec_input_device%=0
  14133.           se.rec_adc_freq%=VAL("$"+MID$("11234151719",se.rec_adc_freq%,1))
  14134.           GOSUB se.sm_actsm_record
  14135.           IF km%=1
  14136.             PAUSE 4
  14137.           ENDIF
  14138.           flag_relachement!=FALSE
  14139.         ENDIF
  14140.         ' --------------------------------------------------------------------
  14141.       CASE 9                    ! Frequence -
  14142.         IF se.rec_input_device%=0
  14143.           se.rec_adc_freq%=VAL("$"+MID$("23457191B1B",se.rec_adc_freq%,1))
  14144.           GOSUB se.sm_actsm_record
  14145.           IF km%=1
  14146.             PAUSE 4
  14147.           ENDIF
  14148.           flag_relachement!=FALSE
  14149.         ENDIF
  14150.         ' --------------------------------------------------------------------
  14151.       CASE 7                    ! Frequency
  14152.         IF se.rec_input_device%<>0
  14153.           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)
  14154.           se.rec_ext_freq%=MIN(49170,MAX(2000,VAL(bbbb$)))
  14155.         ENDIF
  14156.         GOSUB se.sm_actsm_record
  14157.         ' --------------------------------------------------------------------
  14158.       CASE 11                   ! Trigger level
  14159.         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)
  14160.         se.rec_trigger%=MAX(MIN(DIV(32768*VAL(bbbb$),100),32768),0)
  14161.         GOSUB se.sm_actsm_record
  14162.         ' --------------------------------------------------------------------
  14163.       CASE 12                   ! Trigger on/off
  14164.         se.rec_flag_trigger!=NOT se.rec_flag_trigger!
  14165.         GOSUB se.sm_actsm_record
  14166.         ' --------------------------------------------------------------------
  14167.       CASE 13                   ! Left
  14168.         se.rec_canal%=1
  14169.         GOSUB se.sm_actsm_record
  14170.         ' --------------------------------------------------------------------
  14171.       CASE 14                   ! Left + Right
  14172.         se.rec_canal%=3
  14173.         GOSUB se.sm_actsm_record
  14174.         ' --------------------------------------------------------------------
  14175.       CASE 15                   ! Right
  14176.         se.rec_canal%=2
  14177.         GOSUB se.sm_actsm_record
  14178.         ' --------------------------------------------------------------------
  14179.       CASE 16                   ! ADC Falcon
  14180.         se.rec_input_device%=0
  14181.         GOSUB se.sm_actsm_record
  14182.         ' --------------------------------------------------------------------
  14183.       CASE 17                   ! ADC ST Replay pro *** Non selectionnable pour l'instant ***
  14184.         '   se.rec_input_device%=1
  14185.         '   GOSUB se.sm_actsm_record
  14186.         ' --------------------------------------------------------------------
  14187.       DEFAULT
  14188.         ' Icones normales
  14189.         GOSUB affiche_icone_b(srt%,7,orc%,ory%,-1)
  14190.         GOSUB wait_mouse(TRUE)
  14191.         SELECT srt%
  14192.           ' ------------------------------------------------------------------
  14193.         CASE 0                  ! Sample
  14194.           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!))
  14195.           IF se.rec_input_device%=0             ! Utilisation de l'ADC du Falcon
  14196.             aaaa$=aaaa$+MKI$(se.rec_adc_freq%)
  14197.             BMOVE V:aaaa$,g_adr_record_inf%,22
  14198.             ~C:g_start_sample_recording%(W:0)
  14199.             REPEAT
  14200.               a%=C:g_cherche_volume_buffer_stereo%(W:0)
  14201.               GOSUB spl_affiche_vumetre(SHR(a%,16),a% AND 65535,0,0)
  14202.               IF GEMDOS(11)<>0
  14203.                 ~GEMDOS(7)
  14204.                 CARD{g_flag_sample_rec%}=0
  14205.               ELSE IF MOUSEK=2
  14206.                 CARD{g_flag_sample_rec%}=0
  14207.               ENDIF
  14208.             UNTIL CARD{g_flag_sample_rec2%}=4
  14209.             freq_buffer%=DIV(98340,SUCC(se.rec_adc_freq%))
  14210.           ELSE IF se.rec_input_device%=1        ! Utilisation de la carte ST Replay pro
  14211.             '
  14212.             '
  14213.             '
  14214.             '
  14215.             freq_buffer%=se.rec_ext_freq%
  14216.           ENDIF
  14217.           mark_2%=MIN(ADD(mark_1%,LONG{ADD(g_adr_record_inf%,8)}),ADD(mark_1%,mark_len%))
  14218.           GOSUB spl_affiche_vumetre(0,0,0,0)
  14219.           GOSUB affiche_sample
  14220.           ' ------------------------------------------------------------------
  14221.         CASE 1                  ! Presample
  14222.           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!))
  14223.           IF se.rec_input_device%=0             ! Utilisation de l'ADC du Falcon
  14224.             aaaa$=aaaa$+MKI$(se.rec_adc_freq%)
  14225.             BMOVE V:aaaa$,g_adr_record_inf%,22
  14226.             ~C:g_start_sample_recording%(W:0)
  14227.             REPEAT
  14228.               a%=C:g_cherche_volume_buffer_stereo%(W:0)
  14229.               GOSUB spl_affiche_vumetre(SHR(a%,16),a% AND 65535,0,0)
  14230.               IF GEMDOS(11)<>0
  14231.                 ~GEMDOS(7)
  14232.                 CARD{g_flag_sample_rec%}=0
  14233.               ELSE IF MOUSEK=2
  14234.                 CARD{g_flag_sample_rec%}=0
  14235.               ENDIF
  14236.             UNTIL CARD{g_flag_sample_rec2%}=4
  14237.             freq_buffer%=DIV(98340,SUCC(se.rec_adc_freq%))
  14238.           ELSE IF se.rec_input_device%=1        ! Utilisation de la carte ST Replay pro
  14239.             '
  14240.             '
  14241.             '
  14242.             '
  14243.             freq_buffer%=se.rec_ext_freq%
  14244.           ENDIF
  14245.           GOSUB spl_affiche_vumetre(0,0,0,0)
  14246.           a%=LONG{ADD(g_adr_record_inf%,8)}
  14247.           IF BTST(CARD{ADD(g_adr_record_inf%,12)},1)
  14248.             GOSUB bee(TRUE)
  14249.             GOSUB mem_rotation(ADD(FN adr_buffer,mark_1%),mark_len%,-a%)
  14250.             GOSUB bee(FALSE)
  14251.           ENDIF
  14252.           PAUSE 2
  14253.           GOSUB affiche_sample
  14254.           ' ------------------------------------------------------------------
  14255.         CASE 6                  ! Auto
  14256.           GOSUB spl_auto_set_input_level(TRUE)
  14257.           ' ------------------------------------------------------------------
  14258.         CASE 10                 ! Monitor
  14259.           GOSUB spl_auto_set_input_level(FALSE)
  14260.           ' ------------------------------------------------------------------
  14261.         ENDSELECT
  14262.         GOSUB affiche_icone_b(srt%,7,orc%,ory%,0)
  14263.       ENDSELECT
  14264.       GOSUB wait_mouse(flag_relachement!)
  14265.       flag_relachement!=TRUE
  14266.       GOSUB vide_buffer_clavier
  14267.     ENDIF
  14268.   ENDIF
  14269. RETURN
  14270. PROCEDURE spl_auto_set_input_level(flag!)
  14271.   ' Si flag!=TRUE, adapte le niveau d'entree a la source
  14272.   ' Si flag!=FALSE, simple monitoring
  14273.   LOCAL a%,a1%,a2%,b%,c%,d%,v1%,v2%,old_mat_cnx%,a$
  14274.   ~FRE(0)
  14275.   v1%=0
  14276.   v2%=0
  14277.   old_mat_cnx%=LPEEK(&HFFFF8930)                ! Sauve l'ancienne connection de la matrice
  14278.   ~XBIOS(&H8B,W:3,W:&X1001,W:0,W:1,W:1)         ! Connecte le DAC et le DMArec a l'ADC
  14279.   a$=MKL$(XBIOS(2))+MKL$(2048)+MKL$(0)+MKI$(0)+MKI$(2)+MKI$(1)+MKI$(32769)+MKI$(1)
  14280.   BMOVE V:a$,g_adr_record_inf%,22
  14281.   ~C:g_start_sample_recording%(W:0)
  14282.   REPEAT
  14283.     a%=C:g_cherche_volume_buffer_stereo%(W:0)
  14284.     a1%=SHR(a%,16)
  14285.     a2%=a% AND 65535
  14286.     ' Teste la droite
  14287.     IF a2%<v2%                                  ! Moins fort que d'habitude, le plafond descend lentement
  14288.       v2%=SHR(ADD(MUL(v2%,253),MUL(a2%,3)),8)   ! Inertie 253/256 (ancien) - 3/256 (nouveau)
  14289.     ELSE                                        ! Plus fort, le plafond s'adapte rapidement
  14290.       v2%=SHR(ADD(MUL(v2%,6),MUL(a2%,10)),4)    ! Inertie 6/16 (ancien) - 10/16 (nouveau)
  14291.     ENDIF
  14292.     IF flag!
  14293.       b%=PEEK(&HFFFF8939) AND 15
  14294.       d%=b%
  14295.       IF a2%>32700                              ! Saturation ?
  14296.         d%=MAX(SUB(b%,4),0)                     ! alors - 6 dB cash
  14297.       ELSE IF v2%>0
  14298.         c%=ROUND(10*LOG10(v2%/24576)/1.5)       ! Rapport volume / 75% de volmax en dB/1.5
  14299.         d%=MIN(MAX(SUB(b%,c%),0),15)            ! Augmente ou diminue en consequence
  14300.         v2%=v2%*(10^(SUB(d%,b%)*0.15))
  14301.       ENDIF
  14302.       SPOKE &HFFFF8939,ADD(d%,PEEK(&HFFFF8939) AND &HF0)
  14303.     ENDIF
  14304.     ' Teste la gauche
  14305.     IF a1%<v1%                                  ! Moins fort que d'habitude, le plafond descend lentement
  14306.       v1%=SHR(ADD(MUL(v1%,253),MUL(a1%,3)),8)   ! Inertie 253/256 (ancien) - 3/256 (nouveau)
  14307.     ELSE                                        ! Plus fort, le plafond s'adapte rapidement
  14308.       v1%=SHR(ADD(MUL(v1%,6),MUL(a1%,10)),4)    ! Inertie 6/16 (ancien) - 10/16 (nouveau)
  14309.     ENDIF
  14310.     IF flag!
  14311.       b%=SHR(PEEK(&HFFFF8939),4)
  14312.       d%=b%
  14313.       IF a1%>32700                              ! Saturation ?
  14314.         d%=MAX(SUB(b%,4),0)                     ! alors - 6 dB cash
  14315.       ELSE IF v1%>0
  14316.         c%=ROUND(10*LOG10(v1%/24576)/1.5)       ! Rapport volume / 75% de volmax en dB/1.5
  14317.         d%=MIN(MAX(SUB(b%,c%),0),15)            ! Augmente ou diminue en consequence
  14318.         v1%=v1%*(10^(SUB(d%,b%)*0.15))
  14319.       ENDIF
  14320.       SPOKE &HFFFF8939,ADD(SHL(d%,4),PEEK(&HFFFF8939) AND 15)
  14321.     ENDIF
  14322.     ' Affiche le resultat
  14323.     GOSUB affchaine_notrans(STR$(-(SHR(NOT PEEK(&HFFFF8939),4) AND 15)*1.5,5),ADD(orc%,65),ADD(ory%,97),1)   ! Level (L)
  14324.     GOSUB affchaine_notrans(STR$(-((NOT PEEK(&HFFFF8939)) AND 15)*1.5,5),ADD(orc%,74),ADD(ory%,97),1)        ! Level (R)
  14325.     IF GEMDOS(11)<>0
  14326.       ~GEMDOS(7)
  14327.       CARD{g_flag_sample_rec%}=0
  14328.       flag_s!=TRUE
  14329.     ELSE IF MOUSEK=2
  14330.       CARD{g_flag_sample_rec%}=0
  14331.     ELSE
  14332.       GOSUB spl_affiche_vumetre(a1%,a2%,v1%,v2%)
  14333.     ENDIF
  14334.   UNTIL CARD{g_flag_sample_rec2%}=4             ! Fini ?
  14335.   SLPOKE &HFFFF8930,old_mat_cnx%                ! Reprend l'ancienne config de la matrice
  14336.   GOSUB spl_affiche_vumetre(0,0,0,0)
  14337. RETURN
  14338. PROCEDURE spl_affiche_vumetre(vvvv1%,vvvv2%,mmmm1%,mmmm2%)
  14339.   LOCAL aaaa%
  14340.   aaaa%=SUB(SHR(scr_ncol%,1),4)         ! Gauche
  14341.   ~C:g_affiche_vumetre%(W:vvvv1%,W:mmmm1%,W:aaaa%,W:4,W:hwin%)
  14342.   aaaa%=SUB(SHR(scr_ncol%,1),2)         ! Droite
  14343.   ~C:g_affiche_vumetre%(W:vvvv2%,W:mmmm2%,W:aaaa%,W:4,W:hwin%)
  14344. RETURN
  14345. ' Marks
  14346. PROCEDURE se.sm_affsm_marks
  14347.   GOSUB cadre_int(orc%,ADD(ory%,80),39,49,13,13,14,12)
  14348.   GOSUB cadre_int(ADD(orc%,40),ADD(ory%,80),39,49,13,13,14,12)
  14349.   GOSUB affiche_bloc_icones_b(0,12,8,orc%,ory%)
  14350.   GOSUB cadre_ext(ADD(orc%,divbi&(0,23,8)),ADD(ory%,ADD(divbi&(1,23,8),2)),20,45,0,13,12,14)
  14351.   GOSUB cadre_ext(ADD(orc%,divbi&(0,24,8)),ADD(ory%,ADD(divbi&(1,24,8),2)),20,45,0,13,12,14)
  14352.   GOSUB cadre_ext(ADD(orc%,divbi&(0,25,8)),ADD(ory%,ADD(divbi&(1,25,8),2)),5,45,0,13,12,14)
  14353.   GOSUB cadre_ext(ADD(orc%,divbi&(0,26,8)),ADD(ory%,ADD(divbi&(1,26,8),2)),5,45,0,13,12,14)
  14354.   GOSUB cadre_ext(ADD(orc%,divbi&(0,27,8)),ADD(ory%,ADD(divbi&(1,27,8),2)),5,45,0,13,12,14)
  14355.   GOSUB cadre_ext(ADD(orc%,divbi&(0,28,8)),ADD(ory%,ADD(divbi&(1,28,8),2)),5,45,0,13,12,14)
  14356.   GOSUB affchaine_trans("NAME",ADD(SHL(ADD(orc%,divbi&(0,23,8)),1),17),ADD(ADD(ory%,divbi&(1,23,8)),52),14)
  14357.   GOSUB affchaine_trans("POS",ADD(SHL(ADD(orc%,divbi&(0,25,8)),1),3),ADD(ADD(ory%,divbi&(1,25,8)),52),14)
  14358.   GOSUB affchaine_trans("LENGTH",SHL(ADD(orc%,divbi&(0,27,8)),1),ADD(ADD(ory%,divbi&(1,27,8)),52),14)
  14359.   GOSUB se.sm_actsm_marks
  14360. RETURN
  14361. PROCEDURE se.sm_actsm_marks
  14362.   GOSUB se.sm_update_marks
  14363.   FOR i%=0 TO 9
  14364.     GOSUB affiche_icone_b(ADD(i%,13),8,orc%,ory%,se.mark_selected% AND SHL(1,i%))
  14365.     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)
  14366.     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)
  14367.     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)
  14368.   NEXT i%
  14369.   GOSUB affiche_icone_b(12,8,orc%,ory%,se.mark_set!)
  14370.   SHOWM
  14371. RETURN
  14372. PROCEDURE se.sm_gere_marks
  14373.   ' Var locales de Sample_Editor :
  14374.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14375.   ' Utilise srt%, a%, i%
  14376.   ~FRE(0)
  14377.   IF km%>0
  14378.     GOSUB se.sm_update_marks
  14379.     a%=V:divbi&(0,0,0)
  14380.     srt%=C:g_teste_icones%(L:a%,W:8,W:xm2%,W:ym2%)
  14381.     IF srt%>=0
  14382.       SELECT srt%
  14383.         ' Radio-boutons, Flip-flops ou champs de texte
  14384.         ' --------------------------------------------------------------------
  14385.       CASE 12                   ! Set
  14386.         se.mark_set!=NOT se.mark_set!
  14387.         GOSUB se.sm_actsm_marks
  14388.         ' --------------------------------------------------------------------
  14389.       CASE 13 TO 22             ! Selection d'un numero de preset
  14390.         se.mark_selected%=se.mark_selected% XOR SHL(1,SUB(srt%,13))
  14391.         GOSUB se.sm_actsm_marks
  14392.         ' --------------------------------------------------------------------
  14393.       CASE 23,24                ! Name
  14394.         a%=ADD(MUL(SUB(srt%,23),5),DIV(SUB(ym2%,divbi&(1,srt%,8)),10))
  14395.         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)
  14396.         se.mark$(a%)=bbbb$
  14397.         GOSUB se.sm_actsm_marks
  14398.         ' --------------------------------------------------------------------
  14399.       CASE 25,26                ! Pos
  14400.         a%=ADD(MUL(SUB(srt%,25),5),DIV(SUB(ym2%,divbi&(1,srt%,8)),10))
  14401.         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)
  14402.         se.mark%(0,a%)=MIN(VAL("$"+bbbb$),SUB(FN lon_buffer,2)) AND -2
  14403.         se.mark%(1,a%)=MIN(se.mark%(1,a%),SUB(FN lon_buffer,se.mark%(0,a%))) AND -2
  14404.         GOSUB se.sm_actsm_marks
  14405.         ' --------------------------------------------------------------------
  14406.       CASE 27,28                ! Length
  14407.         a%=ADD(MUL(SUB(srt%,27),5),DIV(SUB(ym2%,divbi&(1,srt%,8)),10))
  14408.         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)
  14409.         se.mark%(1,a%)=MIN(VAL("$"+bbbb$),SUB(FN lon_buffer,se.mark%(0,a%))) AND -2
  14410.         GOSUB se.sm_actsm_marks
  14411.         ' --------------------------------------------------------------------
  14412.       DEFAULT
  14413.         ' Icones normales
  14414.         GOSUB affiche_icone_b(srt%,8,orc%,ory%,-1)
  14415.         GOSUB wait_mouse(TRUE)
  14416.         SELECT srt%
  14417.           ' ------------------------------------------------------------------
  14418.         CASE 0 TO 9             ! Activation ou enregistrement d'un preset
  14419.           IF se.mark_set!
  14420.             se.mark%(0,srt%)=mark_1%
  14421.             se.mark%(1,srt%)=mark_len%
  14422.             se.mark_set!=FALSE
  14423.           ELSE
  14424.             mark_1%=se.mark%(0,srt%)
  14425.             mark_len%=se.mark%(1,srt%)
  14426.           ENDIF
  14427.           IF km%=2
  14428.             win_pos%=mark_1%
  14429.             win_lon%=mark_len%
  14430.           ENDIF
  14431.           GOSUB affiche_sample
  14432.           GOSUB se.sm_actsm_marks
  14433.           ' ------------------------------------------------------------------
  14434.         CASE 10                 ! All
  14435.           se.mark_selected%=&X1111111111
  14436.           GOSUB se.sm_actsm_marks
  14437.           ' ------------------------------------------------------------------
  14438.         CASE 11                 ! Reset
  14439.           FOR i%=0 TO 9
  14440.             IF (se.mark_selected% AND SHL(1,i%))=SHL(1,i%)
  14441.               se.mark%(0,i%)=0
  14442.               se.mark%(1,i%)=FN lon_buffer
  14443.               se.mark$(i%)=SPACE$(21)
  14444.             ENDIF
  14445.           NEXT i%
  14446.           se.mark_selected%=0
  14447.           GOSUB se.sm_actsm_marks
  14448.           ' ------------------------------------------------------------------
  14449.         ENDSELECT
  14450.         GOSUB affiche_icone_b(srt%,8,orc%,ory%,0)
  14451.       ENDSELECT
  14452.       GOSUB wait_mouse(TRUE)
  14453.       GOSUB vide_buffer_clavier
  14454.     ENDIF
  14455.   ENDIF
  14456. RETURN
  14457. PROCEDURE se.sm_update_marks
  14458.   ' Corrige les marques si la longueur du buffer a ete modifiee
  14459.   LOCAL i%
  14460.   FOR i%=0 TO 9
  14461.     IF se.mark%(0,i%)>SUB(FN lon_buffer,2)
  14462.       se.mark%(0,i%)=0
  14463.       se.mark%(1,i%)=FN lon_buffer
  14464.       se.mark$(i%)=SPACE$(21)
  14465.     ELSE
  14466.       se.mark%(1,i%)=MIN(se.mark%(1,i%),SUB(FN lon_buffer,se.mark%(0,i%))) AND -2
  14467.     ENDIF
  14468.   NEXT i%
  14469. RETURN
  14470. PROCEDURE se.sm_chg_marks(oooo%,nnnn%)
  14471.   ' Reactualise les marques pour l'insertion ou la destruction d'une sequence dans le buffer
  14472.   ' oooo% = ancienne pos, nnnn% = nouvelle pos
  14473.   LOCAL i%
  14474.   IF oooo%<=nnnn%
  14475.     FOR i%=0 TO 9
  14476.       IF se.mark%(0,i%)>=oooo%
  14477.         ADD se.mark%(0,i%),SUB(nnnn%,oooo%)
  14478.       ELSE IF ADD(se.mark%(0,i%),se.mark%(1,i%))>=oooo%
  14479.         ADD se.mark%(1,i%),SUB(nnnn%,oooo%)
  14480.       ENDIF
  14481.     NEXT i%
  14482.   ELSE
  14483.     FOR i%=0 TO 9
  14484.       IF se.mark%(0,i%)>=oooo%
  14485.         ADD se.mark%(0,i%),SUB(nnnn%,oooo%)
  14486.       ELSE IF se.mark%(0,i%)>=nnnn%
  14487.         SUB se.mark%(1,i%),SUB(oooo%,se.mark%(0,i%))
  14488.         IF se.mark%(1,i%)=>2
  14489.           se.mark%(0,i%)=nnnn%
  14490.         ELSE
  14491.           se.mark%(0,i%)=0
  14492.           se.mark%(1,i%)=FN lon_buffer
  14493.           se.mark$(i%)=SPACE$(21)
  14494.         ENDIF
  14495.       ELSE IF se.mark%(0,i%)<=nnnn% AND ADD(se.mark%(0,i%),se.mark%(1,i%))>nnnn%
  14496.         IF ADD(se.mark%(0,i%),se.mark%(1,i%))>=oooo%
  14497.           SUB se.mark%(1,i%),SUB(oooo%,nnnn%)
  14498.         ELSE
  14499.           se.mark%(1,i%)=SUB(nnnn%,se.mark%(0,i%))
  14500.         ENDIF
  14501.       ENDIF
  14502.     NEXT i%
  14503.   ENDIF
  14504. RETURN
  14505. ' Frequency
  14506. PROCEDURE se.sm_affsm_freq
  14507.   GOSUB cadre_int(orc%,ADD(ory%,80),13,59,13,13,14,12)
  14508.   GOSUB cadre_int(ADD(orc%,14),ADD(ory%,80),20,59,13,13,14,12)
  14509.   GOSUB cadre_int(ADD(orc%,35),ADD(ory%,80),13,59,13,13,14,12)
  14510.   GOSUB cadre_int(ADD(orc%,49),ADD(ory%,80),30,59,13,13,14,12)
  14511.   GOSUB affiche_bloc_icones_b(0,11,9,orc%,ory%)
  14512.   GOSUB affiche_bloc_icones_b(14,3,9,orc%,ory%)
  14513.   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)
  14514.   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)
  14515.   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)
  14516.   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)
  14517.   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)
  14518.   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)
  14519.   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)
  14520.   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)
  14521.   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)
  14522.   GOSUB affchaine_trans("RESAMPLE",ADD(SHL(orc%,1),2),ADD(ory%,82),14)
  14523.   GOSUB affchaine_trans("SHRINK/EXPND",ADD(SHL(orc%,1),2),ADD(ory%,107),14)
  14524.   GOSUB affchaine_trans("SAMPLE FREQUENCY",ADD(SHL(orc%,1),30),ADD(ory%,82),14)
  14525.   GOSUB affchaine_trans("SAMPLE NOTE  DISP:",ADD(SHL(orc%,1),30),ADD(ory%,107),14)
  14526.   GOSUB affchaine_trans("INTERPOLATION",ADD(SHL(orc%,1),71),ADD(ory%,82),14)
  14527.   GOSUB affchaine_trans("FFT     NOTE:",ADD(SHL(orc%,1),100),ADD(ory%,82),14)
  14528.   GOSUB affchaine_trans("DISPLAY",ADD(SHL(orc%,1),132),ADD(ory%,82),14)
  14529.   GOSUB affchaine_trans("WINDOW",ADD(SHL(orc%,1),132),ADD(ory%,107),14)
  14530.   GOSUB se.sm_actsm_freq
  14531.   GOSUB affiche_fft
  14532. RETURN
  14533. PROCEDURE se.sm_actsm_freq
  14534.   LOCAL a%,a$
  14535.   se.freq_fft_pend%=MIN(se.freq_fft_pend%,SHR(freq_buffer%,1))
  14536.   se.freq_fft_pstart%=MIN(se.freq_fft_pstart%,se.freq_fft_pend%)
  14537.   GOSUB affchaine_notrans(STR$(freq_buffer%,5),ADD(orc%,ADD(divbi&(0,8,9),5)),ADD(ory%,ADD(divbi&(1,8,9),2)),1)
  14538.   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)
  14539.   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)
  14540.   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)
  14541.   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)
  14542.   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)
  14543.   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)
  14544.   a%=FN freq2note(se.freq_ofn%)
  14545.   a$=TRIM$(MID$(gamme2$,SUCC(SHL(ADD(a%,120) MOD 12,1)),2))+" "+STR$(SUB(DIV(a%,12),2))
  14546.   a$=SPACE$(SUB(5,LEN(a$)))+a$
  14547.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,9,9),5)),ADD(ory%,ADD(divbi&(1,9,9),2)),1)
  14548.   a%=FN freq2note(se.freq_nfn%)
  14549.   a$=TRIM$(MID$(gamme2$,SUCC(SHL(ADD(a%,120) MOD 12,1)),2))+" "+STR$(SUB(DIV(a%,12),2))
  14550.   a$=SPACE$(SUB(5,LEN(a$)))+a$
  14551.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,9,9),13)),ADD(ory%,ADD(divbi&(1,9,9),2)),1)
  14552.   GOSUB affiche_icone_b(11,9,orc%,ory%,se.freq_iptype%=0)       ! None
  14553.   GOSUB affiche_icone_b(12,9,orc%,ory%,se.freq_iptype%=1)       ! Linear
  14554.   GOSUB affiche_icone_b(13,9,orc%,ory%,se.freq_iptype%=2)       ! 3rd degree
  14555.   GOSUB affiche_icone_b(17,9,orc%,ory%,se.freq_fftdisp%=0)      ! Linear FFT disp
  14556.   GOSUB affiche_icone_b(18,9,orc%,ory%,se.freq_fftdisp%=1)      ! dB FFT disp
  14557.   GOSUB affiche_icone_b(19,9,orc%,ory%,se.freq_fftwin%=0)       ! Window : none
  14558.   GOSUB affiche_icone_b(20,9,orc%,ory%,se.freq_fftwin%=1)       ! Window : Blackman
  14559.   GOSUB affiche_icone_b(21,9,orc%,ory%,se.freq_fftnoteon!)      ! Voyant pour la visibilite de la note sur la FFT
  14560.   GOSUB affiche_icone_b(22,9,orc%,ory%,se.freq_fft_cflag!)      ! Voyant pour le calcul de la note lors de la FFT
  14561.   GOSUB grise_icone(13,9,orc%,ory%)
  14562.   SHOWM
  14563. RETURN
  14564. PROCEDURE se.sm_gere_freq               !!!
  14565.   ' Var locales de Sample_Editor :
  14566.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14567.   ' Utilise srt%, a%, b%, c%, d%, i%, a, flag_relachement!, aaaa$
  14568.   ~FRE(0)
  14569.   IF km%>0
  14570.     a%=V:divbi&(0,0,0)
  14571.     srt%=C:g_teste_icones%(L:a%,W:9,W:xm2%,W:ym2%)
  14572.     IF srt%>=0
  14573.       SELECT srt%
  14574.         ' Radio-boutons, Flip-flops ou champs de texte
  14575.         ' --------------------------------------------------------------------
  14576.       CASE 8                    ! Freq -> Freq
  14577.         IF SUB(SHR(xm2%,3),divbi&(0,8,9))<11
  14578.           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)
  14579.           IF VAL(bbbb$)>=2000 AND VAL(bbbb$)<=65535
  14580.             freq_buffer%=VAL(bbbb$)
  14581.             GOSUB affiche_sample
  14582.           ENDIF
  14583.         ELSE
  14584.           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)
  14585.           IF VAL(bbbb$)>=2000 AND VAL(bbbb$)<=65535
  14586.             se.freq_nfe%=VAL(bbbb$)
  14587.           ENDIF
  14588.         ENDIF
  14589.         GOSUB se.sm_actsm_freq
  14590.         ' --------------------------------------------------------------------
  14591.       CASE 9                    ! Note -> Note
  14592.         IF SUB(SHR(xm2%,3),divbi&(0,9,9))<11
  14593.           a%=FN freq2note(se.freq_ofn%)
  14594.           b%=5
  14595.         ELSE
  14596.           a%=FN freq2note(se.freq_nfn%)
  14597.           b%=13
  14598.         ENDIF
  14599.         a$=TRIM$(MID$(gamme2$,SUCC(SHL(ADD(a%,120) MOD 12,1)),2))+" "+STR$(SUB(DIV(a%,12),2))
  14600.         a$=SPACE$(SUB(5,LEN(a$)))+a$
  14601.         GOSUB edite_chaine(a$,ADD(orc%,ADD(divbi&(0,9,9),b%)),ADD(ory%,ADD(divbi&(1,9,9),2)),5,0)
  14602.         a%=1
  14603.         WHILE a%<=7
  14604.           EXIT IF INSTR(UPPER$(bbbb$),MID$("CDEFGAB",a%,1))<>0
  14605.           INC a%
  14606.         WEND
  14607.         IF a%<=7
  14608.           b%=SUB(VAL("$"+MID$("024579B",a%,1)),INSTR(bbbb$,"#")<>0)     ! Numero de la note
  14609.           a%=-2
  14610.           WHILE a%<=9
  14611.             EXIT IF INSTR(bbbb$,STR$(a%))<>0
  14612.             INC a%
  14613.           WEND
  14614.           IF a%<=9
  14615.             ADD b%,MUL(ADD(a%,2),12)
  14616.             a%=FN note2freq(b%)
  14617.             IF SUB(SHR(xm2%,3),divbi&(0,9,9))<11
  14618.               se.freq_ofn%=a%
  14619.             ELSE
  14620.               se.freq_nfn%=a%
  14621.             ENDIF
  14622.           ENDIF
  14623.         ENDIF
  14624.         GOSUB se.sm_actsm_freq
  14625.         ' --------------------------------------------------------------------
  14626.       CASE 10                   ! Freq note -> Freq note
  14627.         IF SUB(SHR(xm2%,3),divbi&(0,10,9))<11
  14628.           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)
  14629.           IF VAL(bbbb$)>8 AND VAL(bbbb$)<65535
  14630.             se.freq_ofn%=VAL(bbbb$)
  14631.           ENDIF
  14632.         ELSE
  14633.           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)
  14634.           IF VAL(bbbb$)>8 AND VAL(bbbb$)<65535
  14635.             se.freq_nfn%=VAL(bbbb$)
  14636.           ENDIF
  14637.         ENDIF
  14638.         GOSUB affiche_fft
  14639.         GOSUB se.sm_actsm_freq
  14640.         ' --------------------------------------------------------------------
  14641.       CASE 11 TO 13             ! Type d'interpolation
  14642.         se.freq_iptype%=MIN(SUB(srt%,11),1)     ! *** 3eme degre non encore disponible
  14643.         GOSUB se.sm_actsm_freq
  14644.         ' --------------------------------------------------------------------
  14645.       CASE 14                   ! FFT : Start
  14646.         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)
  14647.         se.freq_fft_pstart%=MIN(se.freq_fft_pend%,MAX(0,VAL(bbbb$)))
  14648.         GOSUB se.sm_actsm_freq
  14649.         ' --------------------------------------------------------------------
  14650.       CASE 15                   ! FFT : End
  14651.         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)
  14652.         se.freq_fft_pend%=MAX(se.freq_fft_pstart%,MIN(SHR(freq_buffer%,1),VAL(bbbb$)))
  14653.         GOSUB se.sm_actsm_freq
  14654.         ' --------------------------------------------------------------------
  14655.       CASE 16                   ! FFT : Nbr of points
  14656.         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)
  14657.         se.freq_fft_pnbr%=MIN(1024,MAX(1,VAL(bbbb$)))
  14658.         GOSUB se.sm_actsm_freq
  14659.         ' --------------------------------------------------------------------
  14660.       CASE 17                   ! Affichage FFT lineaire
  14661.         se.freq_fftdisp%=0
  14662.         GOSUB affiche_fft
  14663.         GOSUB se.sm_actsm_freq
  14664.         ' --------------------------------------------------------------------
  14665.       CASE 18                   ! Affichage FFT logarithmique
  14666.         se.freq_fftdisp%=1
  14667.         GOSUB affiche_fft
  14668.         GOSUB se.sm_actsm_freq
  14669.         ' --------------------------------------------------------------------
  14670.       CASE 19                   ! Fenetrage FFT rectangulaire
  14671.         se.freq_fftwin%=0
  14672.         GOSUB se.sm_actsm_freq
  14673.         ' --------------------------------------------------------------------
  14674.       CASE 20                   ! Fenetrage FFT Blackman
  14675.         se.freq_fftwin%=1
  14676.         GOSUB se.sm_actsm_freq
  14677.         ' --------------------------------------------------------------------
  14678.       CASE 21                   ! Voyant pour la note sur la FFT
  14679.         se.freq_fftnoteon!=NOT se.freq_fftnoteon!
  14680.         GOSUB affiche_fft
  14681.         GOSUB se.sm_actsm_freq
  14682.         ' --------------------------------------------------------------------
  14683.       CASE 22                   ! Calcul note on/off
  14684.         se.freq_fft_cflag!=NOT se.freq_fft_cflag!
  14685.         GOSUB se.sm_actsm_freq
  14686.         ' --------------------------------------------------------------------
  14687.       DEFAULT
  14688.         ' Icones normales
  14689.         GOSUB affiche_icone_b(srt%,9,orc%,ory%,-1)
  14690.         GOSUB wait_mouse(TRUE)
  14691.         SELECT srt%
  14692.           ' ------------------------------------------------------------------
  14693.         CASE 0                  ! Convert
  14694.           IF km%=2      ! Si c'est le bouton droit, on change simplement la freq d'ech
  14695.             a%=DIV(MUL(freq_buffer%,se.freq_nfn%),se.freq_ofn%)
  14696.             IF a%<=65535 AND a%>=2000
  14697.               se.freq_nfe%=a%
  14698.               se.freq_ofn%=se.freq_nfn%
  14699.               GOSUB se.change_buffer_frequency(a%,TRUE)
  14700.             ENDIF
  14701.           ELSE
  14702.             a=(se.freq_nfe%*se.freq_ofn%)/(freq_buffer%*se.freq_nfn%)     ! Rapport d'agrandissement
  14703.             a%=mark_len%
  14704.             b%=(a%*a) AND -2
  14705.             IF a>1
  14706.               GOSUB dialog("RESAMPLE","NEW SAMPLE TOO LONG","CLIP|OVERFLOW",xm%,ym%)
  14707.               IF bouton%=0      ! Clip
  14708.                 b%=mark_len%
  14709.               ELSE              ! Overflow
  14710.                 b%=MIN(b%,SUB(FN lon_buffer,mark_1%))
  14711.               ENDIF
  14712.               a%=(b%/a) AND -2
  14713.             ENDIF
  14714.             GOSUB bee(TRUE)
  14715.             c%=ADD(FN adr_buffer,mark_1%)
  14716.             ~C:g_change_sample_frequency%(L:c%,L:c%,L:a%,L:b%,W:win_bits%,W:se.freq_iptype%)
  14717.             se.freq_ofn%=se.freq_nfn%
  14718.             mark_2%=ADD(mark_1%,mark_len%)
  14719.             mark_len%=b%
  14720.             GOSUB se.change_buffer_frequency(se.freq_nfe%,FALSE)
  14721.             GOSUB affiche_panneau_sample
  14722.           ENDIF
  14723.           ' ------------------------------------------------------------------
  14724.         CASE 1 TO 3             ! /2 /3 /4
  14725.           IF DIV(freq_buffer%,SUCC(srt%))>=2000
  14726.             se.freq_nfe%=DIV(freq_buffer%,SUCC(srt%))
  14727.             se.freq_nfn%=se.freq_ofn%
  14728.             GOSUB se.sm_actsm_freq
  14729.           ENDIF
  14730.           ' ------------------------------------------------------------------
  14731.         CASE 4 TO 6             ! x2 x3 x4
  14732.           IF MUL(freq_buffer%,SUB(srt%,2))<=65535
  14733.             se.freq_nfe%=MUL(freq_buffer%,SUB(srt%,2))
  14734.             se.freq_nfn%=se.freq_ofn%
  14735.             GOSUB se.sm_actsm_freq
  14736.           ENDIF
  14737.           ' ------------------------------------------------------------------
  14738.         CASE 7                  ! Do FFT
  14739.           IF km%=2                      ! Bouton droit : on reinitialise la gamme
  14740.             se.freq_fft_pstart%=0
  14741.             se.freq_fft_pend%=SHR(freq_buffer%,1)
  14742.           ENDIF
  14743.           GOSUB se.sm_actsm_freq
  14744.           GOSUB bee(TRUE)
  14745.           b%=ADD(FN adr_buffer,mark_1%)
  14746.           ' Fenetrage Blackman
  14747.           IF se.freq_fftwin%=1
  14748.             c%=FRE(0)
  14749.             IF mark_len%<SUB(c%,32768)
  14750.               c%=1
  14751.               DIM blackman%(SHR(mark_len%,2))
  14752.               a%=V:blackman%(0)
  14753.               IF win_bits%=2            ! 16 bits
  14754.                 a=PI*4/SUB(mark_len%,2)
  14755.                 FOR i%=0 TO PRED(SHR(mark_len%,1))
  14756.                   INT{a%}=INT{b%}*(0.42-COS(i%*a)*0.5+0.08*COS(SHL(i%,1)*a))
  14757.                   ADD a%,2
  14758.                   ADD b%,2
  14759.                 NEXT i%
  14760.               ELSE                      ! 8 bits
  14761.                 a=PI*2/PRED(mark_len%)
  14762.                 FOR i%=0 TO PRED(mark_len%)
  14763.                   d%=BYTE{b%}
  14764.                   IF d%>127
  14765.                     SUB d%,256
  14766.                   ENDIF
  14767.                   BYTE{a%}=d%*(0.42-COS(i%*a)*0.5+0.08*COS(SHL(i%,1)*a))
  14768.                   INC a%
  14769.                   INC b%
  14770.                 NEXT i%
  14771.               ENDIF
  14772.               b%=V:blackman%(0)
  14773.             ELSE
  14774.               c%=0
  14775.             ENDIF
  14776.           ELSE
  14777.             c%=0
  14778.           ENDIF
  14779.           ' Calcul proprement dit
  14780.           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)
  14781.           IF c%=1
  14782.             FOR i%=0 TO PRED(se.freq_fftlon%)
  14783.               fft&(i%)=MAX(MIN(fft&(i%)/0.42,&H7FFF),0)
  14784.             NEXT i%
  14785.             ERASE blackman%()
  14786.           ENDIF
  14787.           IF a%>0
  14788.             se.freq_ofn%=a%
  14789.           ENDIF
  14790.           GOSUB affiche_panneau_sample
  14791.           ' ------------------------------------------------------------------
  14792.         ENDSELECT
  14793.         GOSUB affiche_icone_b(srt%,9,orc%,ory%,0)
  14794.       ENDSELECT
  14795.       GOSUB wait_mouse(flag_relachement!)
  14796.       flag_relachement!=TRUE
  14797.       GOSUB vide_buffer_clavier
  14798.     ENDIF
  14799.   ENDIF
  14800. RETURN
  14801. ' Delay
  14802. PROCEDURE se.sm_affsm_delay
  14803.   ' Utilise i%
  14804.   GOSUB cadre_int(orc%,ADD(ory%,80),40,29,13,13,14,12)
  14805.   GOSUB cadre_int(ADD(orc%,41),ADD(ory%,80),38,49,13,13,14,12)
  14806.   GOSUB cadre_int(orc%,ADD(ory%,110),20,29,13,13,14,12)
  14807.   GOSUB cadre_int(ADD(orc%,21),ADD(ory%,110),7,29,13,13,14,12)
  14808.   GOSUB affiche_bloc_icones_b(0,30,10,orc%,ory%)
  14809.   FOR i%=0 TO 3
  14810.     GOSUB affchaine_trans(STR$(SUCC(i%)),ADD(SHL(orc%,1),84),ADD(ADD(ory%,87),MUL(i%,10)),14)
  14811.     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)
  14812.     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)
  14813.   NEXT i%
  14814.   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)
  14815.   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)
  14816.   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)
  14817.   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)
  14818.   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)
  14819.   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)
  14820.   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)
  14821.   GOSUB se.sm_actsm_delay
  14822. RETURN
  14823. PROCEDURE se.sm_actsm_delay
  14824.   ' Utilise aaaa$, i%
  14825.   se.delay_timefeed%=MIN(se.delay_timefeed%,SUB(FRE(0),16384)*1000/MUL(freq_buffer%,win_bits%))
  14826.   FOR i%=0 TO 3
  14827.     se.delaytime%(i%)=MIN(se.delaytime%(i%),SUB(FRE(0),16384)*1000/MUL(freq_buffer%,win_bits%))
  14828.     GOSUB affiche_icone_b(MUL(i%,3),10,orc%,ory%,BTST(se.delay_flags%,i%))
  14829.     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)
  14830.     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)
  14831.   NEXT i%
  14832.   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)
  14833.   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)
  14834.   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)
  14835.   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)
  14836.   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)
  14837.   IF se.delay_source%=0
  14838.     GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,12,10),14)),ADD(ory%,ADD(divbi&(1,12,10),2)),1)
  14839.     aaaa$="Block                       "
  14840.   ELSE
  14841.     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)
  14842.     aaaa$=FN samplename$(se.delay_source%)
  14843.   ENDIF
  14844.   GOSUB affchaine_notrans(aaaa$,ADD(orc%,ADD(divbi&(0,15,10),1)),ADD(ory%,ADD(divbi&(1,15,10),2)),1)
  14845.   GOSUB affiche_icone_b(21,10,orc%,ory%,se.delay_flags% AND &H10)
  14846.   GOSUB affiche_icone_b(22,10,orc%,ory%,se.delay_flags% AND &H20)
  14847.   SHOWM
  14848. RETURN
  14849. PROCEDURE se.sm_gere_delay
  14850.   ' Var locales de Sample_Editor :
  14851.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  14852.   ' Utilise srt%, a%, b%, c%, aaaa$, flag_relachement!
  14853.   ~FRE(0)
  14854.   IF km%>0
  14855.     a%=V:divbi&(0,0,0)
  14856.     srt%=C:g_teste_icones%(L:a%,W:10,W:xm2%,W:ym2%)
  14857.     IF srt%>=0
  14858.       SELECT srt%
  14859.         ' Radio-boutons, Flip-flops ou champs de texte
  14860.         ' --------------------------------------------------------------------
  14861.       CASE 0,3,6,9              ! Tap On/Off
  14862.         se.delay_flags%=se.delay_flags% XOR SHL(1,DIV(srt%,3))
  14863.         GOSUB se.sm_actsm_delay
  14864.         ' --------------------------------------------------------------------
  14865.       CASE 1,4,7,10             ! Tap delay time
  14866.         a%=DIV(PRED(srt%),3)
  14867.         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)
  14868.         se.delaytime%(a%)=MAX(VAL(bbbb$),0)
  14869.         GOSUB se.sm_actsm_delay
  14870.         ' --------------------------------------------------------------------
  14871.       CASE 2,5,8,11             ! Tap level
  14872.         a%=DIV(SUB(srt%,2),3)
  14873.         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)
  14874.         se.delaylevel%(a%)=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  14875.         GOSUB se.sm_actsm_delay
  14876.         ' --------------------------------------------------------------------
  14877.       CASE 12                   ! Sample source
  14878.         IF km%=1
  14879.           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)
  14880.           se.delay_source%=VAL("$"+bbbb$)
  14881.         ELSE
  14882.           se.delay_source%=sample%
  14883.         ENDIF
  14884.         GOSUB se.sm_actsm_delay
  14885.         ' --------------------------------------------------------------------
  14886.       CASE 13,14                ! Sample source +/-
  14887.         se.delay_source%=MAX(MIN(ADD(se.delay_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,13),km%))),255),0)
  14888.         GOSUB se.sm_actsm_delay
  14889.         IF km%=1
  14890.           PAUSE 4
  14891.         ENDIF
  14892.         flag_relachement!=FALSE
  14893.         ' --------------------------------------------------------------------
  14894.       CASE 17                   ! Feedback
  14895.         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)
  14896.         se.delay_feedback%=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  14897.         GOSUB se.sm_actsm_delay
  14898.         ' --------------------------------------------------------------------
  14899.       CASE 18                   ! Time Feed
  14900.         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)
  14901.         se.delay_timefeed%=MAX(VAL(bbbb$),1)
  14902.         GOSUB se.sm_actsm_delay
  14903.         ' --------------------------------------------------------------------
  14904.       CASE 19                   ! Dry level
  14905.         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)
  14906.         se.delay_dry%=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  14907.         GOSUB se.sm_actsm_delay
  14908.         ' --------------------------------------------------------------------
  14909.       CASE 20                   ! Wet level
  14910.         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)
  14911.         se.delay_wet%=DIV(MIN(MAX(VAL(bbbb$),0),999.9)*32768,100)
  14912.         GOSUB se.sm_actsm_delay
  14913.         ' --------------------------------------------------------------------
  14914.       CASE 21                   ! Multi-tap mode
  14915.         se.delay_flags%=se.delay_flags% XOR &H10
  14916.         GOSUB se.sm_actsm_delay
  14917.         ' --------------------------------------------------------------------
  14918.       CASE 22                   ! Mute in On/Off
  14919.         se.delay_flags%=se.delay_flags% XOR &H20
  14920.         GOSUB se.sm_actsm_delay
  14921.         ' --------------------------------------------------------------------
  14922.       CASE 23                   ! Mute in : Time
  14923.         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)
  14924.         se.delay_mutein%=MAX(VAL(bbbb$),0)
  14925.         GOSUB se.sm_actsm_delay
  14926.         ' --------------------------------------------------------------------
  14927.       CASE 15                   ! Indicateur du nom du sample : rien...
  14928.         ' --------------------------------------------------------------------
  14929.       DEFAULT
  14930.         ' Icones normales
  14931.         GOSUB affiche_icone_b(srt%,10,orc%,ory%,-1)
  14932.         GOSUB wait_mouse(TRUE)
  14933.         SELECT srt%
  14934.           ' ------------------------------------------------------------------
  14935.         CASE 24 TO 29           ! Presets 1-6
  14936.           a%=SUCC(MUL(SUB(srt%,24),4))
  14937.           se.delay_feedback%=DIV(MUL(32768,VAL(MID$("70  50  20  50  70  95",a%,4))),100)
  14938.           se.delay_timefeed%=VAL(MID$("150 500 1000500 800 10",a%,4))
  14939.           se.delay_dry%=MUL(32768,-(srt%<>28))
  14940.           se.delay_wet%=DIV(MUL(32768,VAL(MID$("30  30  30  20  100 95",a%,4))),100)
  14941.           se.delay_flags%=&H0
  14942.           IF srt%=27
  14943.             se.delay_flags%=&H11
  14944.             se.delaytime%(0)=1200
  14945.             se.delaylevel%(0)=32768
  14946.           ELSE IF srt%=28
  14947.             se.delay_flags%=&H1F
  14948.             se.delaytime%(0)=0
  14949.             se.delaylevel%(0)=32768
  14950.             se.delaytime%(1)=200
  14951.             se.delaylevel%(1)=16384
  14952.             se.delaytime%(2)=400
  14953.             se.delaylevel%(2)=9830
  14954.             se.delaytime%(3)=600
  14955.             se.delaylevel%(3)=6553
  14956.           ENDIF
  14957.           GOSUB se.sm_actsm_delay
  14958.           ' ------------------------------------------------------------------
  14959.         CASE 16                 ! Do
  14960.           GOSUB se.sm_actsm_delay
  14961.           IF (NOT BTST(se.delay_flags%,4)) OR (se.delay_flags% AND &HF)
  14962.             GOSUB bee(TRUE)
  14963.             a%=SHL(INT(se.delay_timefeed%*freq_buffer%/1000),1)
  14964.             b%=a%
  14965.             FOR i%=0 TO 3
  14966.               IF BTST(se.delay_flags%,i%) AND BTST(se.delay_flags%,4)
  14967.                 b%=MAX(b%,SHL(INT(se.delaytime%(i%)*freq_buffer%/1000),1))
  14968.               ENDIF
  14969.             NEXT i%
  14970.             SUB b%,a%
  14971.             DIM dlybuf%(SHR(ADD(a%,MAX(b%,2)),2))
  14972.             aaaa$=STRING$(48,0)
  14973.             IF se.delay_source%=0
  14974.               LONG{V:aaaa$}=ADD(FN adr_buffer,mark_1%)
  14975.               LONG{ADD(V:aaaa$,16)}=mark_len%
  14976.               BYTE{ADD(V:aaaa$,44)}=win_bits%
  14977.             ELSE
  14978.               LONG{V:aaaa$}=FN adresse(se.delay_source%)
  14979.               LONG{ADD(V:aaaa$,16)}=FN length(se.delay_source%)
  14980.               BYTE{ADD(V:aaaa$,44)}=FN resol(se.delay_source%)
  14981.             ENDIF
  14982.             LONG{ADD(V:aaaa$,4)}=ADD(FN adr_buffer,mark_1%)
  14983.             LONG{ADD(V:aaaa$,8)}=V:dlybuf%(0)
  14984.             LONG{ADD(V:aaaa$,12)}=ADD(V:dlybuf%(0),SUCC(a%) AND -2)
  14985.             LONG{ADD(V:aaaa$,20)}=mark_len%
  14986.             LONG{ADD(V:aaaa$,24)}=SHL(se.delay_feedback%,1)
  14987.             LONG{ADD(V:aaaa$,28)}=a%
  14988.             LONG{ADD(V:aaaa$,32)}=b%
  14989.             LONG{ADD(V:aaaa$,36)}=SHL(se.delay_dry%,1)
  14990.             IF BTST(se.delay_flags%,5)
  14991.               LONG{ADD(V:aaaa$,40)}=INT(se.delay_mutein%*freq_buffer%/1000)
  14992.             ELSE
  14993.               LONG{ADD(V:aaaa$,40)}=&H7FFFFFFF
  14994.             ENDIF
  14995.             BYTE{ADD(V:aaaa$,45)}=win_bits%
  14996.             IF BTST(se.delay_flags%,4)
  14997.               c%=0
  14998.               FOR i%=0 TO 3
  14999.                 IF BTST(se.delay_flags%,i%)
  15000.                   aaaa$=aaaa$+MKL$(SHL(INT(se.delaytime%(i%)*freq_buffer%/1000),1))+MKL$(se.delaylevel%(i%)*se.delay_wet%/16384)
  15001.                   INC c%
  15002.                 ENDIF
  15003.               NEXT i%
  15004.               CARD{ADD(V:aaaa$,46)}=c%
  15005.             ELSE
  15006.               CARD{ADD(V:aaaa$,46)}=1
  15007.               aaaa$=aaaa$+MID$(aaaa$,29,4)+MKL$(SHL(se.delay_wet%,1))
  15008.             ENDIF
  15009.             GOSUB affiche_panneau_progression("Please wait...",LONG{ADD(V:aaaa$,16)},-1,-1)
  15010.             c%=V:aaaa$
  15011.             ~C:g_fx_delay%(L:c%)
  15012.             WHILE LONG{g_progression_pos%}<LONG{g_progression_len%}
  15013.               GOSUB affiche_progression(LONG{g_progression_pos%})
  15014.               ~C:g_fx_delay%(L:0)
  15015.             WEND
  15016.             ERASE dlybuf%()
  15017.             GOSUB affiche_panneau_sample
  15018.           ENDIF
  15019.           ' ------------------------------------------------------------------
  15020.         ENDSELECT
  15021.         GOSUB affiche_icone_b(srt%,10,orc%,ory%,0)
  15022.       ENDSELECT
  15023.       GOSUB wait_mouse(flag_relachement!)
  15024.       flag_relachement!=TRUE
  15025.       GOSUB vide_buffer_clavier
  15026.     ENDIF
  15027.   ENDIF
  15028. RETURN
  15029. ' Flanger
  15030. PROCEDURE se.sm_affsm_flanger
  15031.   IF ss_menu2.fl%=2
  15032.     GOSUB se.sm_affsm_flanger2
  15033.   ELSE
  15034.     GOSUB cadre_int(orc%,ADD(ory%,80),15,59,13,13,14,12)
  15035.     GOSUB cadre_int(ADD(orc%,16),ADD(ory%,80),21,59,13,13,14,12)
  15036.     GOSUB cadre_int(ADD(orc%,38),ADD(ory%,80),21,59,13,13,14,12)
  15037.     GOSUB cadre_int(ADD(orc%,60),ADD(ory%,80),19,29,13,13,14,12)
  15038.     GOSUB affiche_bloc_icones_b(0,16,19,orc%,ory%)
  15039.     GOSUB affchaine_trans("FLANGER",ADD(SHL(orc%,1),2),ADD(ory%,87),14)
  15040.     GOSUB affchaine_trans("MIX",ADD(SHL(orc%,1),34),ADD(ory%,87),14)
  15041.     GOSUB affchaine_trans("PARAMETERS",ADD(SHL(orc%,1),78),ADD(ory%,87),14)
  15042.     GOSUB affchaine_trans("PRESETS",ADD(SHL(orc%,1),122),ADD(ory%,87),14)
  15043.     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)
  15044.     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)
  15045.     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)
  15046.     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)
  15047.     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)
  15048.     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)
  15049.     GOSUB se.sm_actsm_flanger
  15050.   ENDIF
  15051. RETURN
  15052. PROCEDURE se.sm_actsm_flanger
  15053.   ' Var locales de Sample_Editor utilisees:
  15054.   ' i%
  15055.   IF ss_menu2.fl%=2
  15056.     GOSUB se.sm_actsm_flanger2
  15057.   ELSE
  15058.     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)
  15059.     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)
  15060.     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)
  15061.     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)
  15062.     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)
  15063.     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)
  15064.     FOR i%=10 TO 15
  15065.       GOSUB grise_icone(i%,19,orc%,ory%)
  15066.     NEXT i%
  15067.   ENDIF
  15068. RETURN
  15069. PROCEDURE se.sm_gere_flanger
  15070.   ' Var locales de Sample_Editor :
  15071.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15072.   ' Utilise srt%, a%, b%, c%, i%, j%, a$, b$, aaaa$, flag_relachement!
  15073.   ~FRE(0)
  15074.   IF ss_menu2.fl%=2
  15075.     GOSUB se.sm_gere_flanger2
  15076.   ELSE
  15077.     IF km%>0
  15078.       a%=V:divbi&(0,0,0)
  15079.       srt%=C:g_teste_icones%(L:a%,W:19,W:xm2%,W:ym2%)
  15080.       IF srt%>=0
  15081.         SELECT srt%
  15082.           ' Radio-boutons, Flip-flops ou champs de texte
  15083.           ' ------------------------------------------------------------------
  15084.         CASE 4          ! Dry level
  15085.           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)
  15086.           se.flanger_dry%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15087.           GOSUB se.sm_actsm_flanger
  15088.           ' ------------------------------------------------------------------
  15089.         CASE 5          ! Flange level
  15090.           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)
  15091.           se.flanger_wet%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15092.           GOSUB se.sm_actsm_flanger
  15093.           ' ------------------------------------------------------------------
  15094.         CASE 6          ! Flange time
  15095.           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)
  15096.           se.flanger_time%=MIN(MAX(VAL(bbbb$)*1000,0),50000)
  15097.           GOSUB se.sm_actsm_flanger
  15098.           ' ------------------------------------------------------------------
  15099.         CASE 7          ! Flange freq
  15100.           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)
  15101.           se.flanger_freq%=MIN(MAX(VAL(bbbb$)*1000,0),50000)
  15102.           GOSUB se.sm_actsm_flanger
  15103.           ' ------------------------------------------------------------------
  15104.         CASE 8          ! Flange depth
  15105.           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)
  15106.           se.flanger_depth%=MIN(MAX(VAL(bbbb$)*1000,0),99999)
  15107.           GOSUB se.sm_actsm_flanger
  15108.           ' ------------------------------------------------------------------
  15109.         CASE 9          ! Init phase
  15110.           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)
  15111.           se.flanger_phase%=MIN(MAX(VAL(bbbb$)*2048,0),4095)
  15112.           GOSUB se.sm_actsm_flanger
  15113.           ' ------------------------------------------------------------------
  15114.         DEFAULT
  15115.           ' Icones normales
  15116.           GOSUB affiche_icone_b(srt%,19,orc%,ory%,-1)
  15117.           GOSUB wait_mouse(TRUE)
  15118.           SELECT srt%
  15119.             ' ----------------------------------------------------------------
  15120.           CASE 0        ! 2nd page
  15121.             ss_menu2.fl%=2
  15122.             ' ----------------------------------------------------------------
  15123.           CASE 1,2,3    ! Calcul
  15124.             IF se.flanger_stereo!
  15125.               GOSUB se.sm_do_flanger(srt%)
  15126.             ELSE
  15127.               GOSUB se.sm_do_flanger(0)
  15128.             ENDIF
  15129.             GOSUB affiche_panneau_sample
  15130.             ' ----------------------------------------------------------------
  15131.           CASE 10 TO 15 ! Presets
  15132.             '
  15133.             '
  15134.             '
  15135.             '
  15136.             ' ----------------------------------------------------------------
  15137.           ENDSELECT
  15138.           GOSUB affiche_icone_b(srt%,19,orc%,ory%,0)
  15139.         ENDSELECT
  15140.         GOSUB wait_mouse(flag_relachement!)
  15141.         flag_relachement!=TRUE
  15142.         GOSUB vide_buffer_clavier
  15143.         IF ss_menu2.fl%<>1
  15144.           GOSUB sample_editor.affiche_sm
  15145.         ENDIF
  15146.       ENDIF
  15147.     ENDIF
  15148.   ENDIF
  15149. RETURN
  15150. PROCEDURE se.sm_affsm_flanger2
  15151.   GOSUB cadre_int(orc%,ADD(ory%,80),51,29,13,13,14,12)
  15152.   GOSUB cadre_int(orc%,ADD(ory%,110),51,29,13,13,14,12)
  15153.   GOSUB cadre_int(ADD(orc%,52),ADD(ory%,80),13,59,13,13,14,12)
  15154.   GOSUB cadre_int(ADD(orc%,66),ADD(ory%,80),13,29,13,13,14,12)
  15155.   GOSUB affiche_bloc_icones_b(0,13,20,orc%,ory%)
  15156.   GOSUB affchaine_trans("FEEDBACK",ADD(SHL(orc%,1),3),ADD(ory%,97),14)
  15157.   GOSUB affchaine_trans("FEEDBACK",ADD(SHL(orc%,1),3),ADD(ory%,127),14)
  15158.   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)
  15159.   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)
  15160.   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)
  15161.   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)
  15162.   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)
  15163.   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)
  15164.   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)
  15165.   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)
  15166.   GOSUB se.sm_actsm_flanger2
  15167. RETURN
  15168. PROCEDURE se.sm_actsm_flanger2
  15169.   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)
  15170.   IF se.flanger_lsource%>0
  15171.     a$=HEX$(se.flanger_lsource%,2)
  15172.     b$=FN samplename$(se.flanger_lsource%)
  15173.   ELSE
  15174.     a$="  "
  15175.     b$="Block"+SPACE$(23)
  15176.   ENDIF
  15177.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,1,20),13)),ADD(ory%,ADD(divbi&(1,1,20),2)),1)
  15178.   GOSUB affchaine_notrans(b$,ADD(orc%,ADD(divbi&(0,4,20),1)),ADD(ory%,ADD(divbi&(1,4,20),2)),1)
  15179.   IF se.flanger_stereo!
  15180.     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)
  15181.     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)
  15182.     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)
  15183.     IF se.flanger_rsource%>0
  15184.       a$=HEX$(se.flanger_rsource%,2)
  15185.       b$=FN samplename$(se.flanger_rsource%)
  15186.     ELSE
  15187.       a$="  "
  15188.       b$="Block"+SPACE$(23)
  15189.     ENDIF
  15190.   ELSE
  15191.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,10,20),13)),ADD(ory%,ADD(divbi&(1,10,20),2)),1)
  15192.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,11,20),14)),ADD(ory%,ADD(divbi&(1,11,20),2)),1)
  15193.     GOSUB affchaine_notrans("     ",ADD(orc%,ADD(divbi&(0,12,20),13)),ADD(ory%,ADD(divbi&(1,12,20),2)),1)
  15194.     a$="  "
  15195.     b$=SPACE$(28)
  15196.   ENDIF
  15197.   GOSUB affchaine_notrans(a$,ADD(orc%,ADD(divbi&(0,5,20),13)),ADD(ory%,ADD(divbi&(1,5,20),2)),1)
  15198.   GOSUB affchaine_notrans(b$,ADD(orc%,ADD(divbi&(0,8,20),1)),ADD(ory%,ADD(divbi&(1,8,20),2)),1)
  15199.   GOSUB affiche_icone_b(13,20,orc%,ory%,NOT se.flanger_stereo!)
  15200.   GOSUB affiche_icone_b(14,20,orc%,ory%,se.flanger_stereo!)
  15201.   FOR i%=0 TO 4
  15202.     GOSUB affiche_icone_b(ADD(i%,15),20,orc%,ory%,se.flanger_wave%=i%)
  15203.   NEXT i%
  15204. RETURN
  15205. PROCEDURE se.sm_gere_flanger2
  15206.   ' Var locales de Sample_Editor :
  15207.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15208.   ' Utilise srt%, a%, b%, c%, aaaa$, flag_relachement!
  15209.   ~FRE(0)
  15210.   IF km%>0
  15211.     a%=V:divbi&(0,0,0)
  15212.     srt%=C:g_teste_icones%(L:a%,W:20,W:xm2%,W:ym2%)
  15213.     IF srt%>=0
  15214.       SELECT srt%
  15215.         ' Radio-boutons, Flip-flops ou champs de texte
  15216.         ' --------------------------------------------------------------------
  15217.       CASE 1            ! Numero du sample gauche
  15218.         IF km%=1
  15219.           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)
  15220.           se.flanger_lsource%=VAL("$"+bbbb$)
  15221.         ELSE
  15222.           se.flanger_lsource%=sample%
  15223.         ENDIF
  15224.         GOSUB se.sm_actsm_flanger2
  15225.         ' --------------------------------------------------------------------
  15226.       CASE 2,3          ! Sample gauche +/-
  15227.         se.flanger_lsource%=MAX(MIN(ADD(se.flanger_lsource%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,2),km%))),255),0)
  15228.         GOSUB se.sm_actsm_flanger2
  15229.         IF km%=1
  15230.           PAUSE 8
  15231.         ENDIF
  15232.         flag_relachement!=FALSE
  15233.         ' --------------------------------------------------------------------
  15234.       CASE 5            ! Numero du sample droit
  15235.         IF km%=1
  15236.           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)
  15237.           se.flanger_rsource%=VAL("$"+bbbb$)
  15238.         ELSE
  15239.           se.flanger_rsource%=sample%
  15240.         ENDIF
  15241.         GOSUB se.sm_actsm_flanger2
  15242.         ' --------------------------------------------------------------------
  15243.       CASE 6,7          ! Sample droit +/-
  15244.         se.flanger_rsource%=MAX(MIN(ADD(se.flanger_rsource%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,6),km%))),255),0)
  15245.         GOSUB se.sm_actsm_flanger2
  15246.         IF km%=1
  15247.           PAUSE 8
  15248.         ENDIF
  15249.         flag_relachement!=FALSE
  15250.         ' --------------------------------------------------------------------
  15251.       CASE 9            ! Feedback L -> L
  15252.         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)
  15253.         se.flanger_fdbkll%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15254.         GOSUB se.sm_actsm_flanger2
  15255.         ' --------------------------------------------------------------------
  15256.       CASE 10           ! Feedback L -> R
  15257.         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)
  15258.         se.flanger_fdbklr%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15259.         GOSUB se.sm_actsm_flanger2
  15260.         ' --------------------------------------------------------------------
  15261.       CASE 11           ! Feedback R -> R
  15262.         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)
  15263.         se.flanger_fdbkrr%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15264.         GOSUB se.sm_actsm_flanger2
  15265.         ' --------------------------------------------------------------------
  15266.       CASE 12           ! Feedback R -> L
  15267.         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)
  15268.         se.flanger_fdbkrl%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15269.         GOSUB se.sm_actsm_flanger2
  15270.         ' --------------------------------------------------------------------
  15271.       CASE 13           ! Mono
  15272.         se.flanger_stereo!=FALSE
  15273.         GOSUB se.sm_actsm_flanger2
  15274.         ' --------------------------------------------------------------------
  15275.       CASE 14           ! Stereo
  15276.         se.flanger_stereo!=TRUE
  15277.         GOSUB se.sm_actsm_flanger2
  15278.         ' --------------------------------------------------------------------
  15279.       CASE 15 TO 19     ! Type d'onde
  15280.         se.flanger_wave%=SUB(srt%,15)
  15281.         GOSUB se.sm_actsm_flanger2
  15282.         ' --------------------------------------------------------------------
  15283.       DEFAULT
  15284.         ' Icones normales
  15285.         GOSUB affiche_icone_b(srt%,20,orc%,ory%,-1)
  15286.         GOSUB wait_mouse(TRUE)
  15287.         SELECT srt%
  15288.           ' ------------------------------------------------------------------
  15289.         CASE 0          ! 1st page
  15290.           ss_menu2.fl%=1
  15291.           ' ------------------------------------------------------------------
  15292.         ENDSELECT
  15293.         GOSUB affiche_icone_b(srt%,20,orc%,ory%,0)
  15294.       ENDSELECT
  15295.       GOSUB wait_mouse(flag_relachement!)
  15296.       flag_relachement!=TRUE
  15297.       GOSUB vide_buffer_clavier
  15298.       IF ss_menu2.fl%<>2
  15299.         GOSUB sample_editor.affiche_sm
  15300.       ENDIF
  15301.     ENDIF
  15302.   ENDIF
  15303. RETURN
  15304. PROCEDURE se.sm_do_flanger(type%)
  15305.   LOCAL a%,amp%,i%,tbuf%,time%
  15306.   LOCAL a$,b$
  15307.   LOCAL a
  15308.   ' Calcul de la table de sinus
  15309.   a$=STRING$(8192,0)
  15310.   SELECT se.flanger_wave%
  15311.   CASE 0                                        ! Sinus
  15312.     a=PI/2048
  15313.     a%=V:a$
  15314.     FOR i%=0 TO 1024
  15315.       INT{a%}=ROUND(SIN(i%*a)*4096)
  15316.       ADD a%,2
  15317.     NEXT i%
  15318.     a%=ADD(V:a$,2050)
  15319.     FOR i%=4 TO 4092 STEP 4
  15320.       INT{a%}=INT{SUB(a%,i%)}
  15321.       ADD a%,2
  15322.     NEXT i%
  15323.     a%=ADD(V:a$,4094)
  15324.     FOR i%=0 TO 2048
  15325.       INT{a%}=-INT{SUB(a%,4096)}
  15326.       ADD a%,2
  15327.     NEXT i%
  15328.   CASE 1                                        ! Carre
  15329.     FOR i%=V:a$ TO ADD(V:a$,4094) STEP 2
  15330.       CARD{i%}=4096
  15331.     NEXT i%
  15332.     FOR i%=ADD(V:a$,4096) TO ADD(V:a$,8190) STEP 2
  15333.       CARD{i%}=-4096
  15334.     NEXT i%
  15335.   CASE 2                                        ! Triangle
  15336.     a%=0
  15337.     FOR i%=V:a$ TO ADD(V:a$,2046) STEP 2
  15338.       CARD{i%}=a%
  15339.       ADD a%,4
  15340.     NEXT i%
  15341.     FOR i%=ADD(V:a$,2048) TO ADD(V:a$,6142) STEP 2
  15342.       CARD{i%}=a%
  15343.       SUB a%,4
  15344.     NEXT i%
  15345.     FOR i%=ADD(V:a$,6144) TO ADD(V:a$,8190) STEP 2
  15346.       CARD{i%}=a%
  15347.       ADD a%,4
  15348.     NEXT i%
  15349.   CASE 3                                        ! Ramp down
  15350.     a%=0
  15351.     FOR i%=V:a$ TO ADD(V:a$,4094) STEP 2
  15352.       CARD{i%}=a%
  15353.       SUB a%,2
  15354.     NEXT i%
  15355.     a%=4096
  15356.     FOR i%=ADD(V:a$,4096) TO ADD(V:a$,8190) STEP 2
  15357.       CARD{i%}=a%
  15358.       SUB a%,2
  15359.     NEXT i%
  15360.   CASE 4                                        ! Ramp up
  15361.     a%=0
  15362.     FOR i%=V:a$ TO ADD(V:a$,4094) STEP 2
  15363.       CARD{i%}=a%
  15364.       ADD a%,2
  15365.     NEXT i%
  15366.     a%=-4096
  15367.     FOR i%=ADD(V:a$,4096) TO ADD(V:a$,8190) STEP 2
  15368.       CARD{i%}=a%
  15369.       ADD a%,2
  15370.     NEXT i%
  15371.   ENDSELECT
  15372.   amp%=se.flanger_depth%*freq_buffer%/1000000 AND -2
  15373.   time%=MAX(ADD(se.flanger_time%*freq_buffer%/500000,amp%) AND -2,4)
  15374.   tbuf%=ADD(time%,amp%)
  15375.   DIM buffer1%(SHR(tbuf%,2)),buffer2%(SHR(tbuf%,2))
  15376.   ' Bloc d'infos pour le flanger
  15377.   b$=STRING$(256,0)
  15378.   LONG{V:b$}=FN se.sm_adresse_sample(se.flanger_lsource%)
  15379.   LONG{ADD(V:b$,4)}=FN se.sm_adresse_sample(se.flanger_rsource%)
  15380.   LONG{ADD(V:b$,8)}=ADD(FN adr_buffer,mark_1%)
  15381.   LONG{ADD(V:b$,12)}=V:buffer1%(0)
  15382.   LONG{ADD(V:b$,16)}=V:buffer2%(0)
  15383.   LONG{ADD(V:b$,20)}=V:a$
  15384.   LONG{ADD(V:b$,24)}=FN se.sm_longueur_sample(se.flanger_lsource%)
  15385.   LONG{ADD(V:b$,28)}=FN se.sm_longueur_sample(se.flanger_rsource%)
  15386.   LONG{ADD(V:b$,32)}=mark_len%
  15387.   LONG{ADD(V:b$,36)}=tbuf%
  15388.   CARD{ADD(V:b$,40)}=FN se.sm_resol_sample(se.flanger_lsource%)
  15389.   CARD{ADD(V:b$,42)}=FN se.sm_resol_sample(se.flanger_rsource%)
  15390.   CARD{ADD(V:b$,44)}=win_bits%
  15391.   LONG{ADD(V:b$,48)}=SHL(se.flanger_fdbkll%,1)
  15392.   LONG{ADD(V:b$,52)}=SHL(se.flanger_fdbklr%,1)
  15393.   LONG{ADD(V:b$,56)}=SHL(se.flanger_fdbkrl%,1)
  15394.   LONG{ADD(V:b$,60)}=SHL(se.flanger_fdbkrr%,1)
  15395.   LONG{ADD(V:b$,64)}=SHL(se.flanger_dry%,1)
  15396.   LONG{ADD(V:b$,68)}=SHL(se.flanger_dry%,1)
  15397.   LONG{ADD(V:b$,72)}=SHL(se.flanger_wet%,1)
  15398.   LONG{ADD(V:b$,76)}=SHL(se.flanger_wet%,1)
  15399.   LONG{ADD(V:b$,80)}=&H10000000*se.flanger_freq%/MUL(freq_buffer%,1000)
  15400.   LONG{ADD(V:b$,84)}=amp%
  15401.   LONG{ADD(V:b$,88)}=time%
  15402.   CARD{ADD(V:b$,92)}=se.flanger_phase%
  15403.   SELECT type%
  15404.   CASE 0                        ! Mono
  15405.     CARD{ADD(V:b$,46)}=1
  15406.     LONG{ADD(V:b$,52)}=0                        ! Fdbklr = 0
  15407.     LONG{ADD(V:b$,56)}=0                        ! Fdbkrl = 0
  15408.     LONG{ADD(V:b$,68)}=0                        ! Dryr = 0
  15409.     LONG{ADD(V:b$,76)}=0                        ! Wetr = 0
  15410.   CASE 1                        ! Left
  15411.     CARD{ADD(V:b$,46)}=1
  15412.   CASE 2                        ! Right
  15413.     CARD{ADD(V:b$,46)}=2
  15414.   CASE 3                        ! Mix
  15415.     CARD{ADD(V:b$,46)}=7
  15416.   ENDSELECT
  15417.   '
  15418.   GOSUB affiche_panneau_progression("Please wait...",LONG{ADD(V:b$,32)},-1,-1)
  15419.   a%=V:b$
  15420.   ~C:g_fx_stereo_flanger%(L:a%)
  15421.   WHILE LONG{g_progression_pos%}<LONG{g_progression_len%}
  15422.     GOSUB affiche_progression(LONG{g_progression_pos%})
  15423.     ~C:g_fx_stereo_flanger%(L:0)
  15424.   WEND
  15425.   ERASE buffer1%(),buffer2%()
  15426.   ~FRE(0)
  15427. RETURN
  15428. ' Reverb
  15429. PROCEDURE se.sm_affsm_reverb
  15430.   IF ss_menu2.rev%=2
  15431.     GOSUB se.sm_affsm_reverb2
  15432.   ELSE
  15433.     GOSUB cadre_int(orc%,ADD(ory%,80),24,19,13,13,14,12)
  15434.     GOSUB cadre_int(orc%,ADD(ory%,100),24,39,13,13,14,12)
  15435.     GOSUB cadre_int(ADD(orc%,25),ADD(ory%,80),23,39,13,13,14,12)
  15436.     GOSUB cadre_int(ADD(orc%,49),ADD(ory%,80),23,39,13,13,14,12)
  15437.     GOSUB affiche_bloc_icones_b(0,16,21,orc%,ory%)
  15438.     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)
  15439.     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)
  15440.     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)
  15441.     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)
  15442.     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)
  15443.     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)
  15444.     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)
  15445.     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)
  15446.     GOSUB affchaine_trans("EARLY REFLECTION",ADD(SHL(orc%,1),52),ADD(ory%,87),14)
  15447.     GOSUB affchaine_trans("COMB FILTERS",ADD(SHL(orc%,1),100),ADD(ory%,87),14)
  15448.     GOSUB se.sm_actsm_reverb
  15449.   ENDIF
  15450. RETURN
  15451. PROCEDURE se.sm_actsm_reverb
  15452.   IF ss_menu2.rev%=2
  15453.     GOSUB se.sm_actsm_reverb2
  15454.   ELSE
  15455.     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)
  15456.     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)
  15457.     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)
  15458.     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)
  15459.     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)
  15460.     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)
  15461.     IF se.rev_source%>0
  15462.       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)
  15463.       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)
  15464.     ELSE
  15465.       GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,12,21),8)),ADD(ory%,ADD(divbi&(1,12,21),2)),1)
  15466.       GOSUB affchaine_notrans("Block"+SPACE$(23),ADD(orc%,ADD(divbi&(0,15,21),1)),ADD(ory%,ADD(divbi&(1,15,21),2)),1)
  15467.     ENDIF
  15468.   ENDIF
  15469. RETURN
  15470. PROCEDURE se.sm_gere_reverb
  15471.   ' Var locales de Sample_Editor :
  15472.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15473.   ' Utilise srt%, a%, b%, i%, j%, a$, flag_relachement!
  15474.   LOCAL freq_buf_real
  15475.   ~FRE(0)
  15476.   IF ss_menu2.rev%=2
  15477.     GOSUB se.sm_gere_reverb2
  15478.   ELSE
  15479.     IF km%>0
  15480.       a%=V:divbi&(0,0,0)
  15481.       srt%=C:g_teste_icones%(L:a%,W:21,W:xm2%,W:ym2%)
  15482.       IF srt%>=0
  15483.         SELECT srt%
  15484.           ' Radio-boutons, Flip-flops ou champs de texte
  15485.           ' ------------------------------------------------------------------
  15486.         CASE 2                  ! Dry level
  15487.           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)
  15488.           se.rev_drylevel%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15489.           GOSUB se.sm_actsm_reverb
  15490.           ' ------------------------------------------------------------------
  15491.         CASE 3                  ! Reverb level
  15492.           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)
  15493.           se.rev_revlevel%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15494.           GOSUB se.sm_actsm_reverb
  15495.           ' ------------------------------------------------------------------
  15496.         CASE 4                  ! Early reflection level
  15497.           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)
  15498.           se.rev_ereflevel%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15499.           GOSUB se.sm_actsm_reverb
  15500.           ' ------------------------------------------------------------------
  15501.         CASE 5                  ! Nombre de taps
  15502.           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)
  15503.           se.rev_nbrtaps%=MIN(MAX(VAL(bbbb$),1),16)
  15504.           GOSUB se.sm_actsm_reverb
  15505.           ' ------------------------------------------------------------------
  15506.         CASE 6,7                ! Nombre de taps +/-
  15507.           se.rev_nbrtaps%=MAX(MIN(ADD(se.rev_nbrtaps%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,6),km%))),16),1)
  15508.           GOSUB se.sm_actsm_reverb
  15509.           IF km%=1
  15510.             PAUSE 8
  15511.           ENDIF
  15512.           flag_relachement!=FALSE
  15513.           ' ------------------------------------------------------------------
  15514.         CASE 8                  ! Nombre de comb filters
  15515.           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)
  15516.           se.rev_nbrcomb%=MIN(MAX(VAL(bbbb$),1),8)
  15517.           GOSUB se.sm_actsm_reverb
  15518.           ' ------------------------------------------------------------------
  15519.         CASE 9,10               ! Nombre de comb filters +/-
  15520.           se.rev_nbrcomb%=MAX(MIN(ADD(se.rev_nbrcomb%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%))),8),1)
  15521.           GOSUB se.sm_actsm_reverb
  15522.           IF km%=1
  15523.             PAUSE 8
  15524.           ENDIF
  15525.           flag_relachement!=FALSE
  15526.           ' ------------------------------------------------------------------
  15527.         CASE 11                 ! Gain general de combs
  15528.           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)
  15529.           se.rev_combgain%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15530.           GOSUB se.sm_actsm_reverb
  15531.           ' ------------------------------------------------------------------
  15532.         CASE 12                 ! Sample source
  15533.           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)
  15534.           se.rev_source%=MIN(MAX(VAL("$"+bbbb$),0),255)
  15535.           GOSUB se.sm_actsm_reverb
  15536.           ' ------------------------------------------------------------------
  15537.         CASE 13,14              ! Source +/-
  15538.           se.rev_source%=MAX(MIN(ADD(se.rev_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,13),km%))),255),0)
  15539.           GOSUB se.sm_actsm_reverb
  15540.           IF km%=1
  15541.             PAUSE 8
  15542.           ENDIF
  15543.           flag_relachement!=FALSE
  15544.           ' ------------------------------------------------------------------
  15545.         CASE 15                 ! Nom du sample source
  15546.           ' Aucun effet
  15547.           ' ------------------------------------------------------------------
  15548.         DEFAULT
  15549.           ' Icones normales
  15550.           GOSUB affiche_icone_b(srt%,21,orc%,ory%,-1)
  15551.           GOSUB wait_mouse(TRUE)
  15552.           SELECT srt%
  15553.             ' ----------------------------------------------------------------
  15554.           CASE 0                ! 2nd page
  15555.             ss_menu2.rev%=2
  15556.             ' ----------------------------------------------------------------
  15557.           CASE 1                ! Reverberation
  15558.             GOSUB bee(TRUE)
  15559.             SHOWM
  15560.             ' Calcule la longueur totale de tous les buffers
  15561.             b%=0                                ! Longueur totale
  15562.             FOR i%=0 TO PRED(se.rev_nbrtaps%)
  15563.               b%=MAX(b%,se.rev_tapdelay%(i%))
  15564.             NEXT i%
  15565.             freq_buf_real=freq_buffer%
  15566.             a%=ADD(ADD(INT(freq_buf_real*b%/500000),2),1023) AND -1024
  15567.             se.rev_buffer$(0)=STRING$(a%,0)
  15568.             a%=ADD(INT(freq_buf_real*se.rev_adlydelay%/500000),1023) AND -1024
  15569.             se.rev_buffer$(1)=STRING$(a%,0)
  15570.             a%=ADD(INT(freq_buf_real*se.rev_aprdelay%/500000),1023) AND -1024
  15571.             se.rev_buffer$(2)=STRING$(a%,0)
  15572.             FOR i%=0 TO PRED(se.rev_nbrcomb%)
  15573.               a%=ADD(INT(freq_buf_real*se.rev_combdelay%(i%)/500000),1023) AND -1024
  15574.               se.rev_buffer$(ADD(i%,3))=STRING$(a%,0)
  15575.             NEXT i%
  15576.             a$=STRING$(4096,0)
  15577.             ' Creation du bloc de parametres
  15578.             IF se.rev_source%>0
  15579.               LONG{V:a$}=FN adresse(se.rev_source%)
  15580.               LONG{ADD(V:a$,8)}=FN length(se.rev_source%)
  15581.               CARD{ADD(V:a$,16)}=FN resol(se.rev_source%)
  15582.             ELSE
  15583.               LONG{V:a$}=ADD(FN adr_buffer,mark_1%)
  15584.               LONG{ADD(V:a$,8)}=mark_len%
  15585.               CARD{ADD(V:a$,16)}=win_bits%
  15586.             ENDIF
  15587.             LONG{ADD(V:a$,4)}=ADD(FN adr_buffer,mark_1%)
  15588.             LONG{ADD(V:a$,12)}=mark_len%
  15589.             CARD{ADD(V:a$,18)}=win_bits%
  15590.             LONG{ADD(V:a$,20)}=SHL(se.rev_drylevel%,1)
  15591.             LONG{ADD(V:a$,24)}=SHL(se.rev_ereflevel%,1)
  15592.             LONG{ADD(V:a$,28)}=SHL(se.rev_revlevel%,1)
  15593.             LONG{ADD(V:a$,32)}=V:se.rev_buffer$(0)
  15594.             LONG{ADD(V:a$,36)}=LEN(se.rev_buffer$(0))
  15595.             LONG{ADD(V:a$,40)}=V:se.rev_buffer$(1)
  15596.             LONG{ADD(V:a$,44)}=LEN(se.rev_buffer$(1))
  15597.             LONG{ADD(V:a$,48)}=V:se.rev_buffer$(2)
  15598.             LONG{ADD(V:a$,52)}=LEN(se.rev_buffer$(2))
  15599.             LONG{ADD(V:a$,56)}=SHL(se.rev_aprg%,1)
  15600.             LONG{ADD(V:a$,60)}=-SHL(se.rev_aprg%,1)
  15601.             LONG{ADD(V:a$,64)}=SUB(65536,INT(se.rev_aprg%*se.rev_aprg%/16384))  ! 1 - g^2
  15602.             CARD{ADD(V:a$,68)}=se.rev_nbrtaps%
  15603.             FOR i%=0 TO PRED(se.rev_nbrtaps%)   ! On rajoute 1 sample au delay, c'est normal ------v
  15604.               LONG{ADD(V:a$,ADD(70,SHL(i%,3)))}=ADD(INT(freq_buf_real*se.rev_tapdelay%(i%)/500000),3) AND -2
  15605.               LONG{ADD(V:a$,ADD(74,SHL(i%,3)))}=SHL(se.rev_taplevel%(i%),1)
  15606.             NEXT i%
  15607.             CARD{ADD(V:a$,198)}=se.rev_nbrcomb%
  15608.             FOR i%=0 TO PRED(se.rev_nbrcomb%)
  15609.               LONG{ADD(V:a$,ADD(200,MUL(i%,28)))}=V:se.rev_buffer$(ADD(i%,3))
  15610.               LONG{ADD(V:a$,ADD(204,MUL(i%,28)))}=LEN(se.rev_buffer$(ADD(i%,3)))
  15611.               a%=SUCC(INT(freq_buf_real*se.rev_combdelay%(i%)/500000)) AND -2
  15612.               LONG{ADD(V:a$,ADD(208,MUL(i%,28)))}=a%
  15613.               a%=INT(se.rev_combgain%*(SUB(32768,se.rev_comblpf%(i%))/16384))
  15614.               LONG{ADD(V:a$,ADD(212,MUL(i%,28)))}=a%
  15615.               LONG{ADD(V:a$,ADD(216,MUL(i%,28)))}=SHL(se.rev_comblpf%(i%),1)
  15616.             NEXT i%
  15617.             LONG{ADD(V:a$,424)}=SUCC(INT(freq_buf_real*se.rev_aprdelay%/500000)) AND -2
  15618.             LONG{ADD(V:a$,428)}=SUCC(INT(freq_buf_real*se.rev_adlydelay%/500000)) AND -2
  15619.             '
  15620.             GOSUB affiche_panneau_progression("Please wait...",LONG{ADD(V:a$,12)},-1,-1)
  15621.             a%=V:a$
  15622.             ~C:g_reverberation%(L:a%)
  15623.             WHILE LONG{g_progression_pos%}<LONG{g_progression_len%}
  15624.               GOSUB affiche_progression(LONG{g_progression_pos%})
  15625.               ~C:g_reverberation%(L:0)
  15626.             WEND
  15627.             '
  15628.             FOR i%=0 TO ADD(se.rev_nbrcomb%,2)
  15629.               se.rev_buffer$(i%)=""
  15630.             NEXT i%
  15631.             ~FRE(0)
  15632.             GOSUB bee(FALSE)
  15633.             GOSUB affiche_panneau_sample
  15634.             ' ----------------------------------------------------------------
  15635.           ENDSELECT
  15636.           GOSUB affiche_icone_b(srt%,21,orc%,ory%,0)
  15637.         ENDSELECT
  15638.         GOSUB wait_mouse(flag_relachement!)
  15639.         flag_relachement!=TRUE
  15640.         GOSUB vide_buffer_clavier
  15641.         IF ss_menu2.rev%<>1
  15642.           GOSUB sample_editor.affiche_sm
  15643.         ENDIF
  15644.       ENDIF
  15645.     ENDIF
  15646.   ENDIF
  15647. RETURN
  15648. PROCEDURE se.sm_affsm_reverb2
  15649.   ' Var locales de Sample_Editor :
  15650.   ' i%
  15651.   GOSUB cadre_int(orc%,ADD(ory%,80),18,59,13,13,14,12)
  15652.   GOSUB cadre_int(ADD(orc%,19),ADD(ory%,80),18,59,13,13,14,12)
  15653.   GOSUB cadre_int(ADD(orc%,38),ADD(ory%,80),29,29,13,13,14,12)
  15654.   GOSUB cadre_int(ADD(orc%,38),ADD(ory%,110),29,29,13,13,14,12)
  15655.   GOSUB affiche_bloc_icones_b(0,1,22,orc%,ory%)
  15656.   GOSUB affiche_bloc_icones_b(4,2,22,orc%,ory%)
  15657.   GOSUB affiche_bloc_icones_b(9,5,22,orc%,ory%)
  15658.   FOR i%=1 TO 6 STEP 5
  15659.     GOSUB cadre_ext(ADD(orc%,divbi&(0,i%,22)),ADD(ory%,divbi&(1,i%,22)),1,41,0,13,12,14)
  15660.     GOSUB cadre_ext(ADD(orc%,divbi&(0,SUCC(i%),22)),ADD(ory%,divbi&(1,SUCC(i%),22)),4,41,0,13,12,14)
  15661.     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)
  15662.   NEXT i%
  15663.   FOR i%=11 TO 13
  15664.     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)
  15665.   NEXT i%
  15666.   GOSUB affchaine_trans("EARLY REFLECTION",ADD(SHL(orc%,1),2),ADD(ory%,82),14)
  15667.   GOSUB affchaine_trans("COMB FILTERS",ADD(SHL(orc%,1),40),ADD(ory%,82),14)
  15668.   GOSUB affchaine_trans("#",ADD(SHL(orc%,1),3),ADD(ory%,134),14)
  15669.   GOSUB affchaine_trans("DELAY",ADD(SHL(orc%,1),8),ADD(ory%,134),14)
  15670.   GOSUB affchaine_trans("GAIN",ADD(SHL(orc%,1),21),ADD(ory%,134),14)
  15671.   GOSUB affchaine_trans("#",ADD(SHL(orc%,1),41),ADD(ory%,134),14)
  15672.   GOSUB affchaine_trans("DELAY",ADD(SHL(orc%,1),46),ADD(ory%,134),14)
  15673.   GOSUB affchaine_trans("LPF",ADD(SHL(orc%,1),60),ADD(ory%,134),14)
  15674.   GOSUB affchaine_trans("ALL PASS REVERB",ADD(SHL(orc%,1),78),ADD(ory%,87),14)
  15675.   GOSUB affchaine_trans("ALIGNEMENT DELAY",ADD(SHL(orc%,1),78),ADD(ory%,117),14)
  15676.   GOSUB se.sm_actsm_reverb2
  15677. RETURN
  15678. PROCEDURE se.sm_actsm_reverb2
  15679.   ' Var locales de Sample_Editor :
  15680.   ' a%, b%, c%, i%
  15681.   a%=se.rev_tappos%
  15682.   b%=se.rev_combpos%
  15683.   FOR i%=0 TO 36 STEP 6
  15684.     IF a%<16
  15685.       IF a%<se.rev_nbrtaps%
  15686.         c%=1
  15687.       ELSE
  15688.         c%=12
  15689.       ENDIF
  15690.       GOSUB affchaine_notrans(STR$(SUCC(a%),2),ADD(orc%,divbi&(0,1,22)),ADD(ory%,ADD(divbi&(1,1,22),i%)),c%)
  15691.       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%)
  15692.       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%)
  15693.     ELSE
  15694.       GOSUB affchaine_notrans(SPACE$(2),ADD(orc%,divbi&(0,1,22)),ADD(ory%,ADD(divbi&(1,1,22),i%)),1)
  15695.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,2,22)),ADD(ory%,ADD(divbi&(1,2,22),i%)),1)
  15696.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,3,22)),ADD(ory%,ADD(divbi&(1,3,22),i%)),1)
  15697.     ENDIF
  15698.     IF b%<8
  15699.       IF b%<se.rev_nbrcomb%
  15700.         c%=1
  15701.       ELSE
  15702.         c%=12
  15703.       ENDIF
  15704.       GOSUB affchaine_notrans(STR$(SUCC(b%),2),ADD(orc%,divbi&(0,6,22)),ADD(ory%,ADD(divbi&(1,6,22),i%)),c%)
  15705.       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%)
  15706.       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%)
  15707.     ELSE
  15708.       GOSUB affchaine_notrans(SPACE$(2),ADD(orc%,divbi&(0,6,22)),ADD(ory%,ADD(divbi&(1,6,22),i%)),1)
  15709.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,7,22)),ADD(ory%,ADD(divbi&(1,7,22),i%)),1)
  15710.       GOSUB affchaine_notrans(SPACE$(5),ADD(orc%,divbi&(0,8,22)),ADD(ory%,ADD(divbi&(1,8,22),i%)),1)
  15711.     ENDIF
  15712.     INC a%
  15713.     INC b%
  15714.   NEXT i%
  15715.   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)
  15716.   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)
  15717.   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)
  15718. RETURN
  15719. PROCEDURE se.sm_gere_reverb2
  15720.   ' Var locales de Sample_Editor :
  15721.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15722.   ' Utilise srt%, a%, b%, c%, aaaa$, flag_relachement!
  15723.   ~FRE(0)
  15724.   IF km%>0
  15725.     a%=V:divbi&(0,0,0)
  15726.     srt%=C:g_teste_icones%(L:a%,W:22,W:xm2%,W:ym2%)
  15727.     IF srt%>=0
  15728.       SELECT srt%
  15729.         ' Radio-boutons, Flip-flops ou champs de texte
  15730.         ' --------------------------------------------------------------------
  15731.       CASE 2            ! Tap delay
  15732.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  15733.         b%=ADD(a%,se.rev_tappos%)
  15734.         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)
  15735.         se.rev_tapdelay%(b%)=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  15736.         GOSUB se.sm_actsm_reverb2
  15737.         ' --------------------------------------------------------------------
  15738.       CASE 3            ! Tap level
  15739.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  15740.         b%=ADD(a%,se.rev_tappos%)
  15741.         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)
  15742.         se.rev_taplevel%(b%)=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  15743.         GOSUB se.sm_actsm_reverb2
  15744.         ' --------------------------------------------------------------------
  15745.       CASE 4,5          ! Position +/- dans liste des taps
  15746.         se.rev_tappos%=MAX(MIN(SUB(se.rev_tappos%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,4),km%))),9),0)
  15747.         GOSUB se.sm_actsm_reverb2
  15748.         IF km%=1
  15749.           PAUSE 8
  15750.         ENDIF
  15751.         flag_relachement!=FALSE
  15752.         ' --------------------------------------------------------------------
  15753.       CASE 7            ! Comb delay
  15754.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  15755.         b%=ADD(a%,se.rev_combpos%)
  15756.         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)
  15757.         se.rev_combdelay%(b%)=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  15758.         GOSUB se.sm_actsm_reverb2
  15759.         ' --------------------------------------------------------------------
  15760.       CASE 8            ! Comb LPF gain
  15761.         a%=DIV(SUB(ym2%,divbi&(1,srt%,22)),6)
  15762.         b%=ADD(a%,se.rev_combpos%)
  15763.         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)
  15764.         se.rev_comblpf%(b%)=DIV(32768*MIN(MAX(VAL(bbbb$),0),100),100)
  15765.         GOSUB se.sm_actsm_reverb2
  15766.         ' --------------------------------------------------------------------
  15767.       CASE 9,10         ! Position +/- dans liste des comb filters
  15768.         se.rev_combpos%=MAX(MIN(SUB(se.rev_combpos%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,9),km%))),1),0)
  15769.         GOSUB se.sm_actsm_reverb2
  15770.         IF km%=1
  15771.           PAUSE 8
  15772.         ENDIF
  15773.         flag_relachement!=FALSE
  15774.         ' --------------------------------------------------------------------
  15775.       CASE 11           ! APR delay
  15776.         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)
  15777.         se.rev_aprdelay%=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  15778.         GOSUB se.sm_actsm_reverb2
  15779.         ' --------------------------------------------------------------------
  15780.       CASE 12           ! APR gain
  15781.         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)
  15782.         se.rev_aprg%=DIV(32768*MIN(MAX(VAL(bbbb$),0),100),100)
  15783.         GOSUB se.sm_actsm_reverb2
  15784.         ' --------------------------------------------------------------------
  15785.       CASE 13           ! Alignement delay
  15786.         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)
  15787.         se.rev_adlydelay%=MAX(MIN(VAL(bbbb$)*1000,250000),0)
  15788.         GOSUB se.sm_actsm_reverb2
  15789.         ' --------------------------------------------------------------------
  15790.       CASE 1,6          ! Numero de tap/comb
  15791.         ' Aucun effet
  15792.         ' --------------------------------------------------------------------
  15793.       DEFAULT
  15794.         ' Icones normales
  15795.         GOSUB affiche_icone_b(srt%,22,orc%,ory%,-1)
  15796.         GOSUB wait_mouse(TRUE)
  15797.         SELECT srt%
  15798.           ' ------------------------------------------------------------------
  15799.         CASE 0          ! 1st page
  15800.           ss_menu2.rev%=1
  15801.           ' ------------------------------------------------------------------
  15802.         ENDSELECT
  15803.         GOSUB affiche_icone_b(srt%,22,orc%,ory%,0)
  15804.       ENDSELECT
  15805.       GOSUB wait_mouse(flag_relachement!)
  15806.       flag_relachement!=TRUE
  15807.       GOSUB vide_buffer_clavier
  15808.       IF ss_menu2.rev%<>2
  15809.         GOSUB sample_editor.affiche_sm
  15810.       ENDIF
  15811.     ENDIF
  15812.   ENDIF
  15813. RETURN
  15814. ' Song to disk
  15815. PROCEDURE se.sm_affsm_song2disk
  15816.   GOSUB cadre_int(orc%,ADD(ory%,80),15,39,13,13,14,12)
  15817.   GOSUB cadre_int(ADD(orc%,16),ADD(ory%,80),25,19,13,13,14,12)
  15818.   GOSUB cadre_int(ADD(orc%,16),ADD(ory%,100),25,19,13,13,14,12)
  15819.   GOSUB cadre_int(ADD(orc%,34),ADD(ory%,80),7,39,13,13,14,12)
  15820.   GOSUB cadre_int(ADD(orc%,42),ADD(ory%,80),26,39,13,13,14,12)
  15821.   GOSUB cadre_int(ADD(orc%,69),ADD(ory%,80),10,59,13,13,14,12)
  15822.   GOSUB cadre_int(ADD(orc%,57),ADD(ory%,120),11,19,13,13,14,12)
  15823.   GOSUB affiche_bloc_icones_b(4,8,23,orc%,ory%)
  15824.   GOSUB affiche_bloc_icones_b(20,1,23,orc%,ory%)
  15825.   GOSUB cadre_ext(ADD(orc%,divbi&(0,0,23)),ADD(ADD(ory%,divbi&(1,0,23)),2),1,5,0,13,12,14)
  15826.   GOSUB cadre_ext(ADD(orc%,divbi&(0,1,23)),ADD(ADD(ory%,divbi&(1,1,23)),2),1,5,0,13,12,14)
  15827.   GOSUB cadre_ext(ADD(orc%,divbi&(0,2,23)),ADD(ADD(ory%,divbi&(1,2,23)),2),1,5,0,13,12,14)
  15828.   GOSUB cadre_ext(ADD(orc%,divbi&(0,3,23)),ADD(ADD(ory%,divbi&(1,3,23)),2),1,5,0,13,12,14)
  15829.   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)
  15830.   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)
  15831.   GOSUB affchaine_trans("POS",ADD(SHL(orc%,1),2),ADD(ory%,97),14)
  15832.   GOSUB affchaine_trans("LINE",ADD(SHL(orc%,1),2),ADD(ory%,107),14)
  15833.   GOSUB affchaine_trans("START",ADD(SHL(orc%,1),12),ADD(ory%,87),14)
  15834.   GOSUB affchaine_trans("END",ADD(SHL(orc%,1),24),ADD(ory%,87),14)
  15835.   GOSUB affchaine_trans("TO:",ADD(SHL(orc%,1),70),ADD(ory%,87),14)
  15836.   GOSUB affchaine_trans("SECURITY",ADD(SHL(orc%,1),86),ADD(ory%,87),14)
  15837.   GOSUB affchaine_trans("REC SPEED",ADD(SHL(orc%,1),140),ADD(ory%,87),14)
  15838.   GOSUB se.sm_actsm_song2disk
  15839. RETURN
  15840. PROCEDURE se.sm_actsm_song2disk
  15841.   ' Var locales de Sample_Editor utilisees:
  15842.   ' i%
  15843.   GOSUB affchaine_notrans(HEX$(se.s2d_posstart%,2),ADD(orc%,divbi&(0,0,23)),ADD(ADD(ory%,divbi&(1,0,23)),2),1)
  15844.   GOSUB affchaine_notrans(HEX$(se.s2d_posend%,2),ADD(orc%,divbi&(0,1,23)),ADD(ADD(ory%,divbi&(1,1,23)),2),1)
  15845.   GOSUB affchaine_notrans(HEX$(se.s2d_ligstart%,2),ADD(orc%,divbi&(0,2,23)),ADD(ADD(ory%,divbi&(1,2,23)),2),1)
  15846.   GOSUB affchaine_notrans(HEX$(se.s2d_ligend%,2),ADD(orc%,divbi&(0,3,23)),ADD(ADD(ory%,divbi&(1,3,23)),2),1)
  15847.   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)
  15848.   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)
  15849.   GOSUB affiche_icone_b(4,23,orc%,ory%,se.s2d_bits%<>2)
  15850.   GOSUB affiche_icone_b(5,23,orc%,ory%,se.s2d_bits%=2)
  15851.   GOSUB affiche_icone_b(6,23,orc%,ory%,se.s2d_stereo%<>2)
  15852.   GOSUB affiche_icone_b(7,23,orc%,ory%,se.s2d_stereo%=2)
  15853.   GOSUB affiche_icone_b(8,23,orc%,ory%,se.s2d_out%<>2)
  15854.   GOSUB affiche_icone_b(9,23,orc%,ory%,se.s2d_out%=2)
  15855.   GOSUB affiche_icone_b(21,23,orc%,ory%,se.s2d_monitor!)
  15856.   FOR i%=0 TO 7
  15857.     GOSUB affiche_icone_b(ADD(12,i%),23,orc%,ory%,se.s2d_speed%=i%)
  15858.   NEXT i%
  15859.   se.s2d_prediv%=VAL("$"+MID$("1234579B",SUCC(se.s2d_speed%),1))
  15860. RETURN
  15861. PROCEDURE se.sm_gere_song2disk
  15862.   ' Var locales de Sample_Editor :
  15863.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  15864.   ' Utilise srt%, a%, aaaa$, flag_relachement!
  15865.   ~FRE(0)
  15866.   IF km%>0
  15867.     a%=V:divbi&(0,0,0)
  15868.     srt%=C:g_teste_icones%(L:a%,W:23,W:xm2%,W:ym2%)
  15869.     IF srt%>=0
  15870.       SELECT srt%
  15871.         ' Radio-boutons, Flip-flops ou champs de texte
  15872.         ' --------------------------------------------------------------------
  15873.       CASE 0            ! Start pos
  15874.         GOSUB edite_chaine(HEX$(se.s2d_posstart%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  15875.         se.s2d_posstart%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN song_length))
  15876.         GOSUB se.sm_actsm_song2disk
  15877.         ' --------------------------------------------------------------------
  15878.       CASE 1            ! End pos
  15879.         GOSUB edite_chaine(HEX$(se.s2d_posend%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  15880.         se.s2d_posend%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN song_length))
  15881.         GOSUB se.sm_actsm_song2disk
  15882.         ' --------------------------------------------------------------------
  15883.       CASE 2            ! Start line
  15884.         GOSUB edite_chaine(HEX$(se.s2d_ligstart%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  15885.         se.s2d_ligstart%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN nbr_lines(se.s2d_posstart%)))
  15886.         GOSUB se.sm_actsm_song2disk
  15887.         ' --------------------------------------------------------------------
  15888.       CASE 3            ! End line
  15889.         GOSUB edite_chaine(HEX$(se.s2d_ligend%,2),ADD(orc%,divbi&(0,srt%,23)),ADD(ory%,ADD(divbi&(1,srt%,23),2)),2,1)
  15890.         se.s2d_ligend%=MIN(MAX(0,VAL("$"+bbbb$)),PRED(FN nbr_lines(se.s2d_posend%)))
  15891.         GOSUB se.sm_actsm_song2disk
  15892.         ' --------------------------------------------------------------------
  15893.       CASE 4            ! 8 bits
  15894.         se.s2d_bits%=1
  15895.         GOSUB se.sm_actsm_song2disk
  15896.         ' --------------------------------------------------------------------
  15897.       CASE 5            ! 16 bits
  15898.         se.s2d_bits%=2
  15899.         GOSUB se.sm_actsm_song2disk
  15900.         ' --------------------------------------------------------------------
  15901.       CASE 6            ! Mono
  15902.         se.s2d_stereo%=1
  15903.         GOSUB se.sm_actsm_song2disk
  15904.         ' --------------------------------------------------------------------
  15905.       CASE 7            ! Stereo
  15906.         se.s2d_stereo%=2
  15907.         GOSUB se.sm_actsm_song2disk
  15908.         ' --------------------------------------------------------------------
  15909.       CASE 8            ! To block
  15910.         se.s2d_out%=1
  15911.         GOSUB se.sm_actsm_song2disk
  15912.         ' --------------------------------------------------------------------
  15913.       CASE 9            ! To sample
  15914.         se.s2d_out%=2
  15915.         GOSUB se.sm_actsm_song2disk
  15916.         ' --------------------------------------------------------------------
  15917.       CASE 10           ! Maximum duration
  15918.         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)
  15919.         se.s2d_maxsize%=MIN(MAX(0,VAL(bbbb$)*MUL(freq_buffer%,MUL(se.s2d_bits%,se.s2d_stereo%))/1024),99999)
  15920.         GOSUB se.sm_actsm_song2disk
  15921.         ' --------------------------------------------------------------------
  15922.       CASE 11           ! Maximum size
  15923.         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)
  15924.         se.s2d_maxsize%=MIN(MAX(0,VAL(bbbb$)),3999999)
  15925.         GOSUB se.sm_actsm_song2disk
  15926.         ' --------------------------------------------------------------------
  15927.       CASE 12 TO 19     ! Recording speed
  15928.         se.s2d_speed%=SUB(srt%,12)
  15929.         se.s2d_prediv%=VAL("$"+MID$("1234579B",SUCC(se.s2d_speed%),1))
  15930.         GOSUB se.sm_actsm_song2disk
  15931.         ' --------------------------------------------------------------------
  15932.       CASE 21           ! Monitor
  15933.         se.s2d_monitor!=NOT se.s2d_monitor!
  15934.         GOSUB se.sm_actsm_song2disk
  15935.         ' --------------------------------------------------------------------
  15936.       DEFAULT
  15937.         ' Icones normales
  15938.         GOSUB affiche_icone_b(srt%,23,orc%,ory%,-1)
  15939.         GOSUB wait_mouse(TRUE)
  15940.         SELECT srt%
  15941.           ' ------------------------------------------------------------------
  15942.         CASE 20         ! Record
  15943.           IF se.s2d_out%=2
  15944.             GOSUB se.sm_record_song_to_disk
  15945.           ELSE
  15946.             GOSUB se.sm_record_song_to_block
  15947.           ENDIF
  15948.           se.volume_ok!=FALSE
  15949.           GOSUB affiche_panneau_sample
  15950.           ' ------------------------------------------------------------------
  15951.         ENDSELECT
  15952.         GOSUB affiche_icone_b(srt%,23,orc%,ory%,0)
  15953.       ENDSELECT
  15954.       GOSUB wait_mouse(flag_relachement!)
  15955.       flag_relachement!=TRUE
  15956.       GOSUB vide_buffer_clavier
  15957.     ENDIF
  15958.   ENDIF
  15959. RETURN
  15960. PROCEDURE se.sm_record_song_to_block
  15961.   LOCAL ok!
  15962.   IF mark_len%<MUL(se.s2d_bits%,se.s2d_stereo%)
  15963.     GOSUB dialog("STOP","Block too small.","Cancel",MOUSEX,MOUSEY)
  15964.     GOSUB affiche_panneau_sample
  15965.   ELSE IF freq_buffer%<12000
  15966.     GOSUB dialog("STOP","Recording frequency must be|greater than 12 KHz.","Cancel",MOUSEX,MOUSEY)
  15967.     GOSUB affiche_panneau_sample
  15968.   ELSE
  15969.     ok!=TRUE
  15970.     IF se.s2d_monitor! AND freq_buffer%<DIV(DIV(98340,SUCC(se.s2d_prediv%)),3)
  15971.       GOSUB dialog("WARNING","Please select a lower recording frequency|to avoid bugs.","Continue|Cancel",MOUSEX,MOUSEY)
  15972.       IF bouton%=1
  15973.         ok!=FALSE
  15974.       ENDIF
  15975.       GOSUB affiche_panneau_sample
  15976.     ENDIF
  15977.     IF ok!
  15978.       IF se.s2d_monitor!
  15979.         GOSUB se.sm_do_record_song_to_block
  15980.       ELSE
  15981.         GOSUB se.sm_do_record_song_to_block_norealtime
  15982.       ENDIF
  15983.     ENDIF
  15984.   ENDIF
  15985. RETURN
  15986. PROCEDURE se.sm_do_record_song_to_block
  15987.   LOCAL longueur%
  15988.   LOCAL sortie!
  15989.   GOSUB stop_voices
  15990.   GOSUB bee(TRUE)
  15991.   '
  15992.   ' Preparation des routines d'enregistrement
  15993.   '
  15994.   longueur%=mark_len% AND -win_bits%
  15995.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  15996.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  15997.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  15998.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  15999.   LONG{ADD(r_songrecord_state%,10)}=g_rec_sam_buffer%
  16000.   LONG{ADD(r_songrecord_state%,14)}=ADD(g_rec_sam_buffer%,4096)
  16001.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16002.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16003.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16004.   CARD{ADD(r_songrecord_state%,32)}=1           ! Realtime
  16005.   CARD{r_songrecord_state%}=0
  16006.   LONG{g_sngrec_paramadr%}=r_songrecord_state%
  16007.   LONG{ADD(g_sngrec_paramadr%,4)}=ADD(FN adr_buffer,mark_1%)    ! Adresse du buffer
  16008.   LONG{ADD(g_sngrec_paramadr%,8)}=longueur%     ! Taille du buffer
  16009.   LONG{ADD(g_sngrec_paramadr%,12)}=0            ! Position du buffer
  16010.   LONG{ADD(g_sngrec_paramadr%,16)}=longueur%    ! Taille maxi
  16011.   LONG{ADD(g_sngrec_paramadr%,20)}=0            ! Position du sample
  16012.   CARD{ADD(g_sngrec_paramadr%,24)}=1            ! Type (1 = bouclage)
  16013.   CARD{ADD(g_sngrec_paramadr%,26)}=1            ! Flag (0 = arret)
  16014.   CARD{ADD(g_sngrec_paramadr%,28)}=win_bits%
  16015.   CARD{ADD(g_sngrec_paramadr%,30)}=1            ! Mono
  16016.   songpos%=se.s2d_posstart%
  16017.   sortie!=FALSE
  16018.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16019.   GOSUB play_song2(0)
  16020.   ~C:g_start_song_recording%(W:0)
  16021.   '
  16022.   ' Boucle d'enregistrement
  16023.   '
  16024.   REPEAT
  16025.     ' Position finale atteinte ?
  16026.     IF CARD{r_songrecord_state%}=4
  16027.       ~C:g_stop_song_recording%(W:0)
  16028.       sortie!=TRUE
  16029.     ENDIF
  16030.     ' Depasse le temps imparti ou la taille maxi ?
  16031.     IF CARD{ADD(g_sngrec_paramadr%,26)}=0
  16032.       sortie!=TRUE
  16033.     ENDIF
  16034.     ' Arret de l'utilisateur ?
  16035.     IF GEMDOS(11)<>0
  16036.       ~GEMDOS(7)
  16037.       sortie!=TRUE
  16038.     ENDIF
  16039.   UNTIL sortie!
  16040.   '
  16041.   ' On s'arrete d'enregistrer si on est sorti avant la fin
  16042.   '
  16043.   IF CARD{ADD(g_sngrec_paramadr%,26)}<>0
  16044.     ~C:g_stop_song_recording%(W:0)
  16045.   ENDIF
  16046.   IF CARD{r_songrecord_state%}<3
  16047.     CARD{r_songrecord_state%}=3
  16048.   ENDIF
  16049.   REPEAT
  16050.   UNTIL CARD{r_songrecord_state%}=4 AND CARD{ADD(g_sngrec_paramadr%,26)}=0
  16051.   CARD{r_songrecord_state%}=0
  16052.   mark_2%=ADD(mark_1%,LONG{ADD(g_sngrec_paramadr%,20)})
  16053.   GOSUB stop_voices
  16054.   GOSUB bee(FALSE)
  16055. RETURN
  16056. PROCEDURE se.sm_do_record_song_to_block_norealtime
  16057.   LOCAL adr_dest%,convlen1%,convlen2%,framelen%,longueur%,rec_pos%
  16058.   LOCAL cur_songpos%,old_songpos%
  16059.   LOCAL buffer$
  16060.   '
  16061.   GOSUB stop_voices
  16062.   GOSUB wait_mouse(TRUE)
  16063.   GOSUB bee(TRUE)
  16064.   '
  16065.   GOSUB affiche_panneau_progression("Please wait...",SUB(se.s2d_posend%,se.s2d_posstart%),-1,-1)
  16066.   old_songpos%=-1
  16067.   '
  16068.   ' Prepare l'enregistrement
  16069.   '
  16070.   buffer$=STRING$(8192,0)                       ! Il faut au moins 1200 * 2 * 2 octets
  16071.   longueur%=mark_len% AND -win_bits%
  16072.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16073.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16074.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16075.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16076.   LONG{ADD(r_songrecord_state%,10)}=V:buffer$
  16077.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16078.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16079.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16080.   CARD{ADD(r_songrecord_state%,32)}=0           ! Pas de realtime
  16081.   CARD{r_songrecord_state%}=0
  16082.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16083.   songpos%=se.s2d_posstart%
  16084.   GOSUB play_song2(0)
  16085.   rec_pos%=0                                    ! Position dans l'enregistrement
  16086.   REPEAT                                        ! Attend le debut de l'enregistrement
  16087.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16088.       ~GEMDOS(7)
  16089.       CARD{r_songrecord_state%}=3
  16090.       GOTO se.sm_do_record_song_to_block_norealtime_end
  16091.     ENDIF
  16092.     IF MOUSEK=2                                 ! Arret souris?
  16093.       CARD{r_songrecord_state%}=3
  16094.       GOTO se.sm_do_record_song_to_block_norealtime_end
  16095.     ENDIF
  16096.   UNTIL CARD{r_songrecord_state%}=2
  16097.   '
  16098.   ' Boucle d'enregistrement
  16099.   '
  16100.   WHILE CARD{r_songrecord_state%}=2
  16101.     IF rec_pos%>=longueur%                      ! Fin atteinte?
  16102.       CARD{r_songrecord_state%}=3
  16103.     ENDIF
  16104.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16105.       ~GEMDOS(7)
  16106.       CARD{r_songrecord_state%}=3
  16107.     ENDIF
  16108.     IF MOUSEK=2                                 ! Arret souris?
  16109.       CARD{r_songrecord_state%}=3
  16110.     ENDIF
  16111.     ~C:rr_songrecord_routine_no_realtime%()
  16112.     framelen%=LONG{ADD(r_songrecord_state%,34)}
  16113.     convlen1%=MIN(framelen%,DIV(MUL(SUB(longueur%,rec_pos%),4),win_bits%))
  16114.     convlen2%=MUL(DIV(convlen1%,4),win_bits%)
  16115.     adr_dest%=ADD(FN adr_buffer,ADD(mark_1%,rec_pos%))
  16116.     ~C:g_convert_stereo16%(L:V:buffer$,L:adr_dest%,L:convlen1%,W:win_bits%,W:1)
  16117.     ADD rec_pos%,convlen2%
  16118.     cur_songpos%=CARD{r_mod_songpos%}
  16119.     IF cur_songpos%<>old_songpos%
  16120.       GOSUB affiche_progression(SUB(cur_songpos%,se.s2d_posstart%))
  16121.       old_songpos%=cur_songpos%
  16122.     ENDIF
  16123.   WEND
  16124. se.sm_do_record_song_to_block_norealtime_end:
  16125.   GOSUB stop_voices
  16126.   mark_2%=ADD(mark_1%,rec_pos%) AND -2
  16127.   GOSUB bee(FALSE)
  16128. RETURN
  16129. PROCEDURE se.sm_record_song_to_disk
  16130.   LOCAL erreur%
  16131.   LOCAL ok!
  16132.   LOCAL nfic$
  16133.   erreur%=0
  16134.   IF flag_registered!
  16135.     IF mark_len%<&H10000
  16136.       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)
  16137.       GOSUB affiche_panneau_sample
  16138.     ELSE IF freq_buffer%<12000
  16139.       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)
  16140.       GOSUB affiche_panneau_sample
  16141.     ELSE
  16142.       ok!=TRUE
  16143.       IF se.s2d_monitor! AND freq_buffer%<DIV(DIV(98340,SUCC(se.s2d_prediv%)),3)
  16144.         GOSUB dialog("WARNING","Please select a lower recording frequency|to avoid bugs.","Continue|Cancel",MOUSEX,MOUSEY)
  16145.         IF bouton%=1
  16146.           ok!=FALSE
  16147.         ENDIF
  16148.         GOSUB affiche_panneau_sample
  16149.       ENDIF
  16150.       IF ok!
  16151.         FILESELECT npath_sample$+next_sample$,nfile_sample$,nfic$
  16152.         GOSUB affiche_panneau_sample
  16153.         IF nfic$<>""
  16154.           IF se.s2d_monitor!
  16155.             GOSUB se.sm_do_record_song_to_disk(nfic$)
  16156.           ELSE
  16157.             GOSUB se.sm_do_record_song_to_disk_norealtime(nfic$)
  16158.           ENDIF
  16159.           GOSUB separe_nom_chemin(nfic$)
  16160.           nfile_sample$=nfile_$
  16161.           npath_sample$=npath_$
  16162.         ENDIF
  16163.       ENDIF
  16164.     ENDIF
  16165.   ELSE
  16166.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  16167.     GOSUB affiche_panneau_sample
  16168.   ENDIF
  16169. RETURN
  16170. PROCEDURE se.sm_do_record_song_to_disk(nfic$)
  16171.   '
  16172.   ' Attention, erreurs de disk non reperees!
  16173.   '
  16174.   LOCAL a%,longueur%,moitie%,next_buffer%,pointeur%
  16175.   LOCAL fin!,sortie!
  16176.   LOCAL handle_fichier%,code_erreur_fichier%
  16177.   LOCAL filename$
  16178.   LOCAL b$,npath_$,nfile_$
  16179.   GOSUB stop_voices
  16180.   GOSUB wait_mouse(TRUE)
  16181.   GOSUB bee(TRUE)
  16182.   filename$=nfic$+CHR$(0)
  16183.   handle_fichier%=GEMDOS(60,L:V:filename$,W:0)
  16184.   '
  16185.   ' Entete du format .AVR
  16186.   '
  16187.   IF next_sample$="*.AVR"
  16188.     GOSUB separe_nom_chemin(nfic$)      ! Recupere le nom
  16189.     b$=LEFT$(nfile_$,8)
  16190.     IF INSTR(b$,".")>1
  16191.       b$=LEFT$(b$,PRED(INSTR(b$,".")))
  16192.       IF LEN(b$)<8
  16193.         b$=b$+STRING$(SUB(8,LEN(b$)),0)
  16194.       ENDIF
  16195.     ENDIF
  16196.     b$="2BIT"+b$+MKI$(se.s2d_stereo%=2)+MKI$(SHL(se.s2d_bits%,3))+MKI$(-1)
  16197.     b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(freq_buffer%)+MKL$(0)+MKL$(0)+MKL$(0)      ! Longueur en samples pour 1 canal
  16198.     b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  16199.     b$=b$+STRING$(SUB(128,LEN(b$)),0)
  16200.     code_erreur_fichier%=FN fwrite(handle_fichier%,128,V:b$)
  16201.   ENDIF
  16202.   '
  16203.   ' Preparation des routines d'enregistrement
  16204.   '
  16205.   longueur%=mark_len% AND -SHL(MUL(se.s2d_bits%,se.s2d_stereo%),1)
  16206.   moitie%=SHR(longueur%,1)
  16207.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16208.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16209.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16210.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16211.   LONG{ADD(r_songrecord_state%,10)}=g_rec_sam_buffer%
  16212.   LONG{ADD(r_songrecord_state%,14)}=ADD(g_rec_sam_buffer%,4096)
  16213.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16214.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16215.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16216.   CARD{ADD(r_songrecord_state%,32)}=1           ! Realtime
  16217.   CARD{r_songrecord_state%}=0
  16218.   LONG{g_sngrec_paramadr%}=r_songrecord_state%
  16219.   LONG{ADD(g_sngrec_paramadr%,4)}=ADD(FN adr_buffer,mark_1%)
  16220.   LONG{ADD(g_sngrec_paramadr%,8)}=mark_len%
  16221.   LONG{ADD(g_sngrec_paramadr%,12)}=0
  16222.   LONG{ADD(g_sngrec_paramadr%,16)}=MUL(se.s2d_maxsize%,1024)
  16223.   LONG{ADD(g_sngrec_paramadr%,20)}=0
  16224.   CARD{ADD(g_sngrec_paramadr%,24)}=1
  16225.   CARD{ADD(g_sngrec_paramadr%,26)}=1
  16226.   CARD{ADD(g_sngrec_paramadr%,28)}=se.s2d_bits%
  16227.   CARD{ADD(g_sngrec_paramadr%,30)}=se.s2d_stereo%
  16228.   songpos%=se.s2d_posstart%
  16229.   next_buffer%=1
  16230.   sortie!=FALSE
  16231.   fin!=FALSE
  16232.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16233.   GOSUB play_song2(0)
  16234.   ~C:g_start_song_recording%(W:0)
  16235.   '
  16236.   ' Boucle d'enregistrement
  16237.   '
  16238.   REPEAT
  16239.     ' Position finale atteinte ?
  16240.     IF CARD{r_songrecord_state%}=4
  16241.       ~C:g_stop_song_recording%(W:0)
  16242.       sortie!=TRUE
  16243.     ENDIF
  16244.     ' Depasse le temps imparti ou la taille maxi ?
  16245.     IF CARD{ADD(g_sngrec_paramadr%,26)}=0
  16246.       sortie!=TRUE
  16247.     ENDIF
  16248.     ' Arret de l'utilisateur ?
  16249.     IF GEMDOS(11)<>0
  16250.       ~GEMDOS(7)
  16251.       sortie!=TRUE
  16252.     ENDIF
  16253.     ' On peut sauver un buffer ?
  16254.     pointeur%=LONG{ADD(g_sngrec_paramadr%,12)}
  16255.     IF next_buffer%=0
  16256.       IF pointeur%<moitie%
  16257.         code_erreur_fichier%=FN fwrite(handle_fichier%,moitie%,ADD(FN adr_buffer,ADD(mark_1%,moitie%)))
  16258.         next_buffer%=1
  16259.       ENDIF
  16260.     ELSE
  16261.       IF pointeur%>=moitie%
  16262.         code_erreur_fichier%=FN fwrite(handle_fichier%,moitie%,ADD(FN adr_buffer,mark_1%))
  16263.         next_buffer%=0
  16264.       ENDIF
  16265.     ENDIF
  16266.   UNTIL sortie!
  16267.   '
  16268.   ' On s'arrete d'enregistrer si on est sorti avant la fin
  16269.   '
  16270.   IF CARD{ADD(g_sngrec_paramadr%,26)}<>0
  16271.     ~C:g_stop_song_recording%(W:0)
  16272.   ENDIF
  16273.   IF CARD{r_songrecord_state%}<3
  16274.     CARD{r_songrecord_state%}=3
  16275.   ENDIF
  16276.   REPEAT
  16277.   UNTIL CARD{r_songrecord_state%}=4 AND CARD{ADD(g_sngrec_paramadr%,26)}=0
  16278.   CARD{r_songrecord_state%}=0
  16279.   GOSUB stop_voices
  16280.   '
  16281.   ' On sauve le debut du buffer qu'on enregistrait au moment de l'arret
  16282.   '
  16283.   pointeur%=LONG{ADD(g_sngrec_paramadr%,12)}
  16284.   IF next_buffer%=0
  16285.     code_erreur_fichier%=FN fwrite(handle_fichier%,SUB(pointeur%,moitie%),ADD(FN adr_buffer,ADD(mark_1%,moitie%)))
  16286.   ELSE
  16287.     code_erreur_fichier%=FN fwrite(handle_fichier%,pointeur%,ADD(FN adr_buffer,mark_1%))
  16288.   ENDIF
  16289.   '
  16290.   ' Sauve la taille dans l'entete si format .AVR
  16291.   '
  16292.   IF next_sample$="*.AVR"
  16293.     a%=DIV(LONG{ADD(g_sngrec_paramadr%,20)},MUL(se.s2d_bits%,se.s2d_stereo%))   ! Samples pour un canal
  16294.     code_erreur_fichier%=GEMDOS(66,L:&H1A,W:handle_fichier%,0)
  16295.     code_erreur_fichier%=FN fwrite(handle_fichier%,4,V:a%)      ! Taille totale du sample enregistre
  16296.   ENDIF
  16297.   '
  16298. se.sm_do_record_song_to_disk_end:
  16299.   code_erreur_fichier%=GEMDOS(62,W:handle_fichier%)
  16300.   IF code_erreur_fichier%<0
  16301.     erreur%=code_erreur_fichier%
  16302.   ENDIF
  16303.   GOSUB bee(FALSE)
  16304. RETURN
  16305. PROCEDURE se.sm_do_record_song_to_disk_norealtime(nfic$)
  16306.   '
  16307.   ' Attention, erreurs de disk non reperees!
  16308.   '
  16309.   LOCAL a%,adr_dest%,convlen1%,convlen2%,framelen%,longueur%,rec_pos%
  16310.   LOCAL cur_songpos%,old_songpos%
  16311.   LOCAL b$,buffer$
  16312.   LOCAL handle_fichier%,code_erreur_fichier%
  16313.   LOCAL filename$
  16314.   '
  16315.   GOSUB stop_voices
  16316.   GOSUB wait_mouse(TRUE)
  16317.   GOSUB bee(TRUE)
  16318.   filename$=nfic$+CHR$(0)
  16319.   handle_fichier%=GEMDOS(60,L:V:filename$,W:0)
  16320.   '
  16321.   ' En-tete du format .AVR
  16322.   '
  16323.   IF next_sample$="*.AVR"
  16324.     GOSUB separe_nom_chemin(nfic$)      ! Recupere le nom
  16325.     b$=LEFT$(nfile_$,8)
  16326.     IF INSTR(b$,".")>1
  16327.       b$=LEFT$(b$,PRED(INSTR(b$,".")))
  16328.       IF LEN(b$)<8
  16329.         b$=b$+STRING$(SUB(8,LEN(b$)),0)
  16330.       ENDIF
  16331.     ENDIF
  16332.     b$="2BIT"+b$+MKI$(se.s2d_stereo%=2)+MKI$(SHL(se.s2d_bits%,3))+MKI$(-1)
  16333.     b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(freq_buffer%)+MKL$(0)+MKL$(0)+MKL$(0)      ! Longueur en samples pour 1 canal
  16334.     b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  16335.     b$=b$+STRING$(SUB(128,LEN(b$)),0)
  16336.     code_erreur_fichier%=FN fwrite(handle_fichier%,128,V:b$)
  16337.   ENDIF
  16338.   '
  16339.   GOSUB affiche_panneau_progression("Please wait...",SUB(se.s2d_posend%,se.s2d_posstart%),-1,-1)
  16340.   old_songpos%=-1
  16341.   '
  16342.   ' Prepare l'enregistrement
  16343.   '
  16344.   buffer$=STRING$(8192,0)                       ! Il faut au moins 1200 * 2 * 2 octets
  16345.   longueur%=MUL(se.s2d_maxsize%,1024)
  16346.   CARD{ADD(r_songrecord_state%,2)}=se.s2d_posstart%
  16347.   CARD{ADD(r_songrecord_state%,4)}=se.s2d_ligstart%
  16348.   CARD{ADD(r_songrecord_state%,6)}=se.s2d_posend%
  16349.   CARD{ADD(r_songrecord_state%,8)}=se.s2d_ligend%
  16350.   LONG{ADD(r_songrecord_state%,10)}=V:buffer$
  16351.   CARD{ADD(r_songrecord_state%,18)}=se.s2d_2ndtime! AND 1
  16352.   CARD{ADD(r_songrecord_state%,24)}=se.s2d_prediv%
  16353.   CARD{ADD(r_songrecord_state%,26)}=freq_buffer%
  16354.   CARD{ADD(r_songrecord_state%,32)}=0           ! Pas de realtime
  16355.   CARD{r_songrecord_state%}=0
  16356.   SLPOKE LONG{r_adr_adr_inter%},r_songrecord_routine%
  16357.   songpos%=se.s2d_posstart%
  16358.   GOSUB play_song2(0)
  16359.   REPEAT                                        ! Attend le debut de l'enregistrement
  16360.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16361.       ~GEMDOS(7)
  16362.       CARD{r_songrecord_state%}=3
  16363.       GOTO se.sm_do_record_song_to_disk_norealtime_end
  16364.     ENDIF
  16365.     IF MOUSEK=2                                 ! Arret souris?
  16366.       CARD{r_songrecord_state%}=3
  16367.       GOTO se.sm_do_record_song_to_disk_norealtime_end
  16368.     ENDIF
  16369.   UNTIL CARD{r_songrecord_state%}=2
  16370.   rec_pos%=0                                    ! Position dans l'enregistrement
  16371.   '
  16372.   ' Boucle d'enregistrement
  16373.   '
  16374.   WHILE CARD{r_songrecord_state%}=2
  16375.     IF rec_pos%>=longueur%                      ! Fin atteinte?
  16376.       CARD{r_songrecord_state%}=3
  16377.     ENDIF
  16378.     IF GEMDOS(11)<>0                            ! Arret clavier?
  16379.       ~GEMDOS(7)
  16380.       CARD{r_songrecord_state%}=3
  16381.     ENDIF
  16382.     IF MOUSEK=2                                 ! Arret souris?
  16383.       CARD{r_songrecord_state%}=3
  16384.     ENDIF
  16385.     ~C:rr_songrecord_routine_no_realtime%()
  16386.     framelen%=LONG{ADD(r_songrecord_state%,34)}
  16387.     convlen1%=MIN(framelen%,DIV(MUL(SUB(longueur%,rec_pos%),4),MUL(se.s2d_bits%,se.s2d_stereo%)))
  16388.     convlen2%=MUL(DIV(convlen1%,4),MUL(se.s2d_bits%,se.s2d_stereo%))
  16389.     adr_dest%=ADD(FN adr_buffer,mark_1%)
  16390.     ~C:g_convert_stereo16%(L:V:buffer$,L:adr_dest%,L:convlen1%,W:se.s2d_bits%,W:se.s2d_stereo%)
  16391.     code_erreur_fichier%=FN fwrite(handle_fichier%,convlen2%,adr_dest%)
  16392.     ADD rec_pos%,convlen2%
  16393.     cur_songpos%=CARD{r_mod_songpos%}
  16394.     IF cur_songpos%<>old_songpos%
  16395.       GOSUB affiche_progression(SUB(cur_songpos%,se.s2d_posstart%))
  16396.       old_songpos%=cur_songpos%
  16397.     ENDIF
  16398.   WEND
  16399.   GOSUB stop_voices
  16400.   '
  16401.   IF next_sample$="*.AVR"
  16402.     a%=rec_pos%
  16403.     code_erreur_fichier%=GEMDOS(66,L:&H1A,W:handle_fichier%,0)
  16404.     code_erreur_fichier%=FN fwrite(handle_fichier%,4,V:a%)      ! Taille totale du sample enregistre
  16405.   ENDIF
  16406.   '
  16407. se.sm_do_record_song_to_disk_norealtime_end:
  16408.   code_erreur_fichier%=GEMDOS(62,W:handle_fichier%)
  16409.   IF code_erreur_fichier%<0
  16410.     erreur%=code_erreur_fichier%
  16411.   ENDIF
  16412.   '
  16413.   GOSUB stop_voices
  16414.   GOSUB bee(FALSE)
  16415. RETURN
  16416. ' Compression
  16417. PROCEDURE se.sm_affsm_compression
  16418.   GOSUB cadre_int(orc%,ADD(ory%,80),17,59,13,13,14,12)
  16419.   GOSUB cadre_int(ADD(orc%,18),ADD(ory%,80),61,59,13,13,14,12)
  16420.   GOSUB affiche_bloc_icones_b(0,9,26,orc%,ory%)
  16421.   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)
  16422.   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)
  16423.   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)
  16424.   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)
  16425.   GOSUB se.sm_actsm_compression
  16426. RETURN
  16427. PROCEDURE se.sm_actsm_compression
  16428.   se.comp_initvolume%=se.comp_level%            !!!!!!!!!!!!!!!!!!!!!!!! Pour l'instant...
  16429.   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)
  16430.   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)
  16431.   IF se.comp_source%>0
  16432.     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)
  16433.     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)
  16434.   ELSE
  16435.     GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,1,26),7)),ADD(ory%,ADD(divbi&(1,1,26),2)),1)
  16436.     GOSUB affchaine_notrans("Block"+SPACE$(23),ADD(orc%,ADD(divbi&(0,4,26),1)),ADD(ory%,ADD(divbi&(1,4,26),2)),1)
  16437.   ENDIF
  16438. RETURN
  16439. PROCEDURE se.sm_gere_compression
  16440.   ' Var locales de Sample_Editor :
  16441.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  16442.   ' Utilise srt%, a%, flag_relachement!
  16443.   LOCAL am%,b%,lon_sam%,taille_buffer%
  16444.   LOCAL a$,buffer$
  16445.   ~FRE(0)
  16446.   IF km%>0
  16447.     a%=V:divbi&(0,0,0)
  16448.     srt%=C:g_teste_icones%(L:a%,W:26,W:xm2%,W:ym2%)
  16449.     IF srt%>=0
  16450.       SELECT srt%
  16451.         ' Radio-boutons, Flip-flops ou champs de texte
  16452.         ' ------------------------------------------------------------------
  16453.       CASE 1            ! Numero de sample
  16454.         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)
  16455.         se.comp_source%=MIN(MAX(VAL("$"+bbbb$),0),255)
  16456.         GOSUB se.sm_actsm_compression
  16457.         ' --------------------------------------------------------------------
  16458.       CASE 2,3          ! Numero +/-
  16459.         se.comp_source%=MAX(MIN(ADD(se.comp_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,2),km%))),255),0)
  16460.         GOSUB se.sm_actsm_compression
  16461.         IF km%=1
  16462.           PAUSE 8
  16463.         ENDIF
  16464.         flag_relachement!=FALSE
  16465.         ' --------------------------------------------------------------------
  16466.       CASE 4            ! Nom du sample source
  16467.         ' Aucun effet
  16468.         ' --------------------------------------------------------------------
  16469.       CASE 5            ! Level
  16470.         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)
  16471.         se.comp_level%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  16472.         GOSUB se.sm_actsm_compression
  16473.         ' --------------------------------------------------------------------
  16474.       CASE 6            ! Speed
  16475.         DIV se.comp_speed%,1000
  16476.         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)
  16477.         se.comp_speed%=MIN(MAX(VAL(bbbb$),1),99)
  16478.         MUL se.comp_speed%,1000
  16479.         GOSUB se.sm_actsm_compression
  16480.         ' --------------------------------------------------------------------
  16481.       CASE 7,8          ! Speed +/-
  16482.         DIV se.comp_speed%,1000
  16483.         se.comp_speed%=MAX(MIN(ADD(se.comp_speed%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,7),km%))),99),1)
  16484.         MUL se.comp_speed%,1000
  16485.         GOSUB se.sm_actsm_compression
  16486.         IF km%=1
  16487.           PAUSE 8
  16488.         ENDIF
  16489.         flag_relachement!=FALSE
  16490.         ' --------------------------------------------------------------------
  16491.       DEFAULT
  16492.         ' Icones normales
  16493.         GOSUB affiche_icone_b(srt%,26,orc%,ory%,-1)
  16494.         GOSUB wait_mouse(TRUE)
  16495.         SELECT srt%
  16496.           ' ------------------------------------------------------------------
  16497.         CASE 0          ! Do
  16498.           GOSUB bee(TRUE)
  16499.           a$=STRING$(256,0)
  16500.           speed%=MAX(INT(freq_buffer%*se.comp_speed%/1000000),1)
  16501.           taille_buffer%=MIN(SHL(DIV(freq_buffer%,50),1),60000) ! 1/50 de seconde en 16 bits
  16502.           buffer$=STRING$(taille_buffer%,0)
  16503.           IF se.comp_source%>0
  16504.             a%=FN length(se.comp_source%)
  16505.             b%=FN resol(se.comp_source%)
  16506.             lon_sam%=MUL(MIN(DIV(a%,b%),DIV(mark_len%,win_bits%)),b%)
  16507.             LONG{ADD(V:a$,0)}=FN adresse(se.comp_source%)       ! Adresse source
  16508.             CARD{ADD(V:a$,20)}=b%                               ! Resolution source
  16509.           ELSE
  16510.             LONG{ADD(V:a$,0)}=ADD(FN adr_buffer,mark_1%)
  16511.             CARD{ADD(V:a$,20)}=win_bits%
  16512.             lon_sam%=mark_len%
  16513.           ENDIF
  16514.           LONG{ADD(V:a$,12)}=lon_sam%                   ! Longueur source
  16515.           LONG{ADD(V:a$,4)}=ADD(FN adr_buffer,mark_1%)  ! Adresse dest.
  16516.           LONG{ADD(V:a$,16)}=taille_buffer%             ! Adresse buffer
  16517.           CARD{ADD(V:a$,22)}=win_bits%                  ! Resol dest
  16518.           LONG{ADD(V:a$,24)}=speed%                     ! Speed
  16519.           LONG{ADD(V:a$,28)}=SHL(se.comp_level%,1)      ! Niveau
  16520.           LONG{ADD(V:a$,32)}=SHL(se.comp_initvolume%,1) ! Volume initial
  16521.           LONG{ADD(V:a$,8)}=V:buffer$                   ! Adresse buffer
  16522.           a%=V:a$
  16523.           ~C:g_fx_compression%(L:a%)
  16524.           GOSUB affiche_sample
  16525.           GOSUB bee(FALSE)
  16526.           ' ------------------------------------------------------------------
  16527.         ENDSELECT
  16528.         GOSUB affiche_icone_b(srt%,26,orc%,ory%,0)
  16529.       ENDSELECT
  16530.       GOSUB wait_mouse(flag_relachement!)
  16531.       flag_relachement!=TRUE
  16532.       GOSUB vide_buffer_clavier
  16533.     ENDIF
  16534.   ENDIF
  16535. RETURN
  16536. ' Distortion
  16537. PROCEDURE se.sm_affsm_distortion
  16538.   GOSUB cadre_int(orc%,ADD(ory%,80),15,59,13,13,14,12)
  16539.   GOSUB cadre_int(ADD(orc%,16),ADD(ory%,80),63,59,13,13,14,12)
  16540.   GOSUB affiche_bloc_icones_b(0,8,29,orc%,ory%)
  16541.   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)
  16542.   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)
  16543.   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)
  16544.   GOSUB se.sm_actsm_distortion
  16545. RETURN
  16546. PROCEDURE se.sm_actsm_distortion
  16547.   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)
  16548.   IF se.disto_source%>0
  16549.     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)
  16550.     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)
  16551.   ELSE
  16552.     GOSUB affchaine_notrans("  ",ADD(orc%,ADD(divbi&(0,1,29),7)),ADD(ory%,ADD(divbi&(1,1,29),2)),1)
  16553.     GOSUB affchaine_notrans("Block"+SPACE$(23),ADD(orc%,ADD(divbi&(0,4,29),1)),ADD(ory%,ADD(divbi&(1,4,29),2)),1)
  16554.   ENDIF
  16555. RETURN
  16556. PROCEDURE se.sm_gere_distortion         !!!
  16557.   ' Var locales de Sample_Editor :
  16558.   ' Necessite xm%, xm2%, ym%, ym2%, km%
  16559.   ' Utilise srt%, a%, flag_relachement!
  16560.   LOCAL adr_source%,adr_dest%,i%,pas%,sens%
  16561.   LOCAL gain,invgain,puissance
  16562.   ~FRE(0)
  16563.   IF km%>0
  16564.     a%=V:divbi&(0,0,0)
  16565.     srt%=C:g_teste_icones%(L:a%,W:29,W:xm2%,W:ym2%)
  16566.     IF srt%>=0
  16567.       SELECT srt%
  16568.         ' Radio-boutons, Flip-flops ou champs de texte
  16569.         ' ------------------------------------------------------------------
  16570.       CASE 1            ! Numero de sample
  16571.         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)
  16572.         se.disto_source%=MIN(MAX(VAL("$"+bbbb$),0),255)
  16573.         GOSUB se.sm_actsm_distortion
  16574.         ' --------------------------------------------------------------------
  16575.       CASE 2,3          ! Numero +/-
  16576.         se.disto_source%=MAX(MIN(ADD(se.disto_source%,SUB(SHL(1,PRED(km%)),SHL(SUB(srt%,2),km%))),255),0)
  16577.         GOSUB se.sm_actsm_distortion
  16578.         IF km%=1
  16579.           PAUSE 8
  16580.         ENDIF
  16581.         flag_relachement!=FALSE
  16582.         ' --------------------------------------------------------------------
  16583.       CASE 4            ! Nom du sample source
  16584.         ' Aucun effet
  16585.         ' --------------------------------------------------------------------
  16586.       CASE 5            ! Gain
  16587.         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)
  16588.         se.disto_gain%=DIV(32768*MIN(MAX(VAL(bbbb$),0),999.9),100)
  16589.         GOSUB se.sm_actsm_distortion
  16590.         ' --------------------------------------------------------------------
  16591.       CASE 6,7          ! Gain +/- (par pas de 5/10%)
  16592.         pas%=SUB(5,MUL(5,BTST(km%,1)))
  16593.         sens%=MUL(SUB(1,SHL(SUB(srt%,6),1)),pas%)
  16594.         a%=INT(se.disto_gain%*100/32768+0.0999)
  16595.         a%=ADD(MUL(DIV(a%,pas%),pas%),sens%)
  16596.         se.disto_gain%=DIV(32768*MIN(MAX(a%,0),999.9),100)
  16597.         GOSUB se.sm_actsm_distortion
  16598.         IF km%=1
  16599.           PAUSE 8
  16600.         ENDIF
  16601.         flag_relachement!=FALSE
  16602.         ' --------------------------------------------------------------------
  16603.       DEFAULT
  16604.         ' Icones normales
  16605.         GOSUB affiche_icone_b(srt%,29,orc%,ory%,-1)
  16606.         GOSUB wait_mouse(TRUE)
  16607.         SELECT srt%
  16608.           ' ------------------------------------------------------------------
  16609.         CASE 0          ! Do
  16610.           GOSUB bee(TRUE)
  16611.           gain=se.disto_gain%/32768
  16612.           puissance=se.disto_initpower%+MAX(SUB(se.disto_gain%,32768),0)/32768
  16613.           gain=gain*EXP(puissance)
  16614.           adr_dest%=ADD(FN adr_buffer,mark_1%)
  16615.           IF win_bits%=2
  16616.             gain=gain/32768
  16617.             invgain=32768/LOG(1+MAX(32768*gain,EXP(se.disto_initpower%)))
  16618.             FOR i%=0 TO PRED(SHR(mark_len%,1))
  16619.               a%=INT{adr_dest%}
  16620.               IF a%>0
  16621.                 a%=LOG(1+a%*gain)*invgain
  16622.               ELSE IF a%<0
  16623.                 a%=-LOG(1-a%*gain)*invgain
  16624.               ENDIF
  16625.               INT{adr_dest%}=a%
  16626.               ADD adr_dest%,2
  16627.             NEXT i%
  16628.           ELSE
  16629.             gain=gain/128
  16630.             invgain=128/LOG(1+MAX(128*gain,EXP(se.disto_initpower%)))
  16631.             FOR i%=0 TO PRED(mark_len%)
  16632.               a%=FN sbyte(BYTE{adr_dest%})
  16633.               IF a%>0
  16634.                 a%=LOG(1+a%*gain)*invgain
  16635.               ELSE IF a%<0
  16636.                 a%=-LOG(1-a%*gain)*invgain
  16637.               ENDIF
  16638.               BYTE{adr_dest%}=a%
  16639.               INC adr_dest%
  16640.             NEXT i%
  16641.           ENDIF
  16642.           GOSUB affiche_sample
  16643.           GOSUB bee(FALSE)
  16644.           ' ------------------------------------------------------------------
  16645.         ENDSELECT
  16646.         GOSUB affiche_icone_b(srt%,29,orc%,ory%,0)
  16647.       ENDSELECT
  16648.       GOSUB wait_mouse(flag_relachement!)
  16649.       flag_relachement!=TRUE
  16650.       GOSUB vide_buffer_clavier
  16651.     ENDIF
  16652.   ENDIF
  16653. RETURN
  16654. '
  16655. '
  16656. '
  16657. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16658. ' *                                                                          *
  16659. ' *                                Fonctions                                 *
  16660. ' *                                                                          *
  16661. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16662. '
  16663. FUNCTION vire_xbra(adr%,id%,mask%,vire!)
  16664.   LOCAL a%,c%
  16665.   LOCAL flag!,found!
  16666.   found!=FALSE
  16667.   a%=LPEEK(adr%)
  16668.   flag!=FALSE
  16669.   WHILE LPEEK(MAX(SUB(a%,12),0))=CVL("XBRA")
  16670.     IF (LPEEK(SUB(a%,8)) AND mask%)=(id% AND mask%)
  16671.       found!=TRUE
  16672.       IF vire!
  16673.         c%=adr%
  16674.         IF flag!
  16675.           SUB c%,4
  16676.         ENDIF
  16677.         xbra_remove$=xbra_remove$+MKL$(c%)+MKL$(a%)
  16678.         SLPOKE c%,LPEEK(SUB(a%,4))
  16679.       ENDIF
  16680.     ENDIF
  16681.     adr%=a%
  16682.     a%=LPEEK(SUB(a%,4))
  16683.     flag!=TRUE
  16684.   WEND
  16685.   RETURN found!
  16686. ENDFUNC
  16687. FUNCTION exist(a$)
  16688.   ' Cherche si le fichier a$ existe (jockers autorises)
  16689.   LOCAL dta$,masque_fichier$
  16690.   dta$=STRING$(44,0)
  16691.   masque_fichier$=a$+CHR$(0)
  16692.   ~FRE(0)
  16693.   ~GEMDOS(&H1A,L:V:dta$)
  16694.   IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  16695.     RETURN TRUE
  16696.   ELSE
  16697.     RETURN FALSE
  16698.   ENDIF
  16699. ENDFUNC
  16700. FUNCTION backup_file(a$)
  16701.   LOCAL e%,a%
  16702.   LOCAL b$,c$
  16703.   IF FN exist(a$)
  16704.     b$=RIGHT$(a$,4)
  16705.     a%=ADD(INSTR(b$,"."),SUB(LEN(a$),4))
  16706.     b$=LEFT$(a$,a%)                             ! On a le fichier sans l'extention (mais avec le .)
  16707.     c$=b$+"BAK"+CHR$(0)
  16708.     IF FN exist(c$)
  16709.       e%=SHL(GEMDOS(65,L:V:c$),16)              ! Detruit l'ancien .BAK
  16710.     ELSE
  16711.       e%=0
  16712.     ENDIF
  16713.     a$=a$+CHR$(0)
  16714.     ADD e%,GEMDOS(86,0,L:V:a$,L:V:c$) AND 65535 ! Renome
  16715.   ENDIF
  16716.   RETURN e%
  16717.   ~FRE(0)
  16718. ENDFUNC
  16719. FUNCTION last_pat_util
  16720.   ' Indique le dernier pattern utilise
  16721.   LOCAL aaaaa%,iiiii%
  16722.   aaaaa%=0
  16723.   FOR iiiii%=0 TO PRED(module&(101))
  16724.     aaaaa%=MAX(aaaaa%,song&(iiiii%))
  16725.   NEXT iiiii%
  16726.   RETURN aaaaa%
  16727. ENDFUNC
  16728. FUNCTION last_spl_util
  16729.   ' Indique le dernier sample utilise (min 1)
  16730.   LOCAL iiii%,aaaa%
  16731.   aaaa%=1
  16732.   FOR iiii%=1 TO 255
  16733.     IF FN length(iiii%)>0
  16734.       aaaa%=iiii%
  16735.     ENDIF
  16736.   NEXT iiii%
  16737.   RETURN aaaa%
  16738. ENDFUNC
  16739. FUNCTION last_spl_util2
  16740.   ' Indique le dernier instrument utilisant un sample non-vide en C-2 (min 1)
  16741.   LOCAL iiii%,aaaa%
  16742.   aaaa%=1
  16743.   FOR iiii%=1 TO 255
  16744.     IF FN length(FN isample(iiii%,48))>0
  16745.       aaaa%=iiii%
  16746.     ENDIF
  16747.   NEXT iiii%
  16748.   RETURN aaaa%
  16749. ENDFUNC
  16750. FUNCTION nbr_lines_maxi
  16751.   LOCAL iiii%
  16752.   aaaa%=1
  16753.   FOR iiii%=0 TO FN last_pat_util
  16754.     aaaa%=MAX(aaaa%,FN nbr_lines(iiii%))
  16755.   NEXT iiii%
  16756.   RETURN aaaa%
  16757. ENDFUNC
  16758. FUNCTION songcomment$
  16759.   LOCAL aaaa$
  16760.   aaaa$=SPACE$(160)
  16761.   BMOVE V:module&(18),V:aaaa$,160
  16762.   RETURN aaaa$
  16763. ENDFUNC
  16764. FUNCTION songname$
  16765.   LOCAL aaaa$
  16766.   aaaa$=SPACE$(32)
  16767.   BMOVE V:module&(2),V:aaaa$,32
  16768.   RETURN aaaa$
  16769. ENDFUNC
  16770. FUNCTION patternname$(pppp%)
  16771.   LOCAL aaaa$
  16772.   aaaa$=SPACE$(16)
  16773.   BMOVE ADD(FN adr_patchunk(pppp%),10),V:aaaa$,16
  16774.   RETURN aaaa$
  16775. ENDFUNC
  16776. FUNCTION samplename$(ssss%)
  16777.   LOCAL iiii%,aaaa$
  16778.   aaaa$=""
  16779.   FOR iiii%=10 TO 34 STEP 4
  16780.     aaaa$=aaaa$+MKL$(LONG{ADD(FN adrsamchk(ssss%),iiii%)})
  16781.   NEXT iiii%
  16782.   RETURN aaaa$
  16783. ENDFUNC
  16784. FUNCTION pourcent$(aaaa%,bbbb%)
  16785.   ' Transforme aaaa%/bbbb% en "xxx.x" %
  16786.   ' Arrondissement par exces
  16787.   RETURN RIGHT$("  "+STR$(INT(aaaa%*100/bbbb%+0.0999)),3)+"."+RIGHT$(STR$(INT(aaaa%*1000/bbbb%+0.999)),1)
  16788. ENDFUNC
  16789. FUNCTION pourcent2$(aaaa%,bbbb%)
  16790.   ' Transforme aaaa%/bbbb% en "xxx %" ou en "done." si 100% ou +
  16791.   ' Arrondissement par defaut
  16792.   IF aaaa%<bbbb%
  16793.     RETURN STR$(INT(aaaa%*100/bbbb%),3)+" %"
  16794.   ELSE
  16795.     RETURN "done."
  16796.   ENDIF
  16797. ENDFUNC
  16798. FUNCTION time_hmsd$(t%)
  16799.   LOCAL h%,m%,s%,d%
  16800.   LOCAL a$
  16801.   h%=DIV(t%,720000)
  16802.   m%=DIV(t%,12000) MOD 60
  16803.   s%=DIV(t%,200) MOD 60
  16804.   d%=t% MOD 200
  16805.   a$=STR$(h%)+":"+STR$(DIV(m%,10))+STR$(m% MOD 10)+"'"+STR$(DIV(s%,10))+STR$(s% MOD 10)+""""+STR$(DIV(d%,20))
  16806.   RETURN a$
  16807. ENDFUNC
  16808. FUNCTION fft(aaaa%,tttt%,llll%,ffffe%,ffff0%,bbbb%)
  16809.   ' aaaa% = adresse du sample, tttt %= adresse d'une table de 1.25*4096 sinus 16 bits
  16810.   ' llll% = longueur en octets, ffffe% = freq d'ech, ffff0% = freq recherchee
  16811.   ' bbbb% = nombre d'octets par sample
  16812.   LOCAL cccc%,dddd,eeee,ffff
  16813.   cccc%=C:g_trans_fourier%(L:aaaa%,L:llll%,L:ffffe%,L:ffff0%,W:bbbb%,L:tttt%)
  16814.   eeee=LONG{cccc%}
  16815.   ffff=LONG{ADD(cccc%,4)}
  16816.   dddd=SQR((eeee*eeee+ffff*ffff))/1073741824            ! Module (variant de 0 a 1)
  16817.   RETURN dddd
  16818. ENDFUNC
  16819. FUNCTION spl_cherche_volume(dddd%,llll%,bbbb%)
  16820.   ' Cherche le volume du sample position dddd%, longueur llll%, resol bbbb%
  16821.   LOCAL aaaa%,cccc%
  16822.   cccc%=ADD(FN adr_buffer,dddd%)
  16823.   aaaa%=C:g_cherche_volume_sample%(L:cccc%,L:llll%,W:bbbb%)
  16824.   aaaa%=SHL(aaaa%,SHL(SUB(2,bbbb%),3))              ! Recalibre /32768
  16825.   RETURN aaaa%
  16826. ENDFUNC
  16827. FUNCTION hexasigne$(vvvv%,llll%)
  16828.   ' Renvoie une chaine en hexa signe, avec llll% chiffre (+ le signe)
  16829.   IF vvvv%>=0
  16830.     RETURN "+"+HEX$(vvvv%,llll%)
  16831.   ELSE
  16832.     RETURN "-"+HEX$(ABS(vvvv%),llll%)
  16833.   ENDIF
  16834. ENDFUNC
  16835. FUNCTION valhexasigne(aaaa$)
  16836.   ' Renvoie la valeur d'une chaine hexa signee, avec ou sans '$'
  16837.   LOCAL a%
  16838.   a%=INSTR(aaaa$,"$")
  16839.   IF a%>0
  16840.     aaaa$=LEFT$(aaaa$,PRED(a%))+RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))
  16841.   ENDIF
  16842.   a%=INSTR(aaaa$,"+")
  16843.   IF a%>0
  16844.     RETURN VAL("$"+TRIM$(RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))))
  16845.   ELSE
  16846.     a%=INSTR(aaaa$,"-")
  16847.     IF a%>0
  16848.       RETURN -VAL("$"+TRIM$(RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))))
  16849.     ELSE
  16850.       RETURN VAL("$"+TRIM$(aaaa$))
  16851.     ENDIF
  16852.   ENDIF
  16853. ENDFUNC
  16854. FUNCTION sbyte(a%)
  16855.   ' Retablit la signature d'un octet et enleve les bits inutiles
  16856.   a%=a% AND 255
  16857.   IF a%>127
  16858.     RETURN SUB(a%,256)
  16859.   ELSE
  16860.     RETURN a%
  16861.   ENDIF
  16862. ENDFUNC
  16863. FUNCTION squartet(a%)
  16864.   ' Retablit la signature d'un quartet et enleve les bits inutiles
  16865.   a%=a% AND 15
  16866.   IF a%>7
  16867.     RETURN SUB(a%,16)
  16868.   ELSE
  16869.     RETURN a%
  16870.   ENDIF
  16871. ENDFUNC
  16872. FUNCTION donne_combinaison_touche$(am%,ae%,bm%,be%)
  16873.   LOCAL scancode%
  16874.   LOCAL tot$,t$
  16875.   LOCAL all_keys_done!
  16876.   tot$=""
  16877.   IF ae%=0
  16878.     tot$="nokey"
  16879.   ELSE
  16880.     all_keys_done!=FALSE
  16881.     REPEAT
  16882.       ' Touche principale
  16883.       t$=""
  16884.       IF (am% AND &HFF)=&HFF                    ! Ascii
  16885.         t$=t$+CHR$(ae% AND &HFF)
  16886.       ELSE IF (am% AND &HFF0000)=&HFF0000       ! Scan
  16887.         scancode%=SHR(ae%,16) AND &HFF
  16888.         SELECT scancode%
  16889.         CASE 1                                  ! Esc
  16890.           t$=t$+"esc"
  16891.         CASE 2                                  ! &
  16892.           t$=t$+"&"
  16893.         CASE 14                                 ! Backspace
  16894.           t$=t$+"backspace"
  16895.         CASE 15                                 ! Tab
  16896.           t$=t$+"tab"
  16897.         CASE 28                                 ! Return
  16898.           t$=t$+"return"
  16899.         CASE 43                                 ! #
  16900.           t$=t$+"#"
  16901.         CASE 57                                 ! Space
  16902.           t$=t$+"space"
  16903.         CASE 59 TO 68                           ! F1 - F10
  16904.           t$=t$+"f"+STR$(SUB(scancode%,58))
  16905.         CASE 71                                 ! Clr
  16906.           t$=t$+"clr"
  16907.         CASE 72                                 ! Up
  16908.           t$=t$+"up"
  16909.         CASE 75                                 ! Left
  16910.           t$=t$+"left"
  16911.         CASE 77                                 ! Right
  16912.           t$=t$+"right"
  16913.         CASE 80                                 ! Down
  16914.           t$=t$+"down"
  16915.         CASE 82                                 ! Ins
  16916.           t$=t$+"ins"
  16917.         CASE 83                                 ! Del
  16918.           t$=t$+"del"
  16919.         CASE 96                                 ! <
  16920.           t$=t$+"<"
  16921.         CASE 97                                 ! Undo
  16922.           t$=t$+"undo"
  16923.         CASE 98                                 ! help
  16924.           t$=t$+"help"
  16925.         CASE 112                                ! Pad0
  16926.           t$=t$+"pad0"
  16927.         CASE 113                                ! Padpoint
  16928.           t$=t$+"padpoint"
  16929.         ENDSELECT
  16930.       ELSE IF BTST(ae%,9)                       ! Numpad
  16931.         t$=t$+"numpad"
  16932.       ELSE IF BTST(ae%,10)                      ! Fkeys
  16933.         t$=t$+"fkeys"
  16934.       ENDIF
  16935.       ' Touches auxiliaires
  16936.       IF BTST(ae%,8)                            ! Shift
  16937.         t$=t$+" + shift"
  16938.       ENDIF
  16939.       IF BTST(ae%,24)                           ! Rshift
  16940.         t$=t$+" + rshift"
  16941.       ENDIF
  16942.       IF BTST(ae%,25)                           ! Lshift
  16943.         t$=t$+" + lshift"
  16944.       ENDIF
  16945.       IF BTST(ae%,26)                           ! Ctrl
  16946.         t$=t$+" + ctrl"
  16947.       ENDIF
  16948.       IF BTST(ae%,27)                           ! Alt
  16949.         t$=t$+" + alt"
  16950.       ENDIF
  16951.       IF BTST(am%,28)
  16952.         IF BTST(ae%,28)                         ! caps
  16953.           t$=t$+" + caps"
  16954.         ELSE
  16955.           t$=t$+" + nocaps"                     ! No caps
  16956.         ENDIF
  16957.       ENDIF
  16958.       IF INSTR(t$," + ")=1
  16959.         t$=RIGHT$(t$,SUB(LEN(t$),3))
  16960.       ENDIF
  16961.       tot$=tot$+t$
  16962.       IF be%=0
  16963.         all_keys_done!=TRUE
  16964.       ELSE
  16965.         tot$=tot$+" / "
  16966.         SWAP am%,bm%
  16967.         SWAP ae%,be%
  16968.         bm%=0
  16969.         be%=0
  16970.       ENDIF
  16971.     UNTIL all_keys_done!
  16972.   ENDIF
  16973.   RETURN tot$
  16974. ENDFUNC
  16975. FUNCTION vol_exp_2_lin(b%)
  16976.   IF b%<=0
  16977.     RETURN 0
  16978.   ELSE
  16979.     RETURN MAX(MIN(ROUND(2^(b%/256)),&HFFFF),0)
  16980.   ENDIF
  16981. ENDFUNC
  16982. FUNCTION vol_lin_2_exp(b%)
  16983.   IF b%<=0
  16984.     RETURN 0
  16985.   ELSE
  16986.     RETURN MAX(MIN(ROUND(256*LOG(b%)/LOG(2)),&HFFF),0)
  16987.   ENDIF
  16988. ENDFUNC
  16989. ' Sample Editor
  16990. FUNCTION se.sm_fft_tot(fmin%,fmax%,fech%,nfreq%,adr%,lon%,bits%,flagc!,flagd!)
  16991.   ' Renvoie dans fft&() les puissances (15 bits) de nfreq%
  16992.   ' frequences de fmin%...fmax% puis la frequence.w du sample
  16993.   LOCAL a%,i%,pc%,pctot%,pcnxt%,a,b,coef,p,pm,f1,f2,tabl$
  16994.   ~FRE(0)
  16995.   ARRAYFILL fft&(),0
  16996.   IF flagd!
  16997.     GOSUB bee(TRUE)
  16998.   ENDIF
  16999.   tabl$=STRING$(8192,0)
  17000.   a%=V:tabl$
  17001.   a=PI/2048
  17002.   FOR i%=0 TO 1024                      ! Calcul de la table
  17003.     INT{a%}=ROUND(SIN(i%*a)*32767)
  17004.     ADD a%,2
  17005.   NEXT i%
  17006.   FOR i%=4 TO 4092 STEP 4
  17007.     INT{a%}=INT{SUB(a%,i%)}
  17008.     ADD a%,2
  17009.   NEXT i%
  17010.   FOR i%=0 TO 2048
  17011.     INT{a%}=-INT{SUB(a%,4096)}
  17012.     ADD a%,2
  17013.   NEXT i%
  17014.   se.freq_fftmin%=fmin%
  17015.   se.freq_fftmax%=fmax%
  17016.   se.freq_fftech%=fech%
  17017.   se.freq_fftlon%=nfreq%
  17018.   ' FFT de chaque frequence
  17019.   pm=0
  17020.   f1=-1
  17021.   f2=0
  17022.   b=(fmax%-fmin%)/nfreq%
  17023.   IF b>1 AND b<100 AND flagc!
  17024.     pctot%=nfreq%+2*b
  17025.   ELSE
  17026.     pctot%=nfreq%
  17027.   ENDIF
  17028.   IF flagd!
  17029.     GOSUB affiche_panneau_progression("WAITING: FFT...",pctot%,-1,-1)
  17030.   ENDIF
  17031.   pc%=0
  17032.   pcnxt%=0
  17033.   FOR i%=0 TO PRED(nfreq%)
  17034.     a=f1
  17035.     f1=fmin%+i%*b                       ! Frequence a tester
  17036.     p=FN fft(adr%,V:tabl$,lon%,SHL(fech%,4),MAX(ROUND(f1*16),0),bits%)
  17037.     fft&(i%)=MAX(MIN(p*&H7FFF,&H7FFF),0)
  17038.     IF f1>=30
  17039.       coef=1/f1
  17040.     ELSE
  17041.       coef=0
  17042.     ENDIF
  17043.     IF p*coef>pm
  17044.       pm=p*coef
  17045.       f2=f1
  17046.     ENDIF
  17047.     IF GEMDOS(11)<>0
  17048.       IF SHR(GEMDOS(7),16)=1            ! ESC = arret
  17049.         i%=nfreq%
  17050.       ENDIF
  17051.     ENDIF
  17052.     IF flagd!                           ! Affichage du pourcentage de calcul
  17053.       GOSUB affiche_progression(pc%)
  17054.       GOSUB bee(TRUE)
  17055.       INC pc%
  17056.     ENDIF
  17057.   NEXT i%
  17058.   ' 2eme recherche pour la frequence du sample, precise
  17059.   IF flagc! AND b>1 AND b<=100          ! Scanning Hz par Hz
  17060.     FOR i%=f2-b TO f2+b
  17061.       p=FN fft(adr%,V:tabl$,lon%,fech%,MAX(i%,0),bits%)
  17062.       IF i%>=30
  17063.         coef=1/i%
  17064.       ELSE
  17065.         coef=0
  17066.       ENDIF
  17067.       IF p*coef>pm
  17068.         pm=p*coef
  17069.         f2=i%
  17070.       ENDIF
  17071.       IF GEMDOS(11)<>0
  17072.         IF SHR(GEMDOS(7),16)=1          ! ESC = arret
  17073.           i%=f2+b
  17074.         ENDIF
  17075.       ENDIF
  17076.       IF flagd!                         ! Affichage du pourcentage de calcul
  17077.         GOSUB affiche_progression(pc%)
  17078.         GOSUB bee(TRUE)
  17079.         INC pc%
  17080.       ENDIF
  17081.     NEXT i%
  17082.   ENDIF
  17083.   IF b>100 OR NOT flagc!        ! Si l'ecart est trop grand, pas de frequence pour le sample
  17084.     f2=0
  17085.   ENDIF
  17086.   RETURN ROUND(f2)
  17087. ENDFUNC
  17088. FUNCTION se.sm_adresse_sample(i%)
  17089.   IF i%=0
  17090.     RETURN ADD(FN adr_buffer,mark_1%)
  17091.   ELSE
  17092.     RETURN FN adresse(i%)
  17093.   ENDIF
  17094. ENDFUNC
  17095. FUNCTION se.sm_longueur_sample(i%)
  17096.   IF i%=0
  17097.     RETURN mark_len%
  17098.   ELSE
  17099.     RETURN FN length(i%)
  17100.   ENDIF
  17101. ENDFUNC
  17102. FUNCTION se.sm_resol_sample(i%)
  17103.   IF i%=0
  17104.     RETURN win_bits%
  17105.   ELSE
  17106.     RETURN FN resol(i%)
  17107.   ENDIF
  17108. ENDFUNC
  17109. ' ASCIIsation de choix
  17110. FUNCTION get_elt_in_list$(l$,a%)
  17111.   ' Renvoie le a%ieme element (de 0 a ...) de la liste l$
  17112.   ' Les elements sont separes par des virgules
  17113.   LOCAL b%
  17114.   LOCAL b$
  17115.   IF a%<0
  17116.     b$=""
  17117.   ELSE
  17118.     REPEAT
  17119.       b%=INSTR(l$,",")
  17120.       IF b%>0
  17121.         b$=LEFT$(l$,PRED(b%))
  17122.         l$=RIGHT$(l$,SUB(LEN(l$),b%))
  17123.       ELSE
  17124.         b$=l$
  17125.         l$=""
  17126.       ENDIF
  17127.       DEC a%
  17128.     UNTIL a%<0
  17129.   ENDIF
  17130.   RETURN b$
  17131. ENDFUNC
  17132. FUNCTION falsetrue$(a%)
  17133.   IF a%<>0
  17134.     RETURN "true"
  17135.   ELSE
  17136.     RETURN "false"
  17137.   ENDIF
  17138. ENDFUNC
  17139. FUNCTION noyes$(a%)
  17140.   IF a%<>0
  17141.     RETURN "yes"
  17142.   ELSE
  17143.     RETURN "no"
  17144.   ENDIF
  17145. ENDFUNC
  17146. FUNCTION offon$(a%)
  17147.   IF a%<>0
  17148.     RETURN "on"
  17149.   ELSE
  17150.     RETURN "off"
  17151.   ENDIF
  17152. ENDFUNC
  17153. ' Fichiers
  17154. FUNCTION fread(handle%,len%,adr%)
  17155.   er%=GEMDOS(63,W:handle%,L:len%,L:adr%)
  17156.   IF er%<>len% AND er%>=0
  17157.     er%=-1
  17158.   ENDIF
  17159.   RETURN er%
  17160. ENDFUNC
  17161. FUNCTION fwrite(handle%,len%,adr%)
  17162.   er%=GEMDOS(64,W:handle%,L:len%,L:adr%)
  17163.   IF er%<>len% AND er%>=0
  17164.     er%=-1
  17165.   ENDIF
  17166.   RETURN er%
  17167. ENDFUNC
  17168. ' Menus Pop Up
  17169. FUNCTION popup(npop%,ligdef%,x_pix_midpos%,y_pix_midpos%)
  17170.   ' Gestion d'un menu pop up (possibilite de recursivite)
  17171.   ' Renvoie le numero du menu dans le mot fort, le code du choix dans le faible.
  17172.   ' Renvoie -1 si annulation
  17173.   LOCAL reponse%,choix%,old_choix%,couleur%
  17174.   LOCAL choisi!,select!
  17175.   LOCAL pix_width_ext%,pix_high_ext%,car_width_ext%,car_width_in%,car_high_in%
  17176.   LOCAL x_car_pos%,y_pix_pos%,xm%,ym%,km%,xm2%
  17177.   LOCAL a%,b%,i%,j%
  17178.   LOCAL a$,pop_background$
  17179.   '
  17180.   GOSUB wait_mouse(TRUE)
  17181.   '
  17182.   ' Recherche des dimensions et coordonnees du popup
  17183.   '
  17184.   car_high_in%=popup_nbrlines%(npop%)
  17185.   a%=4
  17186.   FOR i%=0 TO PRED(popup_nbrlines%(npop%))
  17187.     b%=LEN(popup_txt$(i%,npop%))
  17188.     IF NOT BTST(popup_code%(i%,npop%),18)       ! Si la ligne est selectionnable
  17189.       ADD b%,4                                  ! + 2 selected, + 2 pour la fleche (popup recursif)
  17190.     ENDIF
  17191.     a%=MAX(a%,b%)
  17192.   NEXT i%
  17193.   car_width_in%=a%
  17194.   pix_high_ext%=ADD(MUL(car_high_in%,8),8)
  17195.   pix_width_ext%=ADD(MUL(car_width_in%,8),16)
  17196.   car_width_ext%=SHR(pix_width_ext%,3)
  17197.   x_car_pos%=DIV(SUB(x_pix_midpos%,SHR(pix_width_ext%,1)),8)
  17198.   x_car_pos%=MAX(0,MIN(x_car_pos%,SUB(scr_ncol%,car_width_ext%)))
  17199.   IF ligdef%>=0 AND ligdef%<popup_nbrlines%(npop%)
  17200.     y_pix_pos%=SUB(y_pix_midpos%,ADD(MUL(ligdef%,8),8))
  17201.   ELSE
  17202.     y_pix_pos%=SUB(y_pix_midpos%,SHR(pix_high_ext%,1))
  17203.   ENDIF
  17204.   y_pix_pos%=MAX(0,MIN(y_pix_pos%,SUB(scr_haut%,pix_high_ext%)))
  17205.   '
  17206.   ' Sauvegarde du fond
  17207.   '
  17208.   GOSUB save_background(SHL(x_car_pos%,3),y_pix_pos%,pix_width_ext%,pix_high_ext%)
  17209.   '
  17210.   ' Affichage du popup
  17211.   '
  17212.   GOSUB cadre_int(x_car_pos%,y_pix_pos%,PRED(car_width_ext%),PRED(pix_high_ext%),13,13,14,12)
  17213.   y%=ADD(y_pix_pos%,5)
  17214.   FOR i%=0 TO PRED(popup_nbrlines%(npop%))
  17215.     a$=FN ligne_popup$(i%,npop%,select!)
  17216.     IF select!
  17217.       couleur%=12
  17218.     ELSE
  17219.       couleur%=14
  17220.     ENDIF
  17221.     GOSUB affchaine_trans(a$,ADD(SHL(x_car_pos%,1),2),y%,couleur%)
  17222.     ADD y%,8
  17223.   NEXT i%
  17224.   '
  17225.   ' Gestion du PopUp
  17226.   '
  17227.   old_choix%=-1
  17228.   choix%=-1
  17229.   choisi!=FALSE
  17230.   reponse%=-1
  17231.   WHILE NOT choisi!
  17232.     SHOWM
  17233.     MOUSE xm%,ym%,km%
  17234.     xm2%=SHR(xm%,3)
  17235.     IF xm2%>=x_car_pos% AND xm2%<ADD(x_car_pos%,car_width_ext%)
  17236.       a%=INT(SUB(ym%,ADD(y_pix_pos%,5))/8)
  17237.       IF a%>=0 AND a%<popup_nbrlines%(npop%)
  17238.         choix%=a%
  17239.       ELSE
  17240.         choix%=-1
  17241.       ENDIF
  17242.     ELSE
  17243.       choix%=-1
  17244.     ENDIF
  17245.     ' Affichage de l'inversion video
  17246.     IF old_choix%<>choix%
  17247.       IF old_choix%>=0
  17248.         a$=FN ligne_popup$(old_choix%,npop%,select!)
  17249.         IF select!
  17250.           couleur%=12
  17251.         ELSE
  17252.           couleur%=14
  17253.         ENDIF
  17254.         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)
  17255.         GOSUB affchaine_trans(a$,ADD(SHL(x_car_pos%,1),2),ADD(ADD(y_pix_pos%,5),MUL(old_choix%,8)),couleur%)
  17256.       ENDIF
  17257.       IF choix%>=0
  17258.         IF NOT BTST(popup_code%(choix%,npop%),18)
  17259.           a$=FN ligne_popup$(choix%,npop%,select!)
  17260.           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)
  17261.           GOSUB affchaine_trans(a$,ADD(SHL(x_car_pos%,1),2),ADD(ADD(y_pix_pos%,5),MUL(choix%,8)),14)
  17262.         ENDIF
  17263.       ENDIF
  17264.       SHOWM
  17265.     ENDIF
  17266.     old_choix%=choix%
  17267.     ' Clic
  17268.     IF km%>0
  17269.       IF choix%>=0 AND km%<>2
  17270.         IF NOT BTST(popup_code%(choix%,npop%),18)
  17271.           IF BTST(popup_code%(choix%,npop%),16)
  17272.             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)))
  17273.             IF a%<>-1
  17274.               reponse%=a%
  17275.               choisi!=TRUE
  17276.             ENDIF
  17277.           ELSE
  17278.             reponse%=ADD(popup_code%(choix%,npop%) AND &HFFFF,SHL(npop%,16))
  17279.             choisi!=TRUE
  17280.           ENDIF
  17281.         ENDIF
  17282.       ELSE
  17283.         reponse%=-1
  17284.         choisi!=TRUE
  17285.       ENDIF
  17286.     ENDIF
  17287.   WEND
  17288.   '
  17289.   ' Restitution du fond
  17290.   '
  17291.   GOSUB restore_background
  17292.   '
  17293.   GOSUB wait_mouse(TRUE)
  17294.   RETURN reponse%
  17295. ENDFUNC
  17296. FUNCTION ligne_popup$(nlig%,npop%,VAR select!)
  17297.   ' Renvoie une ligne du popup telle qu'elle apparait dans le menu
  17298.   ' Renvoie select!: TRUE = selectionnable, FALSE = non selectionnable
  17299.   LOCAL a$
  17300.   IF BTST(popup_code%(nlig%,npop%),18)          ! Non selectionnable
  17301.     select!=FALSE
  17302.     a$=popup_txt$(nlig%,npop%)
  17303.   ELSE
  17304.     select!=TRUE
  17305.     IF BTST(popup_code%(nlig%,npop%),17)
  17306.       a$=MKI$(&H820)+popup_txt$(nlig%,npop%)    ! Checked + Espace
  17307.     ELSE
  17308.       a$=MKI$(&H2020)+popup_txt$(nlig%,npop%)
  17309.     ENDIF
  17310.     IF BTST(popup_code%(nlig%,npop%),16)
  17311.       a$=a$+MKI$(&H2003)                        ! Espace + fleche droite
  17312.     ENDIF
  17313.   ENDIF
  17314.   RETURN a$
  17315. ENDFUNC
  17316. ' Instruments
  17317. FUNCTION instrname$(ssss%)
  17318.   LOCAL iiii%,aaaa$
  17319.   aaaa$=""
  17320.   FOR iiii%=10 TO 34 STEP 4
  17321.     aaaa$=aaaa$+MKL$(LONG{ADD(V:instrset%(0,ssss%),iiii%)})
  17322.   NEXT iiii%
  17323.   RETURN aaaa$
  17324. ENDFUNC
  17325. FUNCTION ins_deb_zone(nnnn%,pppp%)
  17326.   ' Cherche le debut d'une zone isosample dans la table des samples d'un instrument
  17327.   LOCAL aaaa%
  17328.   aaaa%=FN isample(nnnn%,pppp%)
  17329.   WHILE pppp%>1
  17330.     EXIT IF FN isample(nnnn%,PRED(pppp%))<>aaaa%
  17331.     DEC pppp%
  17332.   WEND
  17333.   RETURN pppp%
  17334. ENDFUNC
  17335. FUNCTION ins_fin_zone(nnnn%,pppp%)
  17336.   ' Cherche la fin d'une zone isosample dans la table des samples d'un instrument
  17337.   LOCAL aaaa%
  17338.   aaaa%=FN isample(nnnn%,pppp%)
  17339.   WHILE pppp%<127
  17340.     EXIT IF FN isample(nnnn%,SUCC(pppp%))<>aaaa%
  17341.     INC pppp%
  17342.   WEND
  17343.   RETURN pppp%
  17344. ENDFUNC
  17345. FUNCTION ins_used_samples$(nnnn%)
  17346.   ' Renvoie une chaine de MOTS contenant les numeros des samples utilises dans
  17347.   ' l'instrument specifie (sauf 0)
  17348.   LOCAL aaaa%,iiii%,jjjj%,pppp%
  17349.   LOCAL ffff!
  17350.   LOCAL aaaa$
  17351.   aaaa$=""
  17352.   FOR iiii%=0 TO 127
  17353.     aaaa%=FN isample(nnnn%,iiii%)
  17354.     IF aaaa%>0
  17355.       ffff!=TRUE
  17356.       IF LEN(aaaa$)>0
  17357.         FOR jjjj%=0 TO SUB(LEN(aaaa$),2) STEP 2
  17358.           IF CARD{ADD(V:aaaa$,jjjj%)}=aaaa%
  17359.             ffff!=FALSE
  17360.             jjjj%=LEN(aaaa$)
  17361.           ENDIF
  17362.         NEXT jjjj%
  17363.       ENDIF
  17364.       IF ffff!
  17365.         pppp%=0
  17366.         WHILE pppp%<LEN(aaaa$)
  17367.           EXIT IF CARD{ADD(V:aaaa$,pppp%)}>aaaa%
  17368.           ADD pppp%,2
  17369.         WEND
  17370.         aaaa$=LEFT$(aaaa$,pppp%)+MKI$(aaaa%)+RIGHT$(aaaa$,SUB(LEN(aaaa$),pppp%))
  17371.       ENDIF
  17372.     ENDIF
  17373.   NEXT iiii%
  17374.   RETURN aaaa$
  17375. ENDFUNC
  17376. FUNCTION ins_cherche_sample(ssss%,dddd%)
  17377.   ' Cherche dans quel instrument se trouve le sample ssss%
  17378.   ' La recherche commence a l'instrument dddd%
  17379.   LOCAL iiii%
  17380.   LOCAL ffff!
  17381.   ffff!=FALSE
  17382.   WHILE dddd%<=255
  17383.     FOR iiii%=1 TO 127
  17384.       IF FN isample(dddd%,iiii%)=ssss%
  17385.         ffff!=TRUE
  17386.       ENDIF
  17387.     NEXT iiii%
  17388.     EXIT IF ffff!
  17389.     INC dddd%
  17390.   WEND
  17391.   IF ffff!
  17392.     RETURN dddd%
  17393.   ELSE
  17394.     RETURN 0
  17395.   ENDIF
  17396. ENDFUNC
  17397. ' Enveloppes
  17398. FUNCTION env_chunkadr(num%,type%)
  17399.   IF type%=0
  17400.     RETURN LONG{ADD(r_adr_evol%,SHL(num%,2))}
  17401.   ELSE IF type%=1
  17402.     RETURN LONG{ADD(r_adr_eton%,SHL(num%,2))}
  17403.   ELSE
  17404.     RETURN LONG{ADD(r_adr_epan%,SHL(num%,2))}
  17405.   ENDIF
  17406. ENDFUNC
  17407. FUNCTION env_chunklen(num%,type%)
  17408.   RETURN LONG{ADD(FN env_chunkadr(num%,type%),4)}
  17409. ENDFUNC
  17410. FUNCTION envelopename$(num%,type%)
  17411.   LOCAL i%,a$
  17412.   a$=""
  17413.   FOR i%=10 TO 26 STEP 4
  17414.     a$=a$+MKL$(LONG{ADD(FN env_chunkadr(num%,type%),i%)})
  17415.   NEXT i%
  17416.   RETURN a$
  17417. ENDFUNC
  17418. FUNCTION env_sectadr(num%,type%,sect%)
  17419.   IF sect%=0
  17420.     RETURN ADD(FN env_chunkadr(num%,type%),32)
  17421.   ELSE
  17422.     RETURN ADD(FN env_chunkadr(num%,type%),ADD(32,CARD{ADD(FN env_chunkadr(num%,type%),30)}))
  17423.   ENDIF
  17424. ENDFUNC
  17425. FUNCTION env_sectlen(num%,type%,sect%)
  17426.   LOCAL length%
  17427.   IF sect%=0
  17428.     length%=CARD{ADD(FN env_chunkadr(num%,type%),30)}
  17429.   ELSE
  17430.     length%=SUB(SUB(FN env_chunklen(num%,type%),32),FN env_sectlen(num%,type%,0))
  17431.   ENDIF
  17432.   RETURN length%
  17433. ENDFUNC
  17434. FUNCTION pos_enveloppe(num%,type%,sect%,pos%)
  17435.   ' Type de l'enveloppe (0,1 ou 2), numero de l'enveloppe (0-63),
  17436.   ' Attack/Key off (0 ou 1), position recherchee
  17437.   ' Retourne la position en octets relativement au debut des donnees du numero
  17438.   ' d'une commande
  17439.   ' Retourne -1 si la position n'existe pas
  17440.   LOCAL a%,b%,c%,l%,p%
  17441.   a%=FN env_sectadr(num%,type%,sect%)
  17442.   l%=FN env_sectlen(num%,type%,sect%)
  17443.   p%=0                  ! Compteur en positions
  17444.   c%=0                  ! Compteur en octets
  17445.   WHILE c%<l%
  17446.     EXIT IF p%>=pos%
  17447.     b%=BYTE{a%}         ! Commande
  17448.     ADD a%,FN env_comlen(b%)
  17449.     ADD c%,FN env_comlen(b%)
  17450.     INC p%
  17451.   WEND
  17452.   IF c%>=l%
  17453.     RETURN -1
  17454.   ELSE
  17455.     RETURN c%
  17456.   ENDIF
  17457. ENDFUNC
  17458. FUNCTION numcom_enveloppe(num%,type%,sect%,pos%)
  17459.   ' Type de l'enveloppe (0,1 ou 2), numero de l'enveloppe (0-63),
  17460.   ' Attack/Key off (0 ou 1), position en octets recherchee
  17461.   ' Retourne le numero de la commande correspondant a une position en octets
  17462.   LOCAL a%,b%,c%,l%,p%
  17463.   a%=FN env_sectadr(num%,type%,sect%)
  17464.   l%=FN env_sectlen(num%,type%,sect%)
  17465.   p%=0                  ! Compteur en positions
  17466.   c%=0                  ! Compteur en octets
  17467.   WHILE c%<l% AND c%<pos%
  17468.     b%=BYTE{a%}         ! Commande
  17469.     ADD a%,FN env_comlen(b%)
  17470.     ADD c%,FN env_comlen(b%)
  17471.     INC p%
  17472.   WEND
  17473.   RETURN p%
  17474. ENDFUNC
  17475. FUNCTION env_comlen(com%)
  17476.   ' Renvoie le nombre d'octets pris par une commande + son parametre
  17477.   LOCAL len%
  17478.   SELECT com%
  17479.   CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  17480.     len%=2
  17481.   CASE &H1,&H2,&H4,&H80,&H81,&HA0,&HA1,&HC0,&HC1
  17482.     len%=3
  17483.   DEFAULT
  17484.     len%=1
  17485.   ENDSELECT
  17486.   RETURN len%
  17487. ENDFUNC
  17488. '
  17489. '
  17490. '
  17491. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  17492. ' *                                                                          *
  17493. ' *                             Donnees diverses                             *
  17494. ' *                                                                          *
  17495. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  17496. '
  17497. ' 0
  17498. icones_disk:
  17499. DATA 17,0,5
  17500. DATA 0,"LOAD MOD",21,35,9,9, 1,"SAVE MOD",31,35,9,9
  17501. DATA 2,"LOAD PREF",21,45,9,9, 3,"SAVE PREF",31,45,9,9
  17502. DATA 4,"LOAD PATT",21,55,9,9, 5,"SAVE PATT",31,55,9,9
  17503. DATA 6,"LOAD SONG",21,65,9,9, 7,"SAVE SONG",31,65,9,9
  17504. DATA 8,"PATH OF                 ",20,80,24,9
  17505. DATA 9," ",20,90,59,9
  17506. DATA 10,"MODULE FILE      ",43,35,17,9
  17507. DATA 11,"MAKE DIR",62,35,8,9, 12,"DEL DIR",71,35,8,9
  17508. DATA 13,"RENAME",62,45,8,9, 14,"DEL FILE",71,45,8,9
  17509. DATA 15,"FORMAT",71,55,8,9
  17510. DATA 16," ",77,75,1,9
  17511. ' 1
  17512. icones_tools:
  17513. DATA 24,0,5
  17514. 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
  17515. 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
  17516. 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
  17517. 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
  17518. DATA 16,"MASK ON               ",29,75,22,9, 17,"REPLACE BY            ",29,85,22,9
  17519. DATA 18,"EXT NOTE       ",63,77,15,9
  17520. DATA 19,"SONG",71,40,7,9, 20,"INSTR",71,50,7,9, 21,"ALL",71,60,7,9
  17521. DATA 22,".../...",72,90,7,9
  17522. DATA 23,"SONG",61,60,7,9
  17523. ' 2
  17524. icones_sample1:
  17525. DATA 18,0,0
  17526. DATA 0,"EXIT",70,70,9,9
  17527. DATA 1,"ZOOM",0,20,9,9, 2,"ZOOM OUT",10,20,9,9
  17528. DATA 3,"COPY SPL => BLOCK",0,30,19,9
  17529. DATA 4,"COPY BLOCK => SPL",0,40,19,9
  17530. DATA 5,"SWAP BLOCK AND SPL",0,50,19,9
  17531. 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
  17532. DATA 10,"GAP (BLK)",0,60,9,9, 11,"GAP (SPL)",10,60,9,9
  17533. DATA 12,"PLAY",20,30,9,29
  17534. DATA 13,"FINE POS",20,60,9,9
  17535. DATA 14,"SWAP CURS",20,70,9,9
  17536. DATA 15,"RESET CUR",20,20,9,9
  17537. DATA 16,"LOAD SAMPLE", 68, 50, 11, 9
  17538. DATA 17,"SAVE SAMPLE", 68, 60, 11, 9
  17539. ' 3
  17540. icones_sample2:
  17541. DATA 10,0,0
  17542. 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
  17543. 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
  17544. ' 4
  17545. icones_sample3:
  17546. DATA 11,0,0
  17547. DATA 0,"VOLUME",40,20,9,9, 1,"MIX",40,30,9,9, 2,"RECORD",40,40,9,9
  17548. DATA 3,"MARKS",40,50,9,9, 4,"FREQUENCY",40,60,9,9, 5,"DELAY",40,70,9,9
  17549. DATA 6,"FLANGER",50,20,9,9, 7,"REVERB",50,30,9,9, 8,"SONG2DISK",50,40,9,9
  17550. DATA 9,"COMPRESS.",50,50,9,9, 10,"DISTO",50,60,9,9
  17551. ' 5
  17552. icones_sample_sm1:
  17553. DATA 17,0,0
  17554. DATA 0,"VOLUME      %",15,90,13,9
  17555. DATA 1,"VOLUME ?",1,85,12,19
  17556. 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
  17557. 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
  17558. DATA 10,"FADE !",49,90,29,9
  17559. DATA 11,"FADE START      %",49,115,17,9
  17560. DATA 12,"FADE END        %",49,125,17,9
  17561. DATA 13,"FADE IN",69,115,9,9
  17562. DATA 14,"FADE OUT",69,125,9,9
  17563. DATA 15,"NO CHANGE",1,125,13,9, 16,"BEST",15,125,13,9
  17564. ' 6
  17565. icones_sample_sm2:
  17566. DATA 46,0,0
  17567. DATA 0,"MIX !",1,85,11,9, 1,"MASTER      %",15,85,13,9
  17568. 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
  17569. 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
  17570. DATA 10," ",1,110,3,9, 11,"ⁿ",5,110,1,9, 12,"²",7,110,1,9, 13," ",9,110,29,9
  17571. 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
  17572. DATA 18," ",1,130,3,9, 19,"ⁿ",5,130,1,9, 20,"²",7,130,1,9, 21," ",9,130,29,9
  17573. 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
  17574. DATA 26," ",41,90,3,9, 27,"ⁿ",45,90,1,9, 28,"²",47,90,1,9, 29," ",49,90,29,9
  17575. 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
  17576. DATA 34," ",41,110,3,9, 35,"ⁿ",45,110,1,9, 36,"²",47,110,1,9, 37," ",49,110,29,9
  17577. 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
  17578. DATA 42," ",41,130,3,9, 43,"ⁿ",45,130,1,9, 44,"²",47,130,1,9, 45," ",49,130,29,9
  17579. ' 7
  17580. icones_samples_sm3:
  17581. DATA 18,0,0
  17582. DATA 0,"SAMPLE",1,85,9,9, 1,"PRESAMPLE",13,85,9,9
  17583. DATA 2,"ⁿ",65,105,1,9, 3,"²",67,105,1,9, 4,"ⁿ",75,105,1,9, 5,"²",77,105,1,9
  17584. DATA 6,"AUTO",69,105,5,9
  17585. DATA 7,"FREQUENCY      Hz",1,105,17,9, 8,"ⁿ",19,105,1,9, 9,"²",21,105,1,9
  17586. DATA 10,"MONITOR",25,120,11,9
  17587. DATA 11,"LEVEL      %",10,125,12,9, 12,"TRIGGER",1,125,8,9
  17588. DATA 13,"L",25,95,3,9, 14,"L+R",29,95,3,9, 15,"R",33,95,3,9
  17589. DATA 16,"FALCON 030 D.A.C.",39,95,23,9, 17,"ST REPLAY PRO CARDRIDGE",39,105,23,9
  17590. ' 8
  17591. icones_samples_sm4:
  17592. DATA 29,0,0
  17593. 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
  17594. 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
  17595. DATA 10,"ALL",65,130,3,9, 11,"RESET",74,130,5,9
  17596. DATA 12,"SET",0,130,5,9
  17597. 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
  17598. 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
  17599. DATA 23," ",4,80,20,49, 24," ",44,80,20,49
  17600. DATA 25," ",26,80,20,49, 26," ",66,80,20,49
  17601. DATA 27," ",33,80,20,49, 28," ",73,80,20,49
  17602. ' 9
  17603. icones_samples_sm5:
  17604. DATA 23,0,0
  17605. DATA 0,"CONVERT",1,90,11,9
  17606. DATA 1,"/2",1,115,3,9, 2,"/3",5,115,3,9, 3,"/4",9,115,3,9
  17607. DATA 4,"x2",1,125,3,9, 5,"x3",5,125,3,9, 6,"x4",9,125,3,9
  17608. DATA 7,"DO",50,90,13,9
  17609. DATA 8,"Hz        =>      ",15,90,18,9
  17610. DATA 9,"NOTE      =>      ",15,115,18,9
  17611. DATA 10,"Hz        =>      ",15,125,18,9
  17612. DATA 11,"NONE",36,95,11,9, 12,"LINEAR",36,105,11,9, 13,"3RD DEGREE",36,115,11,9
  17613. DATA 14,"START      Hz",50,105,13,9, 15,"END        Hz",50,115,13,9
  17614. DATA 16,"# OF PTS     ",50,125,13,9
  17615. DATA 17,"LINEAR",66,90,6,9, 18,"dB",73,90,5,9
  17616. DATA 19,"NONE",66,115,12,9, 20,"BLACKMAN",66,125,12,9
  17617. DATA 21," ",33,107,0,5, 22," ",63,82,0,5
  17618. ' 10
  17619. icones_samples_sm6:
  17620. DATA 30,0,0
  17621. DATA 0,"ON",44,85,2,9, 1,"DELAY TIME      ms",47,85,18,9, 2,"LEVEL      %",66,85,12,9
  17622. DATA 3,"ON",44,95,2,9, 4,"DELAY TIME      ms",47,95,18,9, 5,"LEVEL      %",66,95,12,9
  17623. DATA 6,"ON",44,105,2,9, 7,"DELAY TIME      ms",47,105,18,9, 8,"LEVEL      %",66,105,12,9
  17624. DATA 9,"ON",44,115,2,9, 10,"DELAY TIME      ms",47,115,18,9, 11,"LEVEL      %",66,115,12,9
  17625. DATA 12,"SAMPLE SOURCE   ",29,130,16,9, 13,"ⁿ",46,130,1,9, 14,"²",48,130,1,9, 15," ",50,130,29,9
  17626. DATA 16,"DO",30,113,9,13
  17627. DATA 17,"FEEDBACK       % ",1,85,17,9, 18,"TIME FEED      ms",1,95,17,9
  17628. DATA 19,"DRY LEVEL        %",21,85,18,9, 20,"DELAY LEVEL      %",21,95,18,9
  17629. DATA 21,"MULTI-TAP MODE",1,115,18,9
  17630. DATA 22,"MUTE IN :",1,125,9,9, 23,"      ms",11,125,8,9
  17631. DATA 24,"1",22,115,1,9, 25,"2",24,115,1,9, 26,"3",26,115,1,9
  17632. DATA 27,"4",22,125,1,9, 28,"5",24,125,1,9, 29,"6",26,125,1,9
  17633. ' 11
  17634. icones_tools2:
  17635. DATA 11,0,5
  17636. DATA 0,".../...",72,90,7,9
  17637. DATA 1,"ECHO",21,40,7,9, 2,"CONT",31,40,7,9
  17638. DATA 3,"EVERY   LINES",21,55,13,9, 4,"ⁿ",35,55,1,9, 5,"²",37,55,1,9
  17639. DATA 6," ",21,70,1,9, 7,"FEEDBACK     %",24,70,14,9
  17640. DATA 8," ",21,85,1,9, 9,"FADESTEP      ",24,85,14,9
  17641. DATA 10,"VOLUME SLIDE",41,35,15,9
  17642. ' 12
  17643. icones_instr:
  17644. DATA 42,0,5
  17645. DATA 0," ",21,34,1,7, 1," ",24,34,19,7
  17646. DATA 2," ",21,40,1,7, 3," ",24,40,19,7
  17647. DATA 4," ",21,46,1,7, 5," ",24,46,19,7
  17648. DATA 6," ",21,52,1,7, 7," ",24,52,19,7
  17649. DATA 8," ",21,58,1,7, 9," ",24,58,19,7
  17650. DATA 10," ",21,64,1,7, 11," ",24,64,19,7
  17651. DATA 12," ",21,70,1,7, 13," ",24,70,19,7
  17652. DATA 14," ",21,76,1,7, 15," ",24,76,19,7
  17653. DATA 16,"ⁿ",45,35,1,9, 17,"²",45,45,1,9
  17654. DATA 18,"FROM      ",49,60,10,9, 19,"ⁿ",60,60,1,9, 20,"²",62,60,1,9
  17655. DATA 21,"TO        ",49,70,10,9, 22,"ⁿ",60,70,1,9, 23,"²",62,70,1,9
  17656. DATA 24,"VOLUME    ",49,85,10,9, 25,"ⁿ",60,85,1,9, 26,"²",62,85,1,9
  17657. DATA 27,"VOLUME   ",65,45,9,9, 28,"ⁿ",75,45,1,9, 29,"²",77,45,1,9
  17658. DATA 30,"TON      ",65,55,9,9, 31,"ⁿ",75,55,1,9, 32,"²",77,55,1,9
  17659. DATA 33,"PAN      ",65,65,9,9, 34,"ⁿ",75,65,1,9, 35,"²",77,65,1,9
  17660. DATA 36,"ⁿ",27,85,1,9, 37,"²",29,85,1,9
  17661. DATA 38,"ⁿ",44,85,1,9, 39,"²",46,85,1,9
  17662. DATA 40,"LIST",65,80,13,14
  17663. DATA 41,"GROUP",52,35,7,19
  17664. ' 13
  17665. icones_instr_list:
  17666. DATA 17,0,5
  17667. DATA 0,"1st PAGE",69,75,9,19
  17668. DATA 1,"ⁿ",53,35,1,9, 2,"²",53,45,1,9
  17669. DATA 3,"TOP",56,35,3,9
  17670. DATA 4,"LOAD INSTRUMENT",61,35,17,9
  17671. DATA 5,"LOAD & KEEP SPL",61,45,17,9
  17672. DATA 6,"SAVE INSTRUMENT",61,55,17,9
  17673. DATA 7," ",21,35,30,5
  17674. DATA 8," ",21,41,30,5
  17675. DATA 9," ",21,47,30,5
  17676. DATA 10," ",21,53,30,5
  17677. DATA 11," ",21,59,30,5
  17678. DATA 12," ",21,65,30,5
  17679. DATA 13," ",21,71,30,5
  17680. DATA 14," ",21,77,30,5
  17681. DATA 15," ",21,83,30,5
  17682. DATA 16," ",21,89,30,5
  17683. ' 14
  17684. icones_sample:
  17685. DATA 34,0,5
  17686. DATA 0,"SAMPLE       ",21,35,13,9, 1,"ⁿ",35,35,1,9, 2,"²",37,35,1,9
  17687. DATA 3,"NAME                             ",39,35,33,9
  17688. DATA 4,"LENGTH       ",21,50,13,9, 5,"ⁿ",35,50,1,9, 6,"²",37,50,1,9
  17689. DATA 7,"REPEAT       ",21,60,13,9, 8,"ⁿ",35,60,1,9, 9,"²",37,60,1,9
  17690. DATA 10,"REPLEN       ",21,70,13,9, 11,"ⁿ",35,70,1,9, 12,"²",37,70,1,9
  17691. DATA 13,"VOLUME     ",41,50,11,9, 14,"ⁿ",53,50,1,9, 15,"²",55,50,1,9
  17692. DATA 16,"FINETUNE   ",41,60,11,9, 17,"ⁿ",53,60,1,9, 18,"²",55,60,1,9
  17693. DATA 19,"BALANCE    ",41,70,11,9, 20,"ⁿ",53,70,1,9, 21,"²",55,70,1,9
  17694. DATA 22,"FREQUENCY      ",59,50,15,9, 23,"ⁿ",75,50,1,9, 24,"²",77,50,1,9
  17695. DATA 25,"NBR OF BITS    ",59,60,15,9, 26,"ⁿ",75,60,1,9, 27,"²",77,60,1,9
  17696. DATA 28,"KILL",74,35,4,9
  17697. DATA 29,"LIST",71,75,7,19
  17698. DATA 30,"LOAD",21,85,7,9, 31,"SAVE",29,85,7,9
  17699. DATA 32,"SAMPLE FILE      ",50,85,17,9
  17700. DATA 33,"SIGNED",39,85,8,9
  17701. ' 15
  17702. icones_sample_list:
  17703. DATA 15,0,5
  17704. DATA 0,"1st PAGE",69,75,9,19
  17705. DATA 1,"ⁿ",53,35,1,9, 2,"²",53,45,1,9
  17706. DATA 3,"TOP",56,35,3,9
  17707. DATA 4,"INSTRUMENT ?",61,35,17,9
  17708. DATA 5," ",21,35,30,5
  17709. DATA 6," ",21,41,30,5
  17710. DATA 7," ",21,47,30,5
  17711. DATA 8," ",21,53,30,5
  17712. DATA 9," ",21,59,30,5
  17713. DATA 10," ",21,65,30,5
  17714. DATA 11," ",21,71,30,5
  17715. DATA 12," ",21,77,30,5
  17716. DATA 13," ",21,83,30,5
  17717. DATA 14," ",21,89,30,5
  17718. ' 16
  17719. icones_panneau_principal:
  17720. DATA 28,0,0
  17721. DATA 0,"POSITION      ",0,0,14,9, 1,"ⁿ",15,0,1,9, 2,"²",17,0,1,9
  17722. DATA 3,"PATTERN       ",0,10,14,9, 4,"ⁿ",15,10,1,9, 5,"²",17,10,1,9
  17723. DATA 6,"LENGTH        ",0,20,14,9, 7,"ⁿ",15,20,1,9, 8,"²",17,20,1,9
  17724. DATA 9,"REPEAT        ",0,30,14,9, 10,"ⁿ",15,30,1,9, 11,"²",17,30,1,9
  17725. DATA 12,"INSTRUMENT    ",0,45,14,9, 13,"ⁿ",15,45,1,9, 14,"²",17,45,1,9
  17726. DATA 15,"SAMPLE        ",0,55,14,9, 16,"ⁿ",15,55,1,9, 17,"²",17,55,1,9
  17727. DATA 18,"STEP   ",7,65,7,9, 19,"ⁿ",15,65,1,9, 20,"²",17,65,1,9
  17728. DATA 21,"SONGNAME                                 ",0,110,41,9
  17729. DATA 22,"INSTRNAME                             ",42,110,37,9
  17730. DATA 23,"TRACKS   ",0,80,9,9, 24,"LINES    ",0,90,9,9
  17731. DATA 25," ",0,65,6,9
  17732. DATA 26,"ON/OFF",0,120,7,9, 27,"PRESET",0,130,7,9
  17733. ' 17
  17734. icones_enveloppe_volume:
  17735. DATA 49,0,5
  17736. DATA 0," ",21,35,3,5
  17737. DATA 1," ",21,41,3,5
  17738. DATA 2," ",21,47,3,5
  17739. DATA 3," ",21,53,3,5
  17740. DATA 4," ",21,59,3,5
  17741. DATA 5," ",21,65,3,5
  17742. DATA 6," ",21,71,3,5
  17743. DATA 7," ",21,77,3,5
  17744. DATA 8," ",21,83,3,5
  17745. DATA 9," ",21,89,3,5
  17746. DATA 10," ",26,35,15,5
  17747. DATA 11," ",26,41,15,5
  17748. DATA 12," ",26,47,15,5
  17749. DATA 13," ",26,53,15,5
  17750. DATA 14," ",26,59,15,5
  17751. DATA 15," ",26,65,15,5
  17752. DATA 16," ",26,71,15,5
  17753. DATA 17," ",26,77,15,5
  17754. DATA 18," ",26,83,15,5
  17755. DATA 19," ",26,89,15,5
  17756. DATA 20," ",68,35,10,5
  17757. DATA 21," ",68,41,10,5
  17758. DATA 22," ",68,47,10,5
  17759. DATA 23," ",68,53,10,5
  17760. DATA 24," ",68,59,10,5
  17761. DATA 25," ",68,65,10,5
  17762. DATA 26," ",68,71,10,5
  17763. DATA 27," ",68,77,10,5
  17764. DATA 28," ",68,83,10,5
  17765. DATA 29," ",68,89,10,5
  17766. DATA 30,"ⁿ",43,35,1,9, 31,"²",43,45,1,9
  17767. DATA 32,"ⁿ",65,35,1,9, 33,"²",65,45,1,9
  17768. DATA 34,"VOLUME",46,35,6,9, 35,"TONE",53,35,5,9, 36,"PAN",59,35,4,9
  17769. DATA 37,"ATTACK",47,45,7,9, 38,"KEY OFF",55,45,7,9
  17770. DATA 39,"ENVELOPE   ",43,60,11,9, 40,"ⁿ",55,60,1,9, 41,"²",57,60,1,9
  17771. DATA 42,"CLR ENV",59,60,7,9
  17772. DATA 43," ",44,70,21,9
  17773. DATA 44,"DEL COM",43,85,7,9
  17774. DATA 45,"COPY",52,85,6,9, 46," ",59,85,3,9, 47,"ⁿ",63,85,1,9, 48,"²",65,85,1,9
  17775. ' 18
  17776. icones_tools3:
  17777. DATA 16,0,5
  17778. DATA 0,".../...",72,90,7,9
  17779. DATA 1,"ⁿ",44,35,1,9, 2,"²",44,45,1,9
  17780. DATA 3,"TOP",47,35,3,9
  17781. DATA 4,"INSERT POS",52,35,11,9, 5,"DELETE POS",52,45,11,9
  17782. DATA 6," ",21,35,30,5
  17783. DATA 7," ",21,41,30,5
  17784. DATA 8," ",21,47,30,5
  17785. DATA 9," ",21,53,30,5
  17786. DATA 10," ",21,59,30,5
  17787. DATA 11," ",21,65,30,5
  17788. DATA 12," ",21,71,30,5
  17789. DATA 13," ",21,77,30,5
  17790. DATA 14," ",21,83,30,5
  17791. DATA 15," ",21,89,30,5
  17792. ' 19
  17793. icones_samples_sm7_1:
  17794. DATA 16,0,0
  17795. DATA 0,"2nd PAGE",61,115,17,19
  17796. DATA 1,"LEFT CHANNEL",1,95,13,9, 2,"RIGHT CHANNEL",1,105,13,9, 3,"MIX L & R CHN",1,115,13,9
  17797. DATA 4,"DRY LEVEL         %",17,95,19,9, 5,"FLANGE LEVEL      %",17,105,19,9
  17798. DATA 6,"FLANGE TIME      ms",39,95,19,9
  17799. DATA 7,"FLANGE FREQ      Hz",39,105,19,9
  17800. DATA 8,"FLANGE DEPTH     ms",39,115,19,9
  17801. DATA 9,"INIT PHASE       π ",39,125,19,9
  17802. DATA 10,"1",61,95,1,9, 11,"2",64,95,1,9, 12,"3",67,95,1,9
  17803. DATA 13,"4",70,95,1,9, 14,"5",73,95,1,9, 15,"6",76,95,1,9
  17804. ' 20
  17805. icones_samples_sm7_2:
  17806. DATA 20,0,0
  17807. DATA 0,"1st PAGE",67,115,11,19
  17808. DATA 1,"LEFT SOURCE    ",1,85,15,9, 2,"ⁿ",17,85,1,9, 3,"²",19,85,1,9, 4," ",21,85,29,9
  17809. DATA 5,"RIGHT SOURCE   ",1,115,15,9, 6,"ⁿ",17,115,1,9, 7,"²",19,115,1,9, 8," ",21,115,29,9
  17810. DATA 9,"LEFT ³ LEFT        %",10,95,20,9, 10,"LEFT ³ RIGHT      %",31,95,19,9
  17811. DATA 11,"RIGHT ³ RIGHT      %",10,125,20,9, 12,"RIGHT ³ LEFT      %",31,125,19,9
  17812. DATA 13,"MONO",67,85,11,9, 14,"STEREO",67,95,11,9
  17813. DATA 15,"SIN",53,85,11,9, 16,"SQUARE",53,95,11,9, 17,"TRIANGLE",53,105,11,9
  17814. DATA 18,"RAMP DOWN",53,115,11,9, 19,"RAMP UP",53,125,11,9
  17815. ' 21
  17816. icones_samples_sm8_1:
  17817. DATA 16,0,0
  17818. DATA 0,"EXTRA",71,120,8,19
  17819. DATA 1,"REVERBERATION",1,85,22,9
  17820. DATA 2,"DRY LEVEL            %",1,105,22,9
  17821. DATA 3,"REVERB LEVEL         %",1,115,22,9
  17822. DATA 4,"EARLY REF LEVEL      %",1,125,22,9
  17823. DATA 5,"NUMBER OF TAPS   ",26,95,17,9, 6,"ⁿ",44,95,1,9, 7,"²",46,95,1,9
  17824. DATA 8,"NUMBER OF C.F.   ",50,95,17,9, 9,"ⁿ",68,95,1,9, 10,"²",70,95,1,9
  17825. DATA 11,"OVERALL GAIN        %",50,105,21,9
  17826. DATA 12,"SOURCE   ",26,125,9,9, 13,"ⁿ",36,125,1,9, 14,"²",38,125,1,9
  17827. DATA 15," ",40,125,29,9
  17828. ' 22
  17829. icones_samples_sm8_2:
  17830. DATA 14,0,0
  17831. DATA 0,"MAIN PAGE",68,120,11,19
  17832. DATA 1," ",1,90,1,41, 2," ",4,90,4,41, 3," ",10,90,4,41
  17833. DATA 4,"ⁿ",16,90,1,9, 5,"²",16,100,1,9
  17834. DATA 6," ",20,90,1,41, 7," ",23,90,4,41, 8," ",29,90,4,41
  17835. DATA 9,"ⁿ",35,90,1,9, 10,"²",35,100,1,9
  17836. DATA 11,"DELAY      ms",39,95,13,9, 12,"GAIN       % ",53,95,13,9
  17837. DATA 13,"DELAY      ms",39,125,13,9
  17838. ' 23
  17839. icones_song2disk:
  17840. DATA 22,0,0
  17841. DATA 0," ",7,95,1,9, 1," ",12,95,1,9
  17842. DATA 2," ",7,105,1,9, 3," ",12,105,1,9
  17843. DATA 4,"8 BITS",17,85,7,9, 5,"16 BITS",25,85,7,9
  17844. DATA 6,"MONO",17,105,7,9, 7,"STEREO",25,105,7,9
  17845. DATA 8,"BLOCK",35,95,5,9, 9,"DISK",35,105,5,9
  17846. DATA 10,"MAXIMUM DURATION      s ",43,95,24,9
  17847. DATA 11,"MAXIMUM SIZE          Kb",43,105,24,9
  17848. 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
  17849. 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
  17850. DATA 20,"RECORD",1,125,9,9
  17851. DATA 21,"MONITOR",58,125,9,9
  17852. ' 24
  17853. texte_icone1:
  17854. DATA 17,0,0
  17855. DATA 0,"PLAY SONG",20,0,11,9, 1,"EDIT",32,0,11,9, 2,"INSERT POS",44,0,11,9
  17856. DATA 3,"PREFS",56,0,11,9, 4,"SCORE",68,0,11,9
  17857. DATA 5,"PLAY PAT.",20,10,11,9, 6,"STOP",32,10,11,9, 7,"DELETE POS",44,10,11,9
  17858. DATA 8,"DRUM EDITOR",56,10,11,9, 9,"SAMP EDITOR",68,10,11,9
  17859. DATA 10,"DISK",20,20,6,9, 11,"TOOLS",27,20,6,9, 12,"INSTRUMENTS",34,20,11,9
  17860. DATA 13,"SAMPLES",46,20,7,9, 14,"ENVELOPES",54,20,9,9, 15,"CONTROL",64,20,9,9
  17861. DATA 16,"MIDI",74,20,5,9
  17862. ' 25
  17863. icones_control:
  17864. DATA 50,0,5
  17865. DATA 0,"VOLUMES",21,75,9,19, 1,"RESET",44,35,5,9
  17866. DATA 2," ",21,40,2,47, 3," ",21,92,2,5
  17867. DATA 4," ",26,40,2,47, 5," ",26,92,2,5
  17868. DATA 6," ",31,40,2,47, 7," ",31,92,2,5
  17869. DATA 8,"TEMPO    ",36,75,9,9, 9,"ⁿ",46,75,1,9, 10,"²",48,75,1,9
  17870. DATA 11,"SPEED    ",36,85,9,9, 12,"ⁿ",46,85,1,9, 13,"²",48,85,1,9
  17871. DATA 14,"01-08",36,45,6,9, 15,"09-16",43,45,6,9
  17872. DATA 16,"17-24",36,55,6,9, 17,"25-32",43,55,6,9
  17873. DATA 18," ",56,32,2,5, 19,"¯",60,31,1,7, 20,"³",62,31,1,7, 21," ",52,40,11,5
  17874. DATA 22," ",56,49,2,5, 23,"¯",60,48,1,7, 24,"³",62,48,1,7, 25," ",52,57,11,5
  17875. DATA 26," ",56,66,2,5, 27,"¯",60,65,1,7, 28,"³",62,65,1,7, 29," ",52,74,11,5
  17876. DATA 30," ",56,83,2,5, 31,"¯",60,82,1,7, 32,"³",62,82,1,7, 33," ",52,91,11,5
  17877. DATA 34," ",70,32,2,5, 35,"¯",74,31,1,7, 36,"³",76,31,1,7, 37," ",66,40,11,5
  17878. DATA 38," ",70,49,2,5, 39,"¯",74,48,1,7, 40,"³",76,48,1,7, 41," ",66,57,11,5
  17879. DATA 42," ",70,66,2,5, 43,"¯",74,65,1,7, 44,"³",76,65,1,7, 45," ",66,74,11,5
  17880. DATA 46," ",70,83,2,5, 47,"¯",74,82,1,7, 48,"³",76,82,1,7, 49," ",66,91,11,5
  17881. ' 26
  17882. icones_samples_sm9:
  17883. DATA 9,0,0
  17884. DATA 0,"DO",1,85,15,49
  17885. DATA 1,"SOURCE   ",19,125,9,9, 2,"ⁿ",29,125,1,9, 3,"²",31,125,1,9
  17886. DATA 4," ",33,125,29,9
  17887. DATA 5,"LEVEL       %",19,85,13,9
  17888. DATA 6,"SPEED    ",19,105,9,9, 7,"ⁿ",29,105,1,9, 8,"²",31,105,1,9
  17889. ' 27
  17890. icones_midi1:
  17891. DATA 15,0,5
  17892. DATA 0,"IN",26,34,3,9, 1,"OUT",30,34,3,9
  17893. DATA 2,"IN",26,46,3,9, 3,"OUT",30,46,3,9
  17894. DATA 4," ",0,0,0,0
  17895. DATA 5," ",0,0,0,0
  17896. DATA 6,"MONOPHONIC",21,75,12,9, 7,"POLYPHONIC",21,85,12,9
  17897. DATA 8,"CHANNEL      ",48,45,13,9, 9,"ⁿ",62,45,1,9, 10,"²",64,45,1,9
  17898. DATA 11,"INSTRUMENT   ",48,55,13,9, 12,"ⁿ",62,55,1,9, 13,"²",64,55,1,9
  17899. DATA 14,"P.M. CONF",67,85,11,9
  17900. ' 28
  17901. icones_midi2:
  17902. DATA 42,0,5
  17903. 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
  17904. 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
  17905. 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
  17906. 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
  17907. 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
  17908. 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
  17909. 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
  17910. 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
  17911. DATA 32,"MIDI CHANNEL     ",21,35,17,9, 33,"ⁿ",39,35,1,9, 34,"²",41,35,1,9
  17912. DATA 35,"INSTRUMENT       ",21,45,17,9, 36,"ⁿ",39,45,1,9, 37,"²",41,45,1,9
  17913. DATA 38,"SELECT CURRENT PRESET",21,60,21,9
  17914. DATA 39,"REMOVE MIDI CHANNEL",21,70,21,9
  17915. DATA 40,"RESET",21,85,5,9
  17916. DATA 41,"GENERAL CONF",29,85,15,9
  17917. ' 29
  17918. icones_samples_sm10:
  17919. DATA 8,0,0
  17920. DATA 0,"DISTORTION!",1,85,13,49
  17921. DATA 1,"SOURCE   ",17,125,9,9, 2,"ⁿ",27,125,1,9, 3,"²",29,125,1,9
  17922. DATA 4," ",31,125,29,9
  17923. DATA 5,"GAIN      %",17,85,11,9, 6,"ⁿ",29,85,1,9, 7,"²",31,85,1,9
  17924. ' 30
  17925. icones_drumeditor_main:
  17926. DATA 36,0,0
  17927. DATA 0,"RECORD",1,5,9,9, 1,"PLAY",1,15,9,9, 2,"STOP",1,25,9,9
  17928. DATA 3,"REAL TIME",18,45,9,9
  17929. DATA 4,"TEMPO      ",12,5,11,9, 5,"ⁿ", 24,5,1,9, 6,"²",26,5,1,9
  17930. DATA 7,"BEAT LEN   ",12,15,11,9, 8,"ⁿ", 24,15,1,9, 9,"²",26,15,1,9
  17931. DATA 10,"PAT LEN    ",12,25,11,9, 11,"ⁿ",24,25,1,9, 12,"²",26,25,1,9
  17932. DATA 13,"PATTERN    ",29,5,11,9, 14,"ⁿ",41,5,1,9, 15,"²",43,5,1,9
  17933. DATA 16,"IMPORT",29,15,7,9, 17,"EXPORT",37,15,7,9
  17934. DATA 18,"MAIN MENU",67,5,11,9
  17935. DATA 19,"SCORE",1,45,7,9, 20,"INFOS",9,45,7,9
  17936. DATA 21,"¯",29,45,3,9, 22,"³",33,45,3,9
  17937. DATA 23,"",1,70,12,9
  17938. DATA 24,"PAN                 ",14,70,20,9
  17939. DATA 25,"VOL",35,70,3,9, 26,"ⁿ",39,70,1,9, 27,"²",41,70,1,9
  17940. DATA 28,"TRACK   ",43,70,8,9, 29,"ⁿ",52,70,1,9, 30,"²",54,70,1,9
  17941. DATA 31,"",56,70,18,9, 32,"ⁿ",75,70,1,9, 33,"²",77,70,1,9
  17942. DATA 34,"",1,70,10,9, 35,"X",12,70,1,9
  17943. ' 31
  17944. icones_control_2:
  17945. DATA 20,0,5
  17946. DATA 0,"1ST PAGE",36,75,9,19, 1,"RESET",44,35,5,9
  17947. DATA 2," ",21,40,2,47, 3," ",21,92,2,5
  17948. DATA 4," ",26,40,2,47, 5," ",26,92,2,5
  17949. DATA 6," ",31,40,2,47, 7," ",31,92,2,5
  17950. DATA 8,"01-08",36,45,6,9, 9,"09-16",43,45,6,9
  17951. DATA 10,"17-24",36,55,6,9, 11,"25-32",43,55,6,9
  17952. DATA 12," ",56,40,1,47, 13," ",59,40,1,47, 14," ",62,40,1,47, 15," ",65,40,1,47
  17953. DATA 16," ",68,40,1,47, 17," ",71,40,1,47, 18," ",74,40,1,47, 19," ",77,40,1,47
  17954. ' Fin des donnees des sous-menus:
  17955. DATA -1
  17956. '
  17957. ' 0
  17958. popup_mod_ext:
  17959. DATA 11
  17960. DATA "*.GT2",0
  17961. DATA "*.GTK",1
  17962. DATA "*.MOD",2
  17963. DATA "*.S3M",3
  17964. DATA "*.DTM",4
  17965. DATA "*.MMD",5
  17966. DATA "*.MTM",6
  17967. DATA "*.669",7
  17968. DATA "*.ULT",8
  17969. DATA "*.XM",9
  17970. DATA "*.*",10
  17971. ' 1
  17972. popup_spl_ext:
  17973. DATA 5
  17974. DATA "*.AVR",0
  17975. DATA "*.SPL",1
  17976. DATA "*.WAV",2
  17977. DATA "*.VOC",3
  17978. DATA "*.*",4
  17979. ' 2
  17980. popup_path_type:
  17981. DATA 7
  17982. DATA "System",0
  17983. DATA "Module",1
  17984. DATA "Preferences",2
  17985. DATA "Sample",3
  17986. DATA "Instrument",4
  17987. DATA "Autoload",5
  17988. DATA "Miscellaneous",6
  17989. ' 3
  17990. popup_linestep:
  17991. DATA 8
  17992. DATA "Next volume",259
  17993. DATA "Next FX",258
  17994. DATA "Next note",257
  17995. DATA "Next line taken",256
  17996. DATA "1 line",1
  17997. DATA "2 lines",2
  17998. DATA "4 lines",4
  17999. DATA "8 lines",8
  18000. ' 4
  18001. popup_midi_in_poly:
  18002. DATA 9
  18003. DATA "Channel type:",$40000
  18004. DATA "Melody",0
  18005. DATA "Drums",1
  18006. DATA "Note Off:",$40000
  18007. DATA "Transcribed",10
  18008. DATA "Ignored",11
  18009. DATA "Velocity:",$40000
  18010. DATA "Transcribed",20
  18011. DATA "Ignored",21
  18012. ' Fin des donnees des pop-up:
  18013. DATA -1
  18014. '
  18015. touches_notes:
  18016. DATA 44,31,45,32,46,47,34,48,35,49,36,50,51,38,52,39,53
  18017. DATA 16,3,17,4,18,19,6,20,7,21,8,22,23,10,24,11,25,26,13,27,41
  18018. '
  18019. enveloppe_coms:
  18020. DATA $0,6
  18021. DATA "End",0,"Jump to ",0,"Wait ",50,"Set Counter ",1,"Loop to ",0,"Key Off",0
  18022. DATA $80,11
  18023. DATA "Volume ",$4000,"Vol Step ",0,"Vol Speed ",1
  18024. DATA "Tremolo On",0,"Tremolo Off",0,"Trem Width ",$10,"Trem Speed ",8
  18025. DATA "Tremor On",0,"Tremor Off",0,"TremorTime1 ",3,"TremorTime2 ",3
  18026. DATA $A0,7
  18027. DATA "Period ",$1000,"Tone Step ",0,"Tone Speed ",1
  18028. DATA "Vibrato On",0,"Vibrato Off",0,"Vib Width ",3,"Vib Speed ",8
  18029. DATA $C0,3
  18030. DATA "Panning ",$800,"Pan Step ",0,"Pan Speed ",1
  18031. '
  18032. rev_tap_delay_level:
  18033. 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
  18034. rev_comb_delay_lpf:
  18035. DATA 0.0547,0.448, 0.07,0.496, 0.0448,0.408, 0.0646,0.476
  18036. '
  18037. keycode_names:
  18038. ' A mettre dans l'ordre:
  18039. ' * devant le nom: 1 parametre apres
  18040. ' ^ devant le nom: groupement de touches
  18041. DATA "CURSOR LEFT","CURSOR RIGHT","PREV LINE","NEXT LINE"
  18042. DATA "PREV OCTAVE","NEXT OCTAVE","PREV COLUMN","NEXT COLUMN"
  18043. DATA "PREV BAR","NEXT BAR","PREV SONGPOS","NEXT SONGPOS"
  18044. DATA "PREV PRESET","NEXT PRESET","DEC STEP","INC STEP"
  18045. DATA "DEC HIGH","INC HIGH","PLAY LINE","PLAY SONG"
  18046. DATA "CONT SONG","PLAY PATTERN","CONT PATTERN","STOP/EDIT"
  18047. DATA "PREV INSTR","NEXT INSTR","PREV SAMPLE","NEXT SAMPLE"
  18048. DATA "EXPAND","CPU TIME","REPLAY FREQ","INTERPOLATION ONE TRACK"
  18049. DATA "INTERPOLATION ALL TRACKS","LOAD MODULE","SAVE MODULE","RESYNC SCREEN"
  18050. DATA "SNAPSHOT","INSTRPAD/SAMPLEPAD/DRUMPAD","HELP","BLOCK START"
  18051. DATA "BLOCK END","INSTR UNDER CURSOR","CLEAR NOTE","CLEAR EFFECT"
  18052. DATA "CLEAR VOLUME","CLEAR WHOLE NOTE","COPY BLOCK (TRACK)","COPY BLOCK (PATTERN)"
  18053. DATA "COPY BLOCK (PRESET)","COPY BLOCK (TRACK UNDER CURSOR)","INSERT LINE IN PATTERN","INSERT LINE IN TRACK"
  18054. DATA "INSERT LINE IN PRESET","ROTATE & INSERT LINE IN PATTERN","ROTATE & INSERT LINE IN TRACK","ROTATE & INSERT LINE IN PRESET"
  18055. DATA "DELETE LINE IN PATTERN","DELETE LINE IN TRACK","DELETE LINE IN PRESET","ROTATE & DELETE LINE IN PATTERN"
  18056. DATA "ROTATE & DELETE LINE IN TRACK","ROTATE & DELETE LINE IN PRESET","*LINE","*LINE"
  18057. DATA "*LINE","*LINE","*LINE","*LINE"
  18058. DATA "*LINE","*LINE","*LINE","*LINE"
  18059. DATA "*^SELECT PRESET","*^SELECT PRESET","*^REC PRESET","*^REC PRESET"
  18060. DATA "*^INSTR/SAMPLE/DRUM","*^INSTR/SAMPLE/DRUM","*^REC INSTR/SAMPLE/DRUM","*^REC INSTR/SAMPLE/DRUM"
  18061. DATA "*^TRACK ON/OFF","*^TRACK ON/OFF","*^REC TRACK ON/OFF","*^REC TRACK ON/OFF"
  18062. DATA "***","***"
  18063. '
  18064. key_scancode_to_ascii:
  18065. DATA "AZERTYUIOP","QSDFGHJKLM","WXCVBN,"
  18066. DATA "QWERTYUIOP","ASDFGHJKL:","ZXCVBNM"
  18067. '
  18068. default_keycodes:
  18069. DATA 84
  18070. DATA FFF0000,4B0000,F000100,0,0
  18071. DATA FFF0000,4D0000,F000100,0,0
  18072. DATA FFF0000,480000,F000100,0,0
  18073. DATA FFF0000,500000,F000100,0,0
  18074. DATA CFF0100,10100,F000100,0,0
  18075. DATA FFF0000,10000,F000100,0,0
  18076. DATA CFF0100,F0100,F000100,0,0
  18077. DATA FFF0000,F0000,F000100,0,0
  18078. DATA CFF0100,480100,F000100,0,0
  18079. DATA CFF0100,500100,F000100,0,0
  18080. DATA CFF0100,4B0100,F000100,0,0
  18081. DATA CFF0100,4D0100,F000100,0,0
  18082. DATA FFF0000,44B0000,F000100,0,0
  18083. DATA FFF0000,44D0000,F000100,0,0
  18084. DATA C0001FF,4000153,F000100,0,0
  18085. DATA F0000FF,4000053,F000100,0,0
  18086. DATA CFF0100,4480100,F000100,0,0
  18087. DATA CFF0100,4500100,F000100,0,0
  18088. DATA FFF0000,1C0000,F000100,0,0
  18089. DATA FFF0000,700000,F000100,0,0
  18090. DATA FFF0000,3E0000,F000100,0,0
  18091. DATA CFF0100,1C0100,CFF0100,700100,0
  18092. DATA CFF0100,3E0100,F000100,0,0
  18093. DATA FFF0000,390000,F000100,0,0
  18094. DATA FFF0000,520000,F000100,0,0
  18095. DATA FFF0000,470000,F000100,0,0
  18096. DATA 0,0,0,0,0
  18097. DATA 0,0,0,0,0
  18098. DATA F0000FF,4000045,F000100,0,0
  18099. DATA F0000FF,4000044,F000100,0,0
  18100. DATA F0000FF,4000052,F000100,0,0
  18101. DATA F0000FF,4000049,F000100,0,0
  18102. DATA C0001FF,4000149,F000100,0,0
  18103. DATA F0000FF,800004C,F000100,0,0
  18104. DATA F0000FF,8000053,F000100,0,0
  18105. DATA F0000FF,800004D,F000100,0,0
  18106. DATA F0000FF,C000050,F000100,0,0
  18107. DATA FFF0000,3F0000,F000100,0,0
  18108. DATA FFF0000,620000,F000100,0,0
  18109. DATA FFF0000,3B0000,F000100,0,0
  18110. DATA CFF0100,3B0100,F000100,0,0
  18111. DATA FFF0000,710000,F000100,0,0
  18112. DATA FFF0000,E0000,F000100,0,0
  18113. DATA CFF0100,E0100,F000100,0,0
  18114. DATA FFF0000,80E0000,F000100,0,0
  18115. DATA FFF0000,40E0000,F000100,0,0
  18116. DATA FFF0000,3C0000,F000100,0,0
  18117. DATA CFF0100,3C0100,F000100,0,0
  18118. DATA FFF0000,43C0000,F000100,0,0
  18119. DATA FFF0000,83C0000,F000100,0,0
  18120. DATA FFF0000,2520000,F000100,0,0
  18121. DATA FFF0000,4520000,F000100,0,0
  18122. DATA FFF0000,6520000,F000100,0,0
  18123. DATA FFF0000,3520000,F000100,0,0
  18124. DATA FFF0000,5520000,F000100,0,0
  18125. DATA FFF0000,7520000,F000100,0,0
  18126. DATA FFF0000,2530000,F000100,0,0
  18127. DATA FFF0000,4530000,F000100,0,0
  18128. DATA FFF0000,6530000,F000100,0,0
  18129. DATA FFF0000,3530000,F000100,0,0
  18130. DATA FFF0000,5530000,F000100,0,0
  18131. DATA FFF0000,7530000,F000100,0,0
  18132. DATA FFF0000,400000,F000100,0,0
  18133. DATA FFF0000,410000,F000100,0,10
  18134. DATA FFF0000,420000,F000100,0,20
  18135. DATA FFF0000,430000,F000100,0,30
  18136. DATA FFF0000,440000,F000100,0,3F
  18137. DATA CFF0100,400100,F000100,0,40
  18138. DATA CFF0100,410100,F000100,0,50
  18139. DATA CFF0100,420100,F000100,0,60
  18140. DATA CFF0100,430100,F000100,0,70
  18141. DATA CFF0100,440100,F000100,0,7F
  18142. DATA 0,0,0,0,0
  18143. DATA 0,0,0,0,10
  18144. DATA 0,0,0,0,0
  18145. DATA 0,0,0,0,10
  18146. DATA F000300,200,F000100,0,0
  18147. DATA F000200,1000200,F000100,0,10
  18148. DATA F000200,2000200,F000100,0,0
  18149. DATA F000200,3000200,F000100,0,10
  18150. DATA 0,0,0,0,0
  18151. DATA 0,0,0,0,10
  18152. DATA 0,0,0,0,0
  18153. DATA 0,0,0,0,10
  18154. '
  18155. help_text:
  18156. DATA "              ******************************************"
  18157. DATA "              *                                        *"
  18158. DATA "              *     G R A O U M F   T R A C K E R      *"
  18159. DATA "              *                                        *"
  18160. DATA "              *           Version Beta-demo            *"
  18161. DATA "              *      by Laurent de SORAS - 1994/96     *"
  18162. DATA "              *                                        *"
  18163. DATA "              *                                        *"
  18164. DATA "              *   "Tu fais moins l'malin maintenant,   *"
  18165. DATA "              *         tu fais moins l'malin !"       *"
  18166. DATA "              *                                        *"
  18167. DATA "              ******************************************"
  18168. DATA ""
  18169. DATA "                             ------------"
  18170. DATA "                             -   HELP   -"
  18171. DATA "                             ------------"
  18172. DATA ""
  18173. DATA "Graoumf Tracker is Shareware!!!"
  18174. DATA "You can copy me, but if you like me, you MUST send your money to my"
  18175. DATA "creator (100 FF, $25 or 30 DM):"
  18176. DATA "Laurent de Soras"
  18177. DATA "92 Avenue Albert 1er"
  18178. DATA "92500 Rueil-Malmaison"
  18179. DATA "FRANCE"
  18180. '
  18181. DATA "Notes"
  18182. DATA "-----"
  18183. DATA ""
  18184. DATA "C  C# D  D# E     F  F# G  G# A  A# B     C  C# D  D# E    F  F# G  G#"
  18185. DATA "----------------------------------------------------------------------"
  18186. DATA "   2     3           5     6    7            9     0          -     `"
  18187. DATA "A     Z     E     R     T     Y     U     I     O     P    ^     $"
  18188. DATA "----------------------------------------------------------------------"
  18189. DATA "   S     D           G     H     J           L     M"
  18190. DATA "W     X     C     V     B     N     ,     ;     :     ="
  18191. DATA "----------------------------------------------------------------------"
  18192. DATA ""
  18193. DATA "Standard keys (you can redefine them)"
  18194. DATA "-------------------------------------"
  18195. DATA ""
  18196. DATA "SHIFT + ¯ ou ³            : Position +/-"
  18197. DATA "SHIFT + ⁿ ou ²            : Jump to the next bar"
  18198. DATA "TAB                       : Cursor on next column"
  18199. DATA "SHIFT + TAB               : Cursor on prev column"
  18200. DATA "CTRL + ¯ ou ³             : Preset +/-"
  18201. DATA "BACKSPACE                 : Clear note & instr under the curseur"
  18202. DATA "SHIFT + BACKSPACE         : Clear effect"
  18203. DATA "CTRL + BACKSPACE          : Clear note, instr & effect"
  18204. DATA "ALT + BACKSPACE           : Clear volume"
  18205. '
  18206. DATA "CTRL + DELETE             : Delete note (track)"
  18207. DATA "Left SHIFT + DELETE       : Delete note (pattern)"
  18208. DATA "Left SHIFT + CTRL + DEL   : Delete note (preset)"
  18209. DATA "CTRL + INSERT             : Insert note (track)"
  18210. DATA "Left SHIFT + INSERT       : Insert note (pattern)"
  18211. DATA "Left SHIFT + CTRL + INS   : Insert note (preset)"
  18212. DATA "These 6 commands + r SHIFT: Rotation of the track/pattern/preset"
  18213. DATA "Numeric Pad (+right SHIFT): Select an instrument"
  18214. DATA "INSERT                    : Prev instrument"
  18215. DATA "CLR HOME                  : Next instrument"
  18216. DATA "ESC (+ SHIFT)             : Next (prev) octave"
  18217. DATA "F5                        : NumPad is Instr/Sample/Drum-pad"
  18218. DATA "Left SHIFT + Numeric Pad  : Assign an Instr/Sample/Note to a key"
  18219. DATA "0 on NumPad               : Play song"
  18220. DATA "SHIFT + RET or + 0 on Pad : Play pattern"
  18221. DATA "RETURN                    : Play line"
  18222. DATA "F4                        : Cont song"
  18223. DATA "SHIFT + F4                : Cont pattern"
  18224. DATA "F1                        : Define block start"
  18225. DATA "SHIFT + F1                : Define block end"
  18226. DATA "F2                        : Paste block (piste)"
  18227. DATA "SHIFT + F2                : Paste block (pattern)"
  18228. DATA "CTRL + F2                 : Paste block (preset)"
  18229. DATA "ALT + F2                  : Paste block (track under the cursor)"
  18230. '
  18231. DATA "F6 - F10 (+ SHIFT)        : Line 00, 10, 20, 30 et 3F (+40)"
  18232. DATA "CTRL + SHIFT + ⁿ          : Increase pattern window height"
  18233. DATA "CTRL + SHIFT + ²          : Decrease pattern window height"
  18234. DATA "CTRL + D                  : Display CPU time"
  18235. DATA "CTRL + E                  : Change pattern display mode:"
  18236. DATA "                            - Note + Instr"
  18237. DATA "                            - Note + Instr + FX"
  18238. DATA "                            - Note + Instr + FX + Volume"
  18239. DATA "CTRL + I                  : Interpolation On/Off (track)"
  18240. DATA "CTRL + SHIFT + I          : Interpolation On/Off (pattern)"
  18241. DATA "CTRL + R                  : Change replay frequency"
  18242. DATA "CTRL + S                  : Increase the LineStep"
  18243. DATA "  + SHIFT                 : Decrease the LineStep"
  18244. DATA "ALT + L                   : Load module"
  18245. DATA "ALT + S                   : Save module"
  18246. DATA ""
  18247. DATA ""
  18248. DATA ""
  18249. DATA ""
  18250. DATA ""
  18251. DATA ""
  18252. DATA ""
  18253. DATA ""
  18254. DATA ""
  18255. '
  18256. DATA "Effects"
  18257. DATA "-------"
  18258. DATA ""
  18259. DATA "01xx : Portamento up"
  18260. DATA "02xx : Portamento down"
  18261. DATA "03xx : Tone portamento"
  18262. DATA "04xy : Vibrato"
  18263. DATA "05xx : Tone portamento + Vibrato"
  18264. DATA "06xy : Vibrato + Tone portamento"
  18265. DATA "07xy : Tremolo"
  18266. DATA "08xy : Detune"
  18267. DATA "09xx : Note delay"
  18268. DATA "0Axx : Cut note"
  18269. DATA "0Bxx : Go to position xx"
  18270. DATA "0C?x : Set vibrato waveform"
  18271. DATA "0Dxx : Break pattern"
  18272. DATA "0E?x : Set tremolo waveform"
  18273. DATA "0Fxx : Set global speed/Tempo"
  18274. DATA "10xy : Arpeggio"
  18275. DATA "11xx : Fine portamento up"
  18276. DATA "12xx : Fine portamento down"
  18277. DATA "13xy : Roll + Volume slide"
  18278. DATA "14xx : Linear volume slide up"
  18279. DATA "15xx : Linear volume slide down"
  18280. '
  18281. DATA "16xx : Exp. volume slide up"
  18282. DATA "17xx : Exp. volume slide down"
  18283. DATA "18xx : Linear volume slide up + Tone portamento"
  18284. DATA "19xx : Linear volume slide down + Tone portamento"
  18285. DATA "1Axx : Exp. volume slide up + Tone portamento"
  18286. DATA "1Bxx : Exp. volume slide down + Tone portamento"
  18287. DATA "1Cxx : Linear volume slide up + Vibrato"
  18288. DATA "1Dxx : Linear volume slide down + Vibrato"
  18289. DATA "1Exx : Exp. volume slide up + Vibrato"
  18290. DATA "1Fxx : Exp. volume slide down + Vibrato"
  18291. DATA "A0xx : Linear master volume slide up"
  18292. DATA "A1xx : Linear master volume slide down"
  18293. DATA "A4xx : Fine linear volume up"
  18294. DATA "A5xx : Fine linear volume down"
  18295. DATA "A6xx : Fine linear master volume up"
  18296. DATA "A7xx : Fine linear master volume down"
  18297. DATA "A8xx : Set number of frames"
  18298. DATA "A9xx : Set fine speed"
  18299. DATA "AAxx : Pattern delay"
  18300. DATA "ABxx : Extra fine tone portamento"
  18301. DATA "ACxx : Extra fine portamento up"
  18302. DATA "ADxx : Extra fine portamento down"
  18303. DATA "AExx : Left balance move"
  18304. DATA "AFxx : Right balance move"
  18305. '
  18306. DATA "B0xy : Tremor"
  18307. DATA "B1xx : Pattern loop"
  18308. DATA "B2xx : Set flags... +1: Linear interpolation on the track"
  18309. DATA "B3xx : Set Volume Envelope"
  18310. DATA "B4xx : Set Tone Evelope"
  18311. DATA "B5xx : Set Panning Envelope"
  18312. DATA "B6xx : Set Volume Envelope and Key Off"
  18313. DATA "B7xx : Set Tone Envelope and Key Off"
  18314. DATA "B8xx : Set Panning Envelope and Key Off"
  18315. DATA "BAxx : Fine Sample Offset"
  18316. DATA "BBxx : Very Fine Sample Offset"
  18317. DATA "BCxx : Increment Sample Position"
  18318. DATA "BDxx : Decrement Sample Position"
  18319. DATA "BExx : Auto Tempo"
  18320. DATA "BFxx : Auto Period"
  18321. DATA "C2xx : Set linear track volume"
  18322. DATA "C3xx : Set exponential track volume"
  18323. DATA "C4xx : Linear track volume slide up"
  18324. DATA "C5xx : Linear track volume slide down"
  18325. DATA "C6xx : Exponential track volume slide up"
  18326. DATA "C7xx : Exponential track volume slide down"
  18327. DATA "C8xx : Fine exponential track volume slide up"
  18328. DATA "C9xx : Fine exponential track volume slide down"
  18329. DATA ""
  18330. '
  18331. DATA "2xxx : Set linear volume"
  18332. DATA "3xxx : Set exp. volume"
  18333. DATA "4xxx : Set balance"
  18334. DATA "5xxx : Set master linear volume"
  18335. DATA "6xxx : Set master esp. volume"
  18336. DATA "7xyy : Roll"
  18337. DATA "8xyz : Roll + volume slide + set balance"
  18338. DATA "9xxx : Sample Offset"
  18339. DATA ""
  18340. DATA ""
  18341. DATA ""
  18342. DATA ""
  18343. DATA ""
  18344. DATA ""
  18345. DATA ""
  18346. DATA ""
  18347. DATA ""
  18348. DATA ""
  18349. DATA ""
  18350. DATA ""
  18351. DATA ""
  18352. DATA ""
  18353. DATA ""
  18354. DATA ""
  18355. '
  18356. DATA "THE CRUCIFICTION OF SEAN PENN"
  18357. DATA ""
  18358. DATA "We're gonna kill the California girls"
  18359. DATA "We're gonna fire the exploding load"
  18360. DATA "in the milkmaid maidenhead"
  18361. DATA "We're gonna find the meaning of feeling good"
  18362. DATA "And we're gonna stay there as long as we think we should"
  18363. DATA "  Mystery train"
  18364. DATA "  Three way plane"
  18365. DATA "  Expressway to yr skull"
  18366. DATA ""
  18367. DATA "                                               (SoNiC YoUTh / E.V.O.L)"
  18368. DATA ""
  18369. DATA ""
  18370. DATA ""
  18371. DATA ""
  18372. DATA ""
  18373. DATA ""
  18374. DATA ""
  18375. DATA ""
  18376. DATA ""
  18377. DATA ""
  18378. DATA ""
  18379. DATA ""
  18380. '    "1234567890123456789012345678901234567890123456789012345678901234567890"
  18381. DATA "***"
  18382. '
  18383. textes_blagues:
  18384. DATA "Mr et Mme BRICOT ont un fils,|comment l'appellent-ils ?||R : Judas","*"
  18385. DATA "Mr et Mme POTDANLAPOCHE ont une fille,|comment l'appellent-ils ?||R : Jessica","*"
  18386. DATA "Mr et Mme PEULAFENETRE ont trois fils,|comment les appellent-ils ?||R : Geoffroy, Angele, Firmin","*"
  18387. DATA "Mr et Mme HERGEBEL ont un fils,|comment l'appellent-ils ?||R : Octave","*"
  18388. DATA "Mr et Mme PAFROI ont sept fils,|comment les appellent-ils ?||R : Eva, Aude, Anne, Marc, Sanson, Gilles et Ella","*"
  18389. DATA "Mr et Mme PROVISTSAPU ont trois fils,|comment les appellent-ils ?||R : Quentin, Gaspard, Alain","*"
  18390. DATA "Mr et Mme LIOTEKDAKAJOU ont un fils,|comment l'appellent-ils ?||R : Habib","*"
  18391. DATA "Mr et Mme REMORD ont un fils,|comment l'appellent-ils ?||R : Yves","*"
  18392. DATA "Mr et Mme POURLAVERLCARLAGE ont un fils,|comment l'appellent-ils ?||R : Vladimir","*"
  18393. DATA "Mr et Mme CREMENT ont un fils,|comment l'appellent-ils ?||R : Alex","*"
  18394. DATA "Mr et Mme TANANANANANANA ont deux fils,|comment les appellent-ils ?||R : Starsky et Hutch","*"
  18395. DATA "Mr et Mme LFRIGO ont cinq fils,|comment les appellent-ils ?||R : Steve, Eude, Hubert, Yann, Adam","*"
  18396. DATA "Mr et Mme ERVITMONSLIP ont un fils,|comment l'appellent-ils ?||R : Jean-Philippe","*"
  18397. DATA "Mr et Mme ZELPOURMONMOTEUR ont un fils,|comment l'appellent-ils ?||R : Didier","*"
  18398. DATA "Mr et Mme MAIJAVALPA ont un fils,|comment l'appellent-ils ?||R : Jesus","*"
  18399. DATA "Mr et Mme MAROLEX ont une fille,|comment l'appellent-ils ?||R : Eleonore","*"
  18400. DATA "Mr et Mme PONSABLDUMATOS ont une fille,|comment l'appellent-ils ?||R : Therese","*"
  18401. DATA "Mr et Mme LUTFINALE ont une fille,|comment l'appellent-ils ?||R : Sheila","*"
  18402. DATA "Mr et Mme CHMONFILS ont un fils,|comment l'appellent-ils ?||R : Thierry","*"
  18403. DATA "Mr et Mme BIENUNPTICASCROUTE ont un fils,|comment l'appellent-ils ?||R : Humphrey","*"
  18404. DATA "Mr et Mme BISTROJAISOIF ont un fils,|comment l'appellent-ils ?||R : Alonzo","*"
  18405. DATA "Mr et Mme CONERY ont une fille,|comment l'appellent-ils ?||R : Aretha","*"
  18406. DATA "Mr et Mme PUDBIERDANLFRIGO ont un fils,|comment l'appellent-ils ?||R : Roger","*"
  18407. DATA "Mr et Mme ITZEGOUDWAITOUZESTATION ont une fille,|comment l'appellent-ils ?||R : Eloise","*"
  18408. DATA "Mr et Mme POURIEN ont trois fils,|comment les appellent-ils ?||R : Yvon, Paul et Mickey","*"
  18409. DATA "Mr et Mme AMAR ont cinq fils,|comment les appellent-ils ?||R : Ella, Pacome, Ancel, Helene,|Nadege","*"
  18410. DATA "Mr et Mme NAIBOURREDAITA ont trois fils,|comment les appelent-ils ?||R : Derek, Tom, Jean","*"
  18411. 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","*"
  18412. DATA "Mr et Mme MACOUVERTURMEGRAT ont une fille,|comment l'appellent-ils ?||R : Sandra","*"
  18413. DATA "Mr et Mme SURLELITETPASSURLECANAPE ont un chien,|comment l'appelent-ils ?||R : Medor","*"
  18414. 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!"
  18415. DATA "*","C'est deux Corses qui se promenent.|Tout d'un coup, l'un deux se retourne"
  18416. DATA "et ecrase un escargot. L'autre :|- Ben pourquoi t'as fait ca ?"
  18417. DATA "- Ca faisait un quart d'heure|que cette bestiole nous suivait!","*"
  18418. DATA "2 vieilles dames discutent|sur la terrasse d'un cafe :"
  18419. DATA "- J'ai l'impression que l'homme la-bas,|il nous regarde avec envie."
  18420. DATA "- Tu m'etonnes, c'est l'antiquaire!","*"
  18421. 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","*"
  18422. DATA "C'est un type qui veut se suicider."
  18423. DATA "Pour son dernier jour, il se lave, se coiffe,"
  18424. DATA "se relave, met du Petrol Hane, du parfum,"
  18425. DATA "enfile ses plus beaux habits."
  18426. DATA "Il monte en haut de la Tour Eiffel, et saute."
  18427. DATA "Le corps s'ecrase, suivi plusieurs secondes"
  18428. DATA "apres de ses cheveux.|Pourquoi ?|"
  18429. DATA "R : parceque Petrol Hane ralentit|la chute des cheveux...","*"
  18430. DATA "C'est un gars qui a une moumoute et|qui va chez le coiffeur"
  18431. DATA "La, rien a faire, les ciseaux|n'arrivent pas a couper les cheveux.|Pourquoi ?|"
  18432. DATA "R : parceque les faux tifs ne sont pas coupables","*"
  18433. DATA "Pourquoi les Somaliens ne prennent-|ils pas de medicament ?||R : C'est marque dessus :|"A prendre apres chaque repas","*"
  18434. DATA "Qu'est-ce qui est le plus|dur a manger dans|un legume ?||R : la chaise roulante","*"
  18435. DATA "Quel est le point commun entre|un myopathe et un spaghetti ?||R : Le spaghetti bouge quand|on le suce...","*"
  18436. DATA "Qu'est-ce qui est vert|et qui devient rouge|quand on appuie sur|un bouton ?||R : Une grenouille dans un mixer","*"
  18437. DATA "Qu'est-ce qui est vert|et qui pue au fond des bois ?||R : Un scout mort","*"
  18438. DATA "Qu'est-ce qui est rouge|et qui a plus de cervelle|que Kurt Cobain ?||R : Son plafond","*"
  18439. DATA "Qu'est-ce qui est petit, rouge,|et qui avance en faisant|beaucoup de bruit ?||R : Un bebe sucant des lames de rasoir","*"
  18440. 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.","*"
  18441. DATA "Qu'est-ce qu'une boite jaune a|l'exterieur et noire a l'interieur ?||R : Une R4 de la Poste","*"
  18442. DATA "Qu'y a-t-il de pire qu'un|bebe dans une poubelle ?||R : Un bebe dans deux poubelles","*"
  18443. DATA "Qu'est-ce qu'un combat|d'eunuques ?||R : c'est un combat sanglant","*"
  18444. DATA "C'est J.C. Vandame qui rentre|dans sa bagnole et qui|fout l'contact","*"
  18445. DATA "C'est Stallone qui va au|bal et qui se rend beau","*"
  18446. DATA "C'est un mec qui rentre|dans un cafe et PLOUF!","*"
  18447. DATA "C'est un sanglier qui|croise un cochon:|- Ca se passe bien pour|toi la chimiotherapie ?","*"
  18448. DATA "Vous connaissez l'histoire|de Paf le chien ?||C'est un chien qui traverse|l'autoroute et PAF le chien!","*"
  18449. DATA "Vous connaissez l'histoire|de Scroutch l'escargot ?||C'est un escargot qui passe|sous un rouleau compresseur|et SCROUTCH l'escargot!","*"
  18450. DATA "Vous connaissez l'histoire|de Zip le pingouin ?||C'est un pingouin qui se promene|sur la banquise et ZIP le pingouin!","*"
  18451. DATA "Vous connaissez l'histoire|de Flip-Flop la girafe ?||C'est un helicoptere qui fait du|rase-motte et FLIP-FLOP la girafe!","*"
  18452. DATA "Vous connaissez l'histoire|de Tiens la vieille ?||C'est une vieille qui se fait|frapper et TIENS la vieille!","*"
  18453. DATA "***"
  18454.