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 / GMODCONV.LST < prev    next >
File List  |  1999-02-15  |  252KB  |  7,318 lines

  1. ' ****************************************************************************
  2. ' *                                                                          *
  3. ' *             G R A O U M F   M O D U L E   C O N V E R T E R              *
  4. ' *                Convertisseur de modules de soundtrackers                 *
  5. ' *                        By Laurent de Soras, 1996                         *
  6. ' *                                                                          *
  7. ' ****************************************************************************
  8. '
  9. ' Routines de sauvegarde et de chargement issues du Graoumf Tracker
  10. '
  11. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  12. ' *                                                                          *
  13. ' *                              Initialisations                             *
  14. ' *                                                                          *
  15. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  16. '
  17. RESERVE -131072                 ! 128 Ko reserves pour le systeme
  18. gtk_version%=10600              ! Numero de version du logiciel x10000
  19. gtk_file_vnum%=4                ! Numero de format de module GTK
  20. gt2_file_vnum%=1                ! Numero de format de module GT2
  21. npath_prog$=CHR$(ADD(65,GEMDOS(&H19)))+":"+DIR$(0)+"\SYS\"
  22. ' npath_prog$="F:\DEV.GTK\SYS\"   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  23. npath_prefs$=npath_prog$        ! Chemin des preferences
  24. nfile_prefs$="GTKPREFS.INF"     ! Fichier de preferences a charger
  25. key_click%=PEEK(&H484)          ! Sauve l'etat du clavier
  26. '
  27. GOSUB init_variables_prefs
  28. '
  29. IF FN exist(npath_prefs$+nfile_prefs$)
  30.   GOSUB load_prefs2(npath_prefs$+nfile_prefs$,TRUE)
  31. ENDIF
  32. '
  33. ' Initialisations diverses 1
  34. ' --------------------------
  35. xbra_remove$=""                 ! Les adr de tous les vecteurs detournes (adr_vect.l, old_val_vect.l)
  36. GOSUB change_resolution
  37. adr_af_pat%=ADD(XBIOS(2),MUL(SHR(scr_larg%,1),170))     ! Adresse d'affichage des patterns
  38. ON BREAK GOSUB br
  39. GOSUB bee(TRUE)
  40. SPOKE &H484,PEEK(&H484) AND -2
  41. ~XBIOS(&H82,4,2)
  42. ~XBIOS(&H82,5,0)                ! Connecte l'ADC pour la partie enregistrement
  43. GOSUB charge_g_routines
  44. '
  45. GOSUB init_tableaux
  46. '
  47. ' Initialisations diverses 2
  48. ' --------------------------
  49. para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  50. place_totale%=SUB(FRE(0),655360) AND -4                 ! La place qu'il reste pour patterns+samples
  51. garbage%=0
  52. GOSUB charge_r_routines
  53. ARRAYFILL module&(),&H2020              ! Initialise le module
  54. module&(0)=&H4754
  55. module&(1)=ADD(&H4B00,gtk_file_vnum% AND 255)
  56. module&(98)=255                         ! Nbr d'instr
  57. module&(99)=nbr_lines%
  58. module&(100)=nbr_track%
  59. module&(101)=1
  60. module&(102)=0
  61. '
  62. GOSUB init_fonctions_simples
  63. '
  64. GOSUB init_variables_post_prefs
  65. '
  66. HIDEM
  67. SETMOUSE SHL(ADD(divbi&(0,0,0),SHR(SUCC(divbi&(2,0,0)),1)),3),ADD(divbi&(1,0,0),5),0
  68. flag_registered!=TRUE
  69. flag_registered2!=TRUE
  70. ~FRE(0)
  71. ON ERROR GOSUB erreur_gfa_basic
  72. sortie!=FALSE
  73. REPEAT
  74.   CLS
  75.   GOSUB bee(FALSE)
  76.   txt$="**********************************|"
  77.   txt$=txt$+"*                                *|"
  78.   txt$=txt$+"*    Graoumf Module Converter    *|"
  79.   txt$=txt$+"*                                *|"
  80.   txt$=txt$+"*   By Laurent de Soras - 1996   *|"
  81.   txt$=txt$+"*         \\ Freeware //         *|"
  82.   txt$=txt$+"*                                *|"
  83.   txt$=txt$+"**********************************||"
  84.   txt$=txt$+"Please select a module."
  85.   GOSUB dialog("v"+STR$(gtk_version%/10000),txt$,"Select|Quit",MOUSEX,MOUSEY)
  86.   IF bouton%<>1
  87.     next_module$="*.*"
  88.     GOSUB load_module
  89.     CLS
  90.     txt$="New module format?||"
  91.     txt$=txt$+"GT2/GTK: Graoumf Tracker|"
  92.     txt$=txt$+"MOD    : ProTracker|"
  93.     txt$=txt$+"S3M    : Scream Tracker"
  94.     GOSUB dialog("",txt$,"GT2|GTK|MOD|S3M|Cancel",MOUSEX,MOUSEY)
  95.     IF bouton%<>4
  96.       next_module$="*."+MID$("GT2GTKMODS3M",SUCC(MUL(bouton%,3)),3)
  97.       GOSUB save_module
  98.     ENDIF
  99.   ELSE
  100.     sortie!=TRUE
  101.   ENDIF
  102. UNTIL sortie!
  103. GOSUB br
  104. '
  105. '
  106. '
  107. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  108. ' *                                                                          *
  109. ' *                                Procedures                                *
  110. ' *                                                                          *
  111. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  112. '
  113. ' Systeme
  114. ' -------
  115. PROCEDURE rien
  116.   ' rien !!!
  117. RETURN
  118. PROCEDURE br
  119.   HIDEM
  120.   IF r_flag_the_end%>0
  121.     DPOKE r_flag_the_end%,1     ! A pu zik...
  122.   ENDIF
  123.   ~XBIOS(5,L:oldscreenadr%,L:oldscreenadr%,3,oldscreenmode%)
  124.   GOSUB restaure_palette                        ! Restaure la palette
  125.   ~XBIOS(&H82,5,3)
  126.   ~XBIOS(&H82,4,3)
  127.   SPOKE &H484,key_click%        ! Bip bip
  128.   SETCOLOR 0,&HFFF
  129.   SETCOLOR 15,0
  130.   WHILE xbra_remove$<>""        ! On remet les vecteurs a l'envers car il peut y avoir plusieurs fois le meme vecteur detourne
  131.     SLPOKE LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),8))},LONG{ADD(V:xbra_remove$,SUB(LEN(xbra_remove$),4))}
  132.     xbra_remove$=LEFT$(xbra_remove$,SUB(LEN(xbra_remove$),8))
  133.   WEND
  134.   SHOWM
  135.   GOSUB bee(FALSE)
  136.   EDIT
  137. RETURN
  138. PROCEDURE erreur_gfa_basic
  139.   erreur_gfa%=ERR
  140.   flag_erreur_gfa!=TRUE
  141.   PRINT CHR$(7);
  142.   GOSUB aff_message("ERROR : "+ERR$(erreur_gfa%)+" PRESS A KEY.")
  143.   ~GEMDOS(7)
  144.   GOSUB aff_message("NEXT MISTAKE... LAST MISTAKE!")
  145.   flag_erreur_gfa!=FALSE
  146.   RESUME NEXT
  147. RETURN
  148. '
  149. ' Initialisations
  150. ' ---------------
  151. PROCEDURE init_variables_prefs
  152.   '
  153.   ' Variables configurables dans les preferences
  154.   ' --------------------------------------------
  155.   color_pal$="00088FF00F4F800C6FF40F8F888AAACCCFFF889AABCCDFFF" ! La palette (RVB pour 16 couleurs)
  156.   grmode_overscan%=-1           ! -1 = suivant VGA/RGB/TV, 0 = aucun overscan, 1 = force l'overscan
  157.   grmode_80colonnes%=1          ! -1 = laisse, 0 = 40 colonnes, 1 = 80 colonnes
  158.   grmode_entrelace%=-1          ! -1 = laisse, 0 = 200/240 lignes, 1 = 400/480 lignes
  159.   grmode_puissance_plans%=2     ! -1 = laisse, 0 = 2 couleurs, 1 = 4, 2 = 16, 3 = 256, 4 = 65536
  160.   graoumf_logo_color%=4         ! Numero de la couleur du logo (marron)
  161.   npath_sample$=npath_prog$     ! Chemin des samples
  162.   npath_module$=npath_prog$     ! Chemin des modules
  163.   npath_autoload$=npath_prog$   ! Chemin d'autochargement
  164.   npath_div$=npath_prog$        ! Chemin des operations diverses
  165.   nfile_sample$=""              ! Fichier par defaut pour les samples
  166.   nfile_module$=""              ! Fichier par defaut pour les modules
  167.   nfile_autoload$=""            ! Fichier par defaut a autocharger
  168.   nfile_p1$="DUMTRACK.PGT"      ! Nom du fichier contenant les routines diverses
  169.   nfile_p2$="GTPLAY.PGT"        ! Nom du fichier contenant le player
  170.   next_module$="*.GT2"          ! Extension pour les modules
  171.   next_sample$="*.AVR"          ! Extension pour les samples
  172.   nbr_track%=4                  ! Nombre de voies
  173.   nbr_lines%=64                 ! Nombre de lignes (n'a plus d'utilite mais sert encore)
  174.   instr%=1                      ! Instrument courant
  175.   sample%=1                     ! Sample courant
  176.   n_preset%=0                   ! Numero du preset courant
  177.   line_step%=1                  ! Saut de ligne a l'edition
  178.   haut_lig%=99999               ! Nombre de lignes de pattern affichees (99999 car min dans chgt de resol)
  179.   octave%=1                     ! Octave-1 (0-6 -> 1-7)
  180.   default_pattern_high%=64      ! Nombre de lignes a mettre sur un pattern lors de sa creation
  181.   ss_menu%=1                    ! 1 = disk, 2 = tools, 3 = instr, 4 = samples, 5 = enveloppes
  182.   ss_menut%=1                   ! Numero de sous-menu du sous-menu Tools (1, 2 ou 3)
  183.   ss_menui%=1                   ! Numero de sous-menu du sous-menu Instruments
  184.   ss_menus%=1                   ! Numero de sous-menu du sous-menu Samples
  185.   ss_menue%=0                   ! Numero de sous-menu du sous-menu Envelopes (0, 1 ou 2)
  186.   ss_menuc_npan%=0              ! Plage des pannings du sous-menu Control (0 = 1-8, 1 = 9-16, etc...)
  187.   ss_menu2%=1                   ! Numero de sous-menu de l'editeur de sample
  188.   ss_menu2.fl%=1                ! Num ss-menu Flanger (1 ou 2)
  189.   ss_menu2.rev%=1               ! Num ss-menu Reverb (1 ou 2)
  190.   maskblock%=0                  ! 0 = all, 1 = masque
  191.   replaceblock%=0               ! 0 = replace, 1 = transparent
  192.   trackpat%=0                   ! 0 = piste, 1 = pattern, 2 = preset
  193.   bl_flagsong!=FALSE            ! Si l'operation de bloc porte sur toute la song
  194.   bl_maska1$=STRING$(5,0)       ! 0 = n'importe quoi, F = seulement bl_maska2%
  195.   bl_maska2$=STRING$(5,0)       ! Copie si (note AND bl_maska1)=bl_maska2
  196.   bl_maskb1$=STRING$(5,255)     ! F = n'importe quoi, 0 = seulement bl_maskb2%
  197.   bl_maskb2$=STRING$(5,0)       ! Masque de remplacement
  198.   bl_echo_lines%=2              ! Echo toutes les 2 lignes
  199.   bl_echo_feedback%=50          ! 50% de feedback dans l'echo
  200.   bl_echo_fadestep%=&H40        ! - $40 de volume a chaque echo
  201.   bl_echo_cont!=FALSE           ! Ne joue l'echo que de la derniere note
  202.   bl_echo_fdbk!=TRUE            ! True = feedback, False = fade
  203.   ext_note1%=&HFFFFFF           ! F = n'importe quoi, 0 = met qqc
  204.   ext_note2%=0                  ! (Effet AND ext_note1) OR ext_note2
  205.   signe_sam%=0                  ! A ajouter au sample quand sauve/charge
  206.   drumpad_flag%=0               ! 0 = No d'instr, 1 = drumpad
  207.   freq_buffer%=8363             ! Frequence de base du buffer
  208.   snapshot_number%=0            ! Numero du dernier snapshot effectue
  209.   snapshot_format%=1            ! Format du snapshot : 0 = TGA 16 couleurs, 1 = TGA 24 bits
  210.   flag_keep_buffer!=FALSE       ! S'il est mis, les modules detruisent le buffer au minimum
  211.   flag_gt2cnf!=FALSE            ! Sauvegarde de la configuration du GT dans les modules GT2
  212.   flag_backup_modules!=TRUE     ! Sauve les modules avec back up en fichier .BAK
  213.   type_affpiste%=1              ! Affichage des pistes : 0 = note+ins, 1 = normal, 2 = +volume
  214.   env_num&=1                    ! Numero de l'enveloppe editee
  215.   env_sect&=0                   ! Section de l'enveloppe editee : 0 = attack, 1 = key off
  216.   env_copy&=1                   ! Numero de l'enveloppe a copier
  217.   se.mix_master_volume%=16384   ! Master volume (/32768) pour la fonction de mixage
  218.   se.rec_input_device%=0        ! Entree digitalisation : 0 = Falcon ADC, 1 = ST Replay pro
  219.   se.rec_canal%=1               ! Canal d'entree : 1 = Left, 2 = Right, 3 = Left+Right
  220.   se.rec_adc_freq%=1            ! Frequence de digit sur l'ADC du Falcon (freq type CODEC)
  221.   se.rec_ext_freq%=44100        ! Frequence de digit avec un autre ADC (ST Replay pro)
  222.   se.rec_trigger%=6553          ! Impulsion minimum pour commencer la digit /32768
  223.   se.rec_flag_trigger!=FALSE    ! False = trigger off, true = trigger on
  224.   se.freq_nfe%=16390            ! Nouvelle frequence d'echantillonnage
  225.   se.freq_ofn%=131              ! Ancienne frequence de note
  226.   se.freq_nfn%=131              ! Nouvelle frequence de note
  227.   se.freq_iptype%=1             ! Type d'interpolation : 0 = none, 1 = Linear, 2 = 3rd degree
  228.   se.freq_fftdisp%=0            ! 0 = affichage lineaire, 1 = affichage logarithmique
  229.   se.freq_fftwin%=0             ! Fenetrage FFT : 0 = rectangulaire, 1 = Blackman
  230.   se.freq_fftnoteon!=TRUE       ! Affichage ou non de la frequence de la note sur la FFT
  231.   se.freq_fft_cflag!=TRUE       ! Calcule la note du sample avec la FFT
  232.   se.freq_fft_pnbr%=640         ! Nombre de points a calculer pour la FFT
  233.   se.delay_flags%=&X1           ! Chaque bit (0-3) = tap on/off, bit 4 = mute in, bit 5 = multi-tap mode
  234.   se.delay_feedback%=0          ! Feedback du delay (/32768)
  235.   se.delay_timefeed%=375        ! Temps de repetition (ms)
  236.   se.delay_dry%=32768           ! Niveau du son clair (/32768)
  237.   se.delay_wet%=16384           ! Niveau du delay
  238.   se.delay_source%=0            ! Sample source : 0 = buffer, 1-255 = sample
  239.   se.delay_mutein%=500          ! Temps (ms) apres lequel le signal d'entree est coupe
  240.   se.flanger_dry%=16384         ! Niveau dry du flanger (/32768)
  241.   se.flanger_wet%=16384         ! Niveau wet
  242.   se.flanger_lsource%=0         ! Sample source gauche (0 = buffer)
  243.   se.flanger_rsource%=0         ! Sample source droit   " "    "
  244.   se.flanger_time%=1000         ! Delay du flanger (µs) -> 10 ms
  245.   se.flanger_freq%=500          ! Frequence du flanger (mHz)
  246.   se.flanger_depth%=500         ! Profondeur du flanger (µs) -> 6.35 ms
  247.   se.flanger_fdbkll%=9830       ! Feedback L -> L (30%)
  248.   se.flanger_fdbklr%=9830       ! Feedback L -> R (30%)
  249.   se.flanger_fdbkrr%=9830       ! Feedback R -> R (30%)
  250.   se.flanger_fdbkrl%=9830       ! Feedback R -> L (30%)
  251.   se.flanger_phase%=0           ! Phase intitiale (0-4095)
  252.   se.flanger_wave%=0            ! 0 = sin, 1 = carre, 2 = triangle, 3 = scie descendante, 4 = scie montante
  253.   se.flanger_stereo!=FALSE      ! Flag de stereophonie du flanger
  254.   se.rev_aprdelay%=5000         ! Delay de l'All Pass Reverb, en µs. Maxi : 0.25 s
  255.   se.rev_aprg%=22937            ! Feedback de l'All Pass reverb
  256.   se.rev_adlydelay%=26540       ! Delay de l'Alignement delay, en µs. Maxi : 0.25 s
  257.   se.rev_drylevel%=16384        ! Dry level (/32768)
  258.   se.rev_revlevel%=11469        ! Reverb level (/32768)
  259.   se.rev_ereflevel%=4915        ! Early reflection level (/32768)
  260.   se.rev_nbrtaps%=7             ! Nombre de taps pour l'Early reflection
  261.   se.rev_nbrcomb%=4             ! Nombre de comb filters
  262.   se.rev_combgain%=27852        ! Gain general des comb filters (/32768)
  263.   se.rev_source%=0              ! Sample source (0 = buffer)
  264.   se.rev_tappos%=0              ! Position dans la liste des taps de l'ER
  265.   se.rev_combpos%=0             ! Position dans la liste des comb filters
  266.   se.s2d_posstart%=0            ! Position de depart d'enregistrement
  267.   se.s2d_ligstart%=0            ! Ligne de depart d'enregistrement
  268.   se.s2d_posend%=0              ! Position de fin d'enregistrement
  269.   se.s2d_ligend%=0              ! Ligne de fin d'enregistrement
  270.   se.s2d_bits%=1                ! Enregistrement en 1 : 8 bits, 2 : 16 bits
  271.   se.s2d_stereo%=1              ! Enregistrement en 1 : mono, 2 : stereo
  272.   se.s2d_maxsize%=1024          ! Taille maximum (Ko)
  273.   se.s2d_out%=1                 ! Sortie sur 1 : block, 2 : disk
  274.   se.s2d_2ndtime!=FALSE         ! False : normal, True : attend un bouclage avant d'enregistrer
  275.   se.s2d_speed%=7               ! Vitesse d'enregistrement (0 = vite, 7 = lent). Agit sur _prediv%
  276.   se.s2d_prediv%=11             ! Prediviseur pour la vitesse DMA : 1 = 50KHz, 2 = 32 KHz... Depend de _speed%
  277.   se.comp_source%=0             ! Sample source (0 = buffer)
  278.   se.comp_speed%=10000          ! Periode de recalcul du taux de compression (1-99999) (µs)
  279.   se.comp_level%=16384          ! Niveau de compression (vol ideal a atteindre) (/32768)
  280.   se.comp_initvolume%=se.comp_level%    ! Volume presume de depart (/32768)
  281. RETURN
  282. PROCEDURE init_variables_post_prefs
  283.   '
  284.   ' Variables diverses non configurables dans les preferences
  285.   ' ---------------------------------------------------------
  286.   gamme$="C-C#D-D#E-F-F#G-G#A-A#B-"
  287.   gamme2$="C C#D D#E F F#G G#A A#B "
  288.   songpos%=0                    ! Position courante dans la song
  289.   posligne%=0                   ! Ligne courante dans le pattern
  290.   curs_x%=0                     ! 0 = note, 1-2 = instr, 3-6 = effet, 7-8 = volume
  291.   curs_col%=0                   ! Colonne du curseur
  292.   play%=0                       ! 0 = stop, 1 = play song, 2 = play pattern
  293.   edit%=0                       ! 0 = stop, 1 = edit
  294.   flag_nvl_boucle_sample%=0     ! Flag de calcul du nouveau bouclage d'un sample
  295.   num_nvl_boucle_sample%=1      ! Le numero du sample
  296.   bl_start&=0                   ! Ligne de debut du bloc
  297.   bl_end&=0                     ! Ligne de fin du bloc
  298.   bl_pat&=0                     ! Pattern 0
  299.   bl_trk&=0                     ! Voie 1
  300.   sample_list_pos%=1            ! Position dans la liste des samples
  301.   instr_list_pos%=1             ! Position dans la liste des instruments
  302.   song_list_pos%=0              ! Position dans l'arrangement des patterns
  303.   instr_note_pos%=48            ! Position dans la liste des notes
  304.   instr_note_aff%=48            ! Affichage dans la liste des notes
  305.   instr_group!=TRUE             ! On manipule tout un groupe de notes
  306.   mark_1%=0                     ! Marqueur de debut de bloc dans le sample
  307.   mark_len%=FN lon_buffer       ! Marqueur de fin de bloc
  308.   mark_2%=ADD(mark_1%,mark_len%)! Marqueur fantome de fin de bloc
  309.   mark_rep%=0                   ! Marqueur de repetition
  310.   win_pos%=mark_1%              ! Debut de la fenetre de sample
  311.   win_lon%=mark_len%            ! Longueur de la fenetre
  312.   win_bits%=1                   ! Buffer 8 bits
  313.   erreur_gfa%=0                 ! Numero d'erreur de GFA Basic
  314.   treg_str1$=" by Laurent de SORAS 1994/95 - Shareware! Demo version"
  315.   treg_str2$="USER.REG"
  316.   treg_str3$="version to"
  317.   treg_str4$=" registered to "
  318.   treg_str5$=" *** Invalid USER.REG file ***"
  319.   ' flag_registered!=FALSE        ! false = demo, true = normal
  320.   ' flag_registered2!=FALSE       ! false = demo, true = normal
  321.   flag_registered3!=FALSE       ! Indique si on a fait ou pas le 2eme test de protection
  322.   flag_erreur_gfa!=FALSE        ! Indique s'il y a eu une erreur
  323.   flag_blague!=FALSE            ! Ne sort pas de vanne a la Julien Boeuf pour l'instant
  324.   flag_autoload!=FALSE          ! N'est pas en cours d'autochargement
  325.   erreur%=0                     ! Sert localement pour la gestion des erreurs
  326.   periode_blague%=4096          ! Periode moyenne de sortie d'une vanne
  327.   debut_temps%=TIMER            ! Valeur du Timer pour le debut du chrono
  328.   env_posaff&=0                 ! Position de l'affichage de l'enveloppe, en commandes
  329.   env_poscurs&=0                ! Position du curseur dans l'enveloppe, en commandes
  330.   env_codpos&=0                 ! Position dans la liste des codes des enveloppes
  331.   se.sample_editor_flag!=FALSE  ! Indique si on est ou non dans l'editeur de samples
  332.   se.volume_ok!=FALSE           ! Indique si le volume du block est valable
  333.   se.volume_spl%=0              ! Volume du-dit block (/32768)
  334.   se.volume_fade_start%=32768   ! Volume de debut de fade (/32768)
  335.   se.volume_fade_end%=32768     ! Volume de fin de fade (/32768)
  336.   se.flag_best_volume!=FALSE    ! Garde le volume du sample quitte a saturer lors d'un effet (True : cherche le meilleur volume)
  337.   se.mark_selected%=0           ! Bits representant les presets de marques selectionnes
  338.   se.mark_set!=FALSE            ! Icone SET alumee ou pas
  339.   se.freq_fftmin%=20            ! Frequence minimum de la FFT (deja calculee)
  340.   se.freq_fftmax%=SHR(freq_buffer%,1)   ! Frequence maximum de la FFT (deja calculee)
  341.   se.freq_fftech%=freq_buffer%  ! Frequence d'echantillonnage du sample lors de la FFT (deja calculee)
  342.   se.freq_fftlon%=1             ! Nombre de frequences scannees par la FFT (deja calculee)
  343.   se.freq_fft_pstart%=0         ! Frequence de debut de calcul FFT
  344.   se.freq_fft_pend%=SHR(freq_buffer%,1) ! Frequence de fin de calcul FFT
  345. RETURN
  346. PROCEDURE init_tableaux
  347.   '
  348.   ' Dimentionnement des tableaux
  349.   ' ----------------------------
  350.   DIM icone$(4,2)               ! Icones du haut
  351.   DIM drumpad%(31,2)            ! Les No d'instr et les notes/instr du drumpad
  352.   DIM preset&(31,31)            ! Numeros de pistes : (colonne,preset)
  353.   DIM nbr_colonnes%(31)         ! Nombre de colonnes affichees pour chaque preset
  354.   DIM t_note%(53)
  355.   DIM fft&(1023)                ! Resultats de FFT
  356.   DIM divbn$(63,31)             ! Noms de divers boutons des sous-menus
  357.   DIM divbi&(3,63,31)           ! Leurs coordonnees et taille
  358.   DIM help$(23,15)              ! Texte d'aide
  359.   DIM blague$(99)               ! Des blagues
  360.   DIM control_old%(12)          ! Anciennes valeurs pour les updates du sous-menu Control
  361.   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
  362.   DIM se.mark%(1,9)             ! Presets de samples (start/length,numero)
  363.   DIM se.mark$(9)               ! Le nom des presets
  364.   DIM se.delaytime%(3)          ! Temps (ms) de decalage pour chaque tap
  365.   DIM se.delaylevel%(3)         ! Niveau d'entree (/32768) pour chaque tap
  366.   DIM se.rev_tapdelay%(15)      ! Delay des taps de reverb, en µs. Maxi : 0.25 s
  367.   DIM se.rev_taplevel%(15)      ! Level des taps de reverb, (/32768)
  368.   DIM se.rev_combdelay%(15)     ! Delay des comb filters de reverb, en µs. Maxi : 0.25 s
  369.   DIM se.rev_comblpf%(15)       ! Niveau de gain des lpf dans la reverb (/32768)
  370.   DIM se.rev_buffer$(10)        ! Buffers pour la reverb : 3 (early, alignement, APR) + 8 (comb filters)
  371.   DIM env_code$(255)            ! Code des mnemoniques des commandes des enveloppes
  372.   DIM env_conv&(19,2)           ! Conversion (num ds la liste,type) -> Code d'enveloppe
  373.   DIM env_valdef&(19,2)         ! Valeurs par defaut pour les parametres des commandes d'enveloppes
  374.   DIM env_codmax&(2)            ! Nombre maxi de codes pour chaque type d'enveloppe
  375.   '
  376.   ' Remplissage des tableaux
  377.   ' ------------------------
  378.   '
  379.   ' Lecure de l'Help
  380.   '
  381.   RESTORE help_text
  382.   j%=0
  383.   READ a$
  384.   REPEAT
  385.     help$(0,j%)=a$
  386.     FOR i%=1 TO 23
  387.       READ help$(i%,j%)
  388.     NEXT i%
  389.     READ a$
  390.     INC j%
  391.   UNTIL a$="***"
  392.   help_pmax%=PRED(j%)
  393.   '
  394.   ' Initialisation des Marks du S.E.
  395.   '
  396.   FOR i%=0 TO 9
  397.     se.mark%(0,i%)=0
  398.     se.mark%(1,i%)=&HFFFFFE
  399.     se.mark$(i%)=SPACE$(21)
  400.   NEXT i%
  401.   '
  402.   ' Lecture des blagues
  403.   '
  404.   RESTORE textes_blagues
  405.   i%=0
  406.   READ a$
  407.   REPEAT
  408.     flag!=FALSE
  409.     blague$(i%)=""
  410.     REPEAT
  411.       IF flag!
  412.         blague$(i%)=blague$(i%)+"|"
  413.       ENDIF
  414.       blague$(i%)=blague$(i%)+a$
  415.       flag!=TRUE
  416.       READ a$
  417.     UNTIL a$="*"
  418.     INC i%
  419.     READ a$
  420.   UNTIL a$="***"
  421.   blague_nbr%=i%
  422.   '
  423.   ' Initialisation du Drumpad
  424.   '
  425.   FOR i%=0 TO 31
  426.     drumpad%(i%,0)=SUCC(i%)
  427.     drumpad%(i%,1)=ADD(&H3C000000,SHL(SUCC(i%),16))
  428.   NEXT i%
  429.   '
  430.   ' Lecture des icones des sous-menus
  431.   '
  432.   RESTORE icones_disk
  433.   ARRAYFILL divbi&(),-1
  434.   FOR j%=0 TO 26
  435.     READ n%,x%,y%
  436.     FOR i%=0 TO PRED(n%)
  437.       READ a%                   ! Sert a rien pour l'instant
  438.       READ divbn$(i%,j%),divbi&(0,i%,j%),divbi&(1,i%,j%),divbi&(2,i%,j%)
  439.       ADD divbi&(0,i%,j%),x%
  440.       ADD divbi&(1,i%,j%),y%
  441.       READ divbi&(3,i%,j%)
  442.     NEXT i%
  443.   NEXT j%
  444.   ARRAYFILL t_note%(),-1
  445.   '
  446.   ' Lecture des touches
  447.   '
  448.   RESTORE touches_notes
  449.   FOR i%=0 TO 16
  450.     READ a%
  451.     t_note%(a%)=i%
  452.   NEXT i%
  453.   FOR i%=12 TO 32
  454.     READ a%
  455.     t_note%(a%)=i%
  456.   NEXT i%
  457.   '
  458.   ' Lecture des commandes d'enveloppes
  459.   '
  460.   RESTORE enveloppe_coms
  461.   ARRAYFILL env_conv&(),-1
  462.   c%=0
  463.   READ a%,b%
  464.   FOR i%=a% TO PRED(ADD(a%,b%))
  465.     READ env_code$(i%),d%
  466.     env_conv&(c%,0)=i%
  467.     env_conv&(c%,1)=i%
  468.     env_conv&(c%,2)=i%
  469.     env_valdef&(c%,0)=d%
  470.     env_valdef&(c%,1)=d%
  471.     env_valdef&(c%,2)=d%
  472.     INC c%
  473.   NEXT i%
  474.   FOR j%=0 TO 2
  475.     d%=c%
  476.     READ a%,b%
  477.     FOR i%=a% TO PRED(ADD(a%,b%))
  478.       READ env_code$(i%),env_valdef&(d%,j%)
  479.       env_conv&(d%,j%)=i%
  480.       INC d%
  481.     NEXT i%
  482.     env_codmax&(j%)=d%
  483.   NEXT j%
  484.   '
  485.   ' Lecture des delay/levels des taps pour la reverb
  486.   '
  487.   RESTORE rev_tap_delay_level
  488.   ARRAYFILL se.rev_tapdelay%(),0
  489.   ARRAYFILL se.rev_taplevel%(),0
  490.   FOR i%=0 TO 6
  491.     READ a,b
  492.     se.rev_tapdelay%(i%)=a*1000000
  493.     se.rev_taplevel%(i%)=b*32768
  494.   NEXT i%
  495.   '
  496.   ' Lecture des delay/lpfs des comb filters pour la reverb
  497.   '
  498.   RESTORE rev_comb_delay_lpf
  499.   ARRAYFILL se.rev_combdelay%(),70000
  500.   ARRAYFILL se.rev_comblpf%(),0
  501.   FOR i%=0 TO 3
  502.     READ a,b
  503.     se.rev_combdelay%(i%)=a*1000000
  504.     se.rev_comblpf%(i%)=b*32768
  505.   NEXT i%
  506.   '
  507.   ' Init des presets
  508.   '
  509.   FOR j%=0 TO 31
  510.     FOR i%=0 TO 31
  511.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  512.     NEXT i%
  513.   NEXT j%
  514.   ARRAYFILL nbr_colonnes%(),nbr_track%
  515.   '
  516.   ' Initialise les parametres de la fonction Mix du Sample_Editor
  517.   '
  518.   FOR i%=0 TO 4
  519.     se.mix_param%(0,i%)=(i%<2) AND 1      ! +1 : ON, +3 : LOOP
  520.     se.mix_param%(1,i%)=i%                ! Numero de sample
  521.     se.mix_param%(2,i%)=32768             ! Volume de debut
  522.     se.mix_param%(3,i%)=32768             ! Volume de fin
  523.   NEXT i%
  524.   '
  525.   ' Init des fonctions de delay du S.E.
  526.   '
  527.   FOR i%=0 TO 3
  528.     se.delaytime%(i%)=375
  529.     se.delaylevel%(i%)=32768
  530.   NEXT i%
  531. RETURN
  532. PROCEDURE init_fonctions_simples
  533.   '
  534.   ' Definition des fonctions simples
  535.   ' --------------------------------
  536.   DEFFN zone_start=V:zone%(0)
  537.   DEFFN zone_end=ADD(FN zone_start,place_totale%)
  538.   ' Fonctions concernant les samples
  539.   DEFFN adrsamchk(s%)=LONG{ADD(r_adr_sample%,SHL(s%,2))}
  540.   DEFFN lonsamchk(s%)=LONG{ADD(FN adrsamchk(s%),4)}
  541.   DEFFN adresse(s%)=ADD(FN adrsamchk(s%),64)
  542.   DEFFN volume(s%)=CARD{ADD(FN adrsamchk(s%),58)}
  543.   DEFFN finetune(s%)=INT{ADD(FN adrsamchk(s%),60)}
  544.   DEFFN length(s%)=LONG{ADD(FN adrsamchk(s%),46)}
  545.   DEFFN repeat(s%)=LONG{ADD(FN adrsamchk(s%),50)}
  546.   DEFFN replen(s%)=LONG{ADD(FN adrsamchk(s%),54)}
  547.   DEFFN freqech(s%)=CARD{ADD(FN adrsamchk(s%),44)}
  548.   DEFFN resol(s%)=SHR(CARD{ADD(FN adrsamchk(s%),42)},3)
  549.   DEFFN autobal(s%)=CARD{ADD(FN adrsamchk(s%),40)}
  550.   DEFFN total_length=SUB(ADD(FN adrsamchk(255),FN lonsamchk(255)),FN adrsamchk(0))      ! Memoire totale occupee par les samples
  551.   ' Fonctions concernant les pistes
  552.   DEFFN track_onoff(t%)=CARD{ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,t%))}
  553.   DEFFN track_interpol(t%)=CARD{ADD(ADD(r_info_track%,r_interpol_t%),MUL(r_itl%,t%))}
  554.   DEFFN balance(i%)=CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,i%))}       ! Balance (0-31)
  555.   ' Fonctions concernant les instruments
  556.   DEFFN ivolume(i%)=SHR(instrset%(10,i%),16)
  557.   DEFFN ievol(i%)=SHR(instrset%(11,i%),16)
  558.   DEFFN ieton(i%)=instrset%(11,i%) AND &HFFFF
  559.   DEFFN iepan(i%)=SHR(instrset%(12,i%),16)
  560.   DEFFN itransp(i%,j%)=FN sbyte(BYTE{ADD(V:instrset%(15,i%),SUCC(SHL(j%,1)))})  ! Octet signe
  561.   DEFFN isample(i%,j%)=BYTE{ADD(V:instrset%(15,i%),SHL(j%,1))}
  562.   ' Fonctions concernant la song
  563.   DEFFN song_length=module&(101)
  564.   DEFFN song_repeat=module&(102)
  565.   DEFFN mod_tempo=CARD{r_mod_tempo%}
  566.   DEFFN mod_speed=CARD{r_mod_speed%}
  567.   ' Fonctions concernant les patterns
  568.   DEFFN adr_patchunk(i%)=LONG{ADD(r_adr_pattern%,SHL(i%,2))}
  569.   DEFFN lon_patchunk(i%)=LONG{ADD(FN adr_patchunk(i%),4)}
  570.   DEFFN nbr_lines(i%)=CARD{ADD(FN adr_patchunk(i%),28)}
  571.   DEFFN nbr_lines2(i%)=FN nbr_lines(song&(i%))
  572.   DEFFN nbr_lines3=FN nbr_lines(song&(songpos%))
  573.   DEFFN nbr_track(i%)=CARD{ADD(FN adr_patchunk(i%),30)}
  574.   DEFFN nbr_track2(i%)=FN nbr_track(song&(i%))
  575.   DEFFN nbr_track3=FN nbr_track(song&(songpos%))
  576.   ' adresse du pattern a%, ligne b%, piste c%
  577.   DEFFN adr_pat(a%)=ADD(FN adr_patchunk(a%),32)
  578.   DEFFN adr_line(a%,b%)=ADD(FN adr_pat(a%),MUL(MUL(nbr_track%,5),b%))
  579.   DEFFN adr_trk(a%,b%,c%)=ADD(FN adr_line(a%,b%),MUL(c%,5))
  580.   ' adresse du pattern de la position a%, ligne b%, piste c%
  581.   DEFFN adr_spat(a%)=FN adr_pat(song&(a%))
  582.   DEFFN adr_sline(a%,b%)=FN adr_line(song&(a%),b%)
  583.   DEFFN adr_strk(a%,b%,c%)=FN adr_trk(song&(a%),b%,c%)
  584.   ' Fonctions concernant le buffer de sample
  585.   DEFFN adr_buffer=ADD(FN adrsamchk(255),FN lonsamchk(255)) AND -2      ! Adresse de debut du buffer
  586.   DEFFN lon_buffer=SUB(FN zone_end,FN adr_buffer) AND -2                ! Longueur du buffer
  587.   ' Divers
  588.   DEFFN zone_free=FN lon_buffer         ! Memoire libre pour les patterns, enveloppes et samples
  589.   DEFFN zone_free2=SUB(FN zone_end,ADD(FN zone_start,80000))    ! Memoire restante quand le module est minimum (environ)
  590.   DEFFN freq2note(f)=ROUND(LOG(f/440)*12/LOG(2)+69)     ! Conversion frequence -> note (codage MIDI)
  591.   DEFFN note2freq(n)=440*2^((n-69)/12)                  ! Conversion note -> frequence
  592. RETURN
  593. PROCEDURE change_resolution
  594.   ' Passage en resolution 80 colonnes 16 couleurs
  595.   ' ---------------------------------------------
  596.   LOCAL a%,b%,c%,i%,mon%,flag!,a$
  597.   oldscreenadr%=XBIOS(2)
  598.   oldscreenmode%=XBIOS(88,-1)
  599.   mon%=XBIOS(&H59)
  600.   SELECT mon%
  601.   CASE 0        ! Monochrome
  602.     SHOWM
  603.     ALERT 3,"GRAOUMF TRACKER|don't work on|monochrome screen",1,"Fuck!|Chier...|Ahh??",a%
  604.     HIDEM
  605.     GOSUB br
  606.   CASE 2        ! VGA
  607.     IF grmode_overscan%=-1                      !
  608.       grmode_overscan%=0
  609.     ENDIF
  610.   CASE 3        ! TV
  611.     ALERT 2,"GRAOUMF TRACKER :|Overscan ???",1,"Yes|Dnt know|No",a%
  612.     IF a%=3 OR (a%=2 AND RND>0.5)
  613.       grmode_overscan%=0
  614.     ENDIF
  615.   ENDSELECT
  616.   '
  617.   ' Enleve les XBRA genants
  618.   '
  619.   ~FN vire_xbra(&HB4,CVL("ACCx"),&HFFFFFF00,TRUE)       ! Accent 1, 2 et 3 du Feroce Lapin
  620.   ~FN vire_xbra(&H70,CVL("NVDI"),-1,TRUE)               ! NVDI: VBL interrupt
  621.   ~FN vire_xbra(&H84,CVL("NVDI"),-1,TRUE)               ! NVDI: GEMDOS
  622.   ~FN vire_xbra(&H88,CVL("NVDI"),-1,TRUE)               ! NVDI: AES/VDI
  623.   ~FN vire_xbra(&HB4,CVL("NVDI"),-1,TRUE)               ! NVDI: BIOS
  624.   ~FN vire_xbra(&HB8,CVL("NVDI"),-1,TRUE)               ! NVDI: XBIOS
  625.   flag_falcon_screen!=FN vire_xbra(&HB8,CVL("ΣFSC"),-1,FALSE)   ! Teste seulement Falcon Screen
  626.   '
  627.   GOSUB sauve_palette                           ! Sauve la palette
  628.   ON BREAK GOSUB br
  629.   '
  630.   ' Calcule le nouveau mode ecran
  631.   '
  632.   ' 4 plans, 80 colonnes, overscan
  633.   newscreenmode%=oldscreenmode%
  634.   IF grmode_overscan%=0
  635.     newscreenmode%=newscreenmode% AND (NOT &H40)
  636.   ELSE IF grmode_overscan%=1
  637.     newscreenmode%=newscreenmode% OR &H40
  638.   ENDIF
  639.   '
  640.   IF grmode_80colonnes%=0
  641.     newscreenmode%=newscreenmode% AND (NOT &H8)
  642.   ELSE IF grmode_80colonnes%=1
  643.     newscreenmode%=newscreenmode% OR &H8
  644.   ENDIF
  645.   '
  646.   IF grmode_puissance_plans%<>-1
  647.     newscreenmode%=(newscreenmode% AND (NOT &H7)) OR grmode_puissance_plans%
  648.   ENDIF
  649.   '
  650.   IF grmode_entrelace%=0
  651.     IF mon%=2                                   ! VGA
  652.       newscreenmode%=newscreenmode% OR &H100
  653.     ELSE                                        ! RVB/TV
  654.       newscreenmode%=newscreenmode% AND (NOT &H100)
  655.     ENDIF
  656.   ELSE IF grmode_entrelace%=1
  657.     IF mon%=2                                   ! VGA
  658.       newscreenmode%=newscreenmode% AND (NOT &H100)
  659.     ELSE                                        ! RVB/TV
  660.       newscreenmode%=newscreenmode% OR &H100
  661.     ENDIF
  662.   ENDIF
  663.   '
  664.   IF flag_falcon_screen!                        ! Sinon la taille de l'ecran est erronnee
  665.     ~XBIOS(88,newscreenmode%)
  666.   ENDIF
  667.   screensize%=XBIOS(91,newscreenmode%)
  668.   DIM screen%(ADD(SHR(screensize%,2),1000))     ! Memoire de l'ecran (+4000 par sûrete)
  669.   adrlogscr%=ADD(V:screen%(0),255) AND -256     ! Ecran logique a 256 pres
  670.   adrphyscr%=adrlogscr%                         ! Ecran physique
  671.   ~XBIOS(5,L:adrlogscr%,L:adrphyscr%,3,newscreenmode%)
  672.   HIDEM
  673.   a$=MKL$(&H48E77FFE)+MKL$(&HA0002008)+MKL$(&H4CDF7FFE)+MKI$(&H4E75)
  674.   a%=V:a$
  675.   b%=C:a%(0)                                    ! b% = adresse des variables line A
  676.   scr_larg%=DPEEK(SUB(b%,12))                   ! Largeur de l'ecran en pixels
  677.   scr_haut%=DPEEK(SUB(b%,4))                    ! Hauteur de l'ecran en pixels
  678.   IF scr_larg%<640 OR scr_haut%<200             ! Largeur et hauteur minimum
  679.     SHOWM
  680.     ALERT 3,"Resolution insuffisante|640x200 16 couleurs|minimum!",1,"Ah bon|Tant pis",a%
  681.     HIDEM
  682.     GOSUB br
  683.   ENDIF
  684.   scr_ncol%=SHR(scr_larg%,3)                    ! ...et en colonnes de caracteres
  685.   GOSUB chg_type_affpiste(type_affpiste%)       ! Nombre de pistes affichables
  686.   haut_lig%=MIN(DIV(SUB(scr_haut%,180),6) OR 1,haut_lig%)       ! Nombre de lignes de pattern affichees
  687.   GOSUB nouvelle_palette(color_pal$)
  688. RETURN
  689. PROCEDURE charge_g_routines
  690.   ' Charge les routines graphiques (et autres routines)
  691.   ' ---------------------------------------------------
  692.   LOCAL a%
  693.   DIM g_routines%(12288)         ! 48 Ko environ
  694.   BLOAD npath_prog$+nfile_p1$,V:g_routines%(0)
  695.   a%=ADD(V:g_routines%(0),28)
  696.   g_relocation%=a%
  697.   g_fabrique_fonte_ombr%=ADD(a%,4)
  698.   g_cadre_centre%=ADD(a%,8)
  699.   g_dessine_cadre_int%=ADD(a%,12)
  700.   g_dessine_cadre_ext%=ADD(a%,16)
  701.   g_affchaine_trans%=ADD(a%,20)
  702.   g_affchaine_trans_ombr%=ADD(a%,24)
  703.   g_affchaine_notrans%=ADD(a%,28)
  704.   g_affcar8x6%=ADD(a%,32)
  705.   g_affcar8x6_dec%=ADD(a%,36)
  706.   g_affcar8x6_ombr%=ADD(a%,40)
  707.   g_affcar8x6_ombr_dec%=ADD(a%,44)
  708.   g_affcar8x6nt_ombr%=ADD(a%,48)
  709.   g_affiche_pattern%=ADD(a%,52)
  710.   g_affiche_sample%=ADD(a%,56)
  711.   g_convert_nt_2_gtk%=ADD(a%,60)
  712.   g_convert_669_2_gtk%=ADD(a%,64)
  713.   g_convert_mtmv_2_gtk%=ADD(a%,68)
  714.   g_signe_sample%=ADD(a%,72)
  715.   g_stereo_2_mono_one%=ADD(a%,76)
  716.   g_stereo_2_mono_ave%=ADD(a%,80)
  717.   g_convert_mmd1_2_gtk%=ADD(a%,84)
  718.   g_teste_icones%=ADD(a%,88)
  719.   g_convert_s3m_2_gtk%=ADD(a%,92)
  720.   g_intel_16_bits%=ADD(a%,96)
  721.   g_convert_ult_2_gtk%=ADD(a%,100)
  722.   g_convert_gtk_2_gtk_vol%=ADD(a%,104)
  723.   g_clear_note_block%=ADD(a%,108)
  724.   g_paste_note_block%=ADD(a%,112)
  725.   g_atomic_35_unpack%=ADD(a%,116)
  726.   g_swap_note_block%=ADD(a%,120)
  727.   g_transpose_note_block%=ADD(a%,124)
  728.   g_packice_21_unpack%=ADD(a%,128)
  729.   g_invert_memory%=ADD(a%,132)
  730.   g_affiche_marqueur_sample%=ADD(a%,136)
  731.   g_efface_marqueur_sample%=ADD(a%,140)
  732.   g_copy_sample_8_2_16%=ADD(a%,144)
  733.   g_copy_sample_16_2_8%=ADD(a%,148)
  734.   g_convert_gtk_2_nt%=ADD(a%,152)
  735.   g_cherche_volume_sample%=ADD(a%,156)
  736.   g_change_volume_sample%=ADD(a%,160)
  737.   g_mixage_sample%=ADD(a%,164)
  738.   g_affiche_vumetre%=ADD(a%,168)
  739.   g_start_sample_recording%=ADD(a%,172)
  740.   g_cherche_volume_buffer_stereo%=ADD(a%,176)
  741.   g_change_sample_frequency%=ADD(a%,180)
  742.   g_trans_fourier%=ADD(a%,184)
  743.   g_fx_delay%=ADD(a%,188)
  744.   g_convert_dtm_2_gtk%=ADD(a%,192)
  745.   g_dtm_next_chunk%=ADD(a%,196)
  746.   g_convert_gtk_2_s3m%=ADD(a%,200)
  747.   g_convert_ft2_2_gtk%=ADD(a%,204)
  748.   g_absolu_2_delta%=ADD(a%,208)
  749.   g_delta_2_absolu%=ADD(a%,212)
  750.   g_bmove%=ADD(a%,216)
  751.   g_fx_stereo_flanger%=ADD(a%,220)
  752.   g_packice_24_unpack%=ADD(a%,224)
  753.   g_reverberation%=ADD(a%,228)
  754.   g_grise_surface%=ADD(a%,232)
  755.   g_convert_stereo16%=ADD(a%,236)
  756.   g_start_song_recording%=ADD(a%,240)
  757.   g_stop_song_recording%=ADD(a%,244)
  758.   g_fx_compression%=ADD(a%,248)
  759.   g_affiche_image_presentation%=ADD(a%,252)
  760.   a%=V:g_routines%(0)
  761.   g_adrecr%=C:g_relocation%(L:a%)               ! Reloge la routine
  762.   g_linewidth%=ADD(g_adrecr%,4)
  763.   g_flag_sample_rec%=ADD(g_adrecr%,6)
  764.   g_flag_sample_rec2%=ADD(g_adrecr%,8)
  765.   g_adr_record_inf%=LONG{ADD(g_adrecr%,10)}     ! C'est directement l'adresse des infos de digit
  766.   g_rec_sam_buffer%=LONG{ADD(g_adrecr%,14)}     ! C'est directement l'adresse du buffer 1 de digit
  767.   g_sngrec_paramadr%=ADD(g_adrecr%,26)          ! Adresse des parametres de Song-2-Disk (DUMTRACK.PGT)
  768.   LPOKE g_adrecr%,adrlogscr%
  769.   DPOKE g_linewidth%,SHR(scr_larg%,1)
  770.   ~C:g_fabrique_fonte_ombr%(0)                  ! Fabrique la fonte ombree
  771. RETURN
  772. PROCEDURE charge_r_routines
  773.   LOCAL a$,a%,b%,i%
  774.   DIM module&(103)                              ! Le debut du module
  775.   DIM zone%(SHR(place_totale%,2))               ! Les patterns, enveloppes et samples
  776.   DIM song&(255)                                ! La song
  777.   DIM instrset%(78,255)                         ! 256 * 316 octets pour les instruments
  778.   DIM r_mod%(80000)                             ! 320 Ko pour la routine de replay
  779.   DIM pattern_bidon%(20500)                     ! 2 * (32 + 64 * 32 * 5) : Patterns 256 et 257
  780.   DIM module_bidon%(52)
  781.   DIM song_bidon%(127)
  782.   ARRAYFILL song_bidon%(),&H1010101
  783.   song_bidon%(0)=&H1000101
  784.   a$="GTK"+CHR$(gtk_file_vnum%)+SPACE$(192)+MKI$(255)+MKI$(nbr_lines%)+MKI$(nbr_track%)+MKI$(2)+MKI$(1)
  785.   BMOVE V:a$,V:module_bidon%(0),208
  786.   BLOAD npath_prog$+nfile_p2$,V:r_mod%(0)
  787.   a%=V:r_mod%(0)
  788.   b%=ADD(a%,28)
  789.   rr_player_on%=ADD(b%,4)                       ! Routine d'activation du player
  790.   rr_boucle_sample%=ADD(b%,8)                   ! Routine de bouclage d'un instrument
  791.   rr_play_one_sample%=ADD(b%,12)                ! Routine de replay d'un sample sur une voie
  792.   rr_play_one_note%=ADD(b%,16)                  ! Routine de replay d'une note sur une voie
  793.   a%=C:b%(L:a%)                                 ! On reloge
  794.   r_itl%=DPEEK(a%)                              ! Taille des informations concernant 1 voie
  795.   r_nbrvoies%=LPEEK(ADD(a%,2))
  796.   r_master_vol%=LPEEK(ADD(a%,6))
  797.   r_adr_sample%=LPEEK(ADD(a%,10))
  798.   r_adr_module%=LPEEK(ADD(a%,14))
  799.   r_adr_instrset%=LPEEK(ADD(a%,18))
  800.   r_adr_song%=LPEEK(ADD(a%,22))
  801.   r_adr_pattern%=LPEEK(ADD(a%,26))
  802.   r_mod_nbrtrack%=LPEEK(ADD(a%,30))
  803.   r_mod_songlen%=LPEEK(ADD(a%,38))
  804.   r_mod_songrep%=LPEEK(ADD(a%,42))
  805.   r_mod_songpos%=LPEEK(ADD(a%,46))
  806.   r_mod_numpat%=LPEEK(ADD(a%,50))
  807.   r_mod_linepos%=LPEEK(ADD(a%,54))
  808.   r_mod_speed%=LPEEK(ADD(a%,58))
  809.   r_mod_nbrvbl%=LPEEK(ADD(a%,62))
  810.   r_info_track%=LPEEK(ADD(a%,66))
  811.   r_repeatbuffer%=LPEEK(ADD(a%,70))
  812.   r_flag_stop_voices%=LPEEK(ADD(a%,74))
  813.   ' r_adrlodname%=LPEEK(ADD(a%,78))
  814.   r_flag_the_end%=LPEEK(ADD(a%,82))
  815.   r_onoff_t%=LPEEK(ADD(a%,86))
  816.   r_nbits_t%=LPEEK(ADD(a%,90))
  817.   r_fech_t%=LPEEK(ADD(a%,94))
  818.   r_bal_t%=LPEEK(ADD(a%,98))
  819.   r_flag_mt_display%=LPEEK(ADD(a%,102))
  820.   r_vblsize%=LPEEK(ADD(a%,106))
  821.   r_mod_patrep%=LPEEK(ADD(a%,110))
  822.   r_vblnumber%=LPEEK(ADD(a%,114))
  823.   r_adr_replay_frequency%=LONG{ADD(a%,118)}
  824.   r_adr_evol%=LONG{ADD(a%,122)}
  825.   r_adr_eton%=LONG{ADD(a%,126)}
  826.   r_adr_epan%=LONG{ADD(a%,130)}
  827.   r_songrecord_state%=LONG{ADD(a%,134)}
  828.   r_songrecord_routine%=LONG{ADD(a%,138)}
  829.   r_mod_tempo%=LONG{ADD(a%,142)}
  830.   r_interpol_t%=LONG{ADD(a%,146)}
  831.   r_adr_adr_inter%=LONG{ADD(a%,150)}
  832.   r_current_play_mode%=LONG{ADD(a%,154)}
  833.   r_current_edit_mode%=LONG{ADD(a%,158)}
  834.   r_midi_in_gfa_playline%=LONG{ADD(a%,162)}
  835.   r_midi_instr_map%=LONG{ADD(a%,166)}
  836.   r_midi_track_state%=LONG{ADD(a%,170)}
  837.   r_midi_ts_next%=LONG{ADD(a%,174)}
  838.   r_new_note_buffer%=LONG{ADD(a%,178)}
  839.   r_midi_in_noteoff_flag%=LONG{ADD(a%,182)}
  840.   r_midi_in_velo_flag%=LONG{ADD(a%,186)}
  841.   ' Initialisation du player
  842.   garbage%=0
  843.   GOSUB clear_patterns
  844.   garbage%=1
  845.   GOSUB clear_instr
  846.   garbage%=2
  847.   GOSUB clear_samples2
  848.   garbage%=3
  849.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  850.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  851.   b%=V:pattern_bidon%(0)
  852.   FOR i%=256 TO 257
  853.     CARD{ADD(V:a$,8)}=i%
  854.     BMOVE V:a$,b%,LEN(a$)
  855.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  856.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  857.     ADD b%,a%
  858.   NEXT i%
  859.   LPOKE r_adr_module%,V:module_bidon%(0)
  860.   LPOKE r_adr_song%,V:song_bidon%(0)
  861.   LPOKE r_adr_instrset%,V:instrset%(0,0)
  862.   DPOKE r_flag_mt_display%,0
  863.   ~C:rr_player_on%(W:1)                 ! Player active (mais ne joue rien)
  864. RETURN
  865. PROCEDURE teste_enregistrement
  866.   LOCAL a%,b%,a$,c$,i%
  867.   SHOWM
  868.   GOSUB bee(TRUE)
  869.   mes_registred$=treg_str1$
  870.   IF FN exist(npath_prog$+treg_str2$)
  871.     OPEN "i",#0,npath_prog$+treg_str2$
  872.     IF LOF(#0)=1032
  873.       c$=STRING$(1032,0)
  874.       BGET #0,V:c$,1032
  875.       a%=0                              ! Teste la somme de controle
  876.       b%=1
  877.       FOR i%=0 TO 1027
  878.         a%=ADD(a%,MUL(b%,BYTE{ADD(V:c$,i%)} XOR 255))
  879.         INC b%
  880.       NEXT i%
  881.       IF a%=LONG{ADD(V:c$,1028)}
  882.         a%=&H5BA3
  883.         a$=""
  884.         FOR i%=0 TO 510 STEP 2
  885.           b%=CARD{ADD(V:c$,i%)}
  886.           a$=a$+MKI$(b% XOR a%)
  887.           a%=SUB(a%,b%) AND &HFFFF
  888.         NEXT i%
  889.         IF a$=MID$(c$,517,512)
  890.           flag_registered!=TRUE
  891.           a%=ADD(INSTR(c$,treg_str3$),13)
  892.           b%=INSTR(RIGHT$(c$,SUCC(SUB(LEN(c$),a%))),","+CHR$(13))
  893.           mes_registred$=treg_str4$+MID$(c$,a%,PRED(b%))
  894.         ELSE
  895.           GOTO erreur_user.reg
  896.         ENDIF
  897.       ELSE
  898.         GOTO erreur_user.reg
  899.       ENDIF
  900.     ELSE
  901.     erreur_user.reg:
  902.       mes_registred$=treg_str5$
  903.     ENDIF
  904.     CLOSE #0
  905.   ENDIF
  906.   GOSUB bee(FALSE)
  907. RETURN
  908. PROCEDURE sauve_palette
  909.   LOCAL i%
  910.   oldpalette$=""
  911.   FOR i%=&HFFFF9800 TO &HFFFF983C STEP 4
  912.     oldpalette$=oldpalette$+MKL$(LPEEK(i%))
  913.   NEXT i%
  914. RETURN
  915. PROCEDURE nouvelle_palette(pal$)
  916.   LOCAL a%,b%,c%
  917.   FOR a%=0 TO 15
  918.     ' Palette Falcon
  919.     b%=SHL(VAL("&"+MID$(pal$,ADD(MUL(a%,3),3),1)),4)
  920.     ADD b%,SHL(VAL("&"+MID$(pal$,ADD(MUL(a%,3),2),1)),20)
  921.     ADD b%,SHL(VAL("&"+MID$(pal$,SUCC(MUL(a%,3)),1)),28)
  922.     SLPOKE ADD(&HFFFF9800,SHL(a%,2)),b%
  923.     ' Palette ST
  924.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),3),1))
  925.     b%=ADD(SHR(c%,1),SHL(c% AND 1,3))
  926.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),2),1))
  927.     ADD b%,SHL(ADD(SHR(c%,1),SHL(c% AND 1,3)),4)
  928.     c%=VAL("&"+MID$(pal$,ADD(MUL(a%,3),1),1))
  929.     ADD b%,SHL(ADD(SHR(c%,1),SHL(c% AND 1,3)),8)
  930.     SDPOKE ADD(&HFFFF8240,SHL(a%,1)),b%
  931.   NEXT a%
  932. RETURN
  933. PROCEDURE restaure_palette
  934.   LOCAL iiiii%
  935.   FOR iiiii%=0 TO &H3C STEP 4
  936.     SLPOKE ADD(iiiii%,&HFFFF9800),CVL(MID$(oldpalette$,SUCC(iiiii%),4))
  937.   NEXT iiiii%
  938. RETURN
  939. '
  940. '
  941. ' Affichages de base
  942. ' ------------------
  943. PROCEDURE resync_tv_screen
  944.   LOCAL a%
  945.   a%=GEMDOS(7) AND 255
  946.   SELECT a%
  947.   CASE "1"                                  ! Normal non entrelace
  948.     SDPOKE &HFF8282,&H1FF
  949.     SDPOKE &HFF8284,&H160
  950.     SDPOKE &HFF8286,&HA7
  951.     SDPOKE &HFF8288,&H70
  952.     SDPOKE &HFF828A,&H120
  953.     SDPOKE &HFF828C,&H1B4
  954.     SDPOKE &HFF82A2,&H20D
  955.     SDPOKE &HFF82A4,&H201
  956.     SDPOKE &HFF82A6,&H32
  957.     SDPOKE &HFF82A8,&H4D
  958.     SDPOKE &HFF82AA,&H1DD
  959.     SDPOKE &HFF82AC,&H207
  960.   CASE "2"                                  ! Normal entrelace
  961.     SDPOKE &HFF8282,&H1FF
  962.     SDPOKE &HFF8284,&H160
  963.     SDPOKE &HFF8286,&HA7
  964.     SDPOKE &HFF8288,&H70
  965.     SDPOKE &HFF828A,&H120
  966.     SDPOKE &HFF828C,&H1B4
  967.     SDPOKE &HFF82A2,&H20C
  968.     SDPOKE &HFF82A4,&H201
  969.     SDPOKE &HFF82A6,&H32
  970.     SDPOKE &HFF82A8,&H4C
  971.     SDPOKE &HFF82AA,&H1DC
  972.     SDPOKE &HFF82AC,&H207
  973.   CASE "4"                                  ! Overscan non entrelace
  974.     SDPOKE &HFF8282,&H1FF
  975.     SDPOKE &HFF8284,&H180
  976.     SDPOKE &HFF8286,&H7F
  977.     SDPOKE &HFF8288,&H2D
  978.     SDPOKE &HFF828A,&H15D
  979.     SDPOKE &HFF828C,&H1A1
  980.     SDPOKE &HFF82A2,&H20D
  981.     SDPOKE &HFF82A4,&H207
  982.     SDPOKE &HFF82A6,&H25
  983.     SDPOKE &HFF82A8,&H25
  984.     SDPOKE &HFF82AA,&H205
  985.     SDPOKE &HFF82AC,&H207
  986.   CASE "5"                                  ! Overscan entrelace
  987.     SDPOKE &HFF8282,&H1FF
  988.     SDPOKE &HFF8284,&H180
  989.     SDPOKE &HFF8286,&H7F
  990.     SDPOKE &HFF8288,&H2D
  991.     SDPOKE &HFF828A,&H15D
  992.     SDPOKE &HFF828C,&H1A1
  993.     SDPOKE &HFF82A2,&H20C
  994.     SDPOKE &HFF82A4,&H207
  995.     SDPOKE &HFF82A6,&H25
  996.     SDPOKE &HFF82A8,&H24
  997.     SDPOKE &HFF82AA,&H204
  998.     SDPOKE &HFF82AC,&H207
  999.   ENDSELECT
  1000. RETURN
  1001. PROCEDURE cadre_int(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1002.   LOCAL aaaa$,iiii%
  1003.   HIDEM
  1004.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1005.   iiii%=V:aaaa$
  1006.   ~C:g_dessine_cadre_int%(L:iiii%)
  1007. RETURN
  1008. PROCEDURE cadre_ext(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1009.   LOCAL aaaa$,iiii%
  1010.   HIDEM
  1011.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1012.   iiii%=V:aaaa$
  1013.   ~C:g_dessine_cadre_ext%(L:iiii%)
  1014. RETURN
  1015. PROCEDURE cadre_o_int(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1016.   LOCAL aaaa$,iiii%
  1017.   HIDEM
  1018.   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)
  1019.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1020.   iiii%=V:aaaa$
  1021.   ~C:g_dessine_cadre_int%(L:iiii%)
  1022. RETURN
  1023. PROCEDURE cadre_o_ext(aaaa%,bbbb%,cccc%,dddd%,eeee%,ffff%,gggg%,hhhh%)
  1024.   LOCAL aaaa$,iiii%
  1025.   HIDEM
  1026.   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)
  1027.   aaaa$=MKI$(aaaa%)+MKI$(bbbb%)+MKI$(cccc%)+MKI$(dddd%)+CHR$(eeee%)+CHR$(ffff%)+CHR$(gggg%)+CHR$(hhhh%)
  1028.   iiii%=V:aaaa$
  1029.   ~C:g_dessine_cadre_ext%(L:iiii%)
  1030. RETURN
  1031. PROCEDURE cadre_texte(aaaa$,xxxx%,yyyy%,llll%)
  1032.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1033.   HIDEM
  1034.   IF aaaa$=""
  1035.     aaaa$=CHR$(0)
  1036.   ENDIF
  1037.   cccc$=aaaa$+CHR$(0)
  1038.   aaaa%=V:cccc$
  1039.   bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1040.   bbbb%=V:bbbb$
  1041.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1042. RETURN
  1043. PROCEDURE cadre_texte2(aaaa$,xxxx%,yyyy%,llll%,pppp%)
  1044.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1045.   HIDEM
  1046.   IF aaaa$=""
  1047.     aaaa$=CHR$(0)
  1048.   ENDIF
  1049.   cccc$=aaaa$+CHR$(0)
  1050.   aaaa%=V:cccc$
  1051.   IF pppp%=0
  1052.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1053.   ELSE
  1054.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(9)+CHR$(9)+CHR$(8)+CHR$(10)
  1055.   ENDIF
  1056.   bbbb%=V:bbbb$
  1057.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1058. RETURN
  1059. PROCEDURE cadre_texte3(aaaa$,xxxx%,yyyy%,llll%,hhhh%,pppp%)
  1060.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1061.   HIDEM
  1062.   IF aaaa$=""
  1063.     aaaa$=CHR$(0)
  1064.   ENDIF
  1065.   cccc$=aaaa$+CHR$(0)
  1066.   aaaa%=V:cccc$
  1067.   IF pppp%=0
  1068.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(9)+CHR$(9)+CHR$(10)+CHR$(8)
  1069.   ELSE
  1070.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(9)+CHR$(9)+CHR$(8)+CHR$(10)
  1071.   ENDIF
  1072.   bbbb%=V:bbbb$
  1073.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1074. RETURN
  1075. PROCEDURE cadre_texte_b(aaaa$,xxxx%,yyyy%,llll%)
  1076.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1077.   HIDEM
  1078.   IF aaaa$=""
  1079.     aaaa$=CHR$(0)
  1080.   ENDIF
  1081.   cccc$=aaaa$+CHR$(0)
  1082.   aaaa%=V:cccc$
  1083.   bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1084.   bbbb%=V:bbbb$
  1085.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1086. RETURN
  1087. PROCEDURE cadre_texte2_b(aaaa$,xxxx%,yyyy%,llll%,pppp%)
  1088.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1089.   HIDEM
  1090.   IF aaaa$=""
  1091.     aaaa$=CHR$(0)
  1092.   ENDIF
  1093.   cccc$=aaaa$+CHR$(0)
  1094.   aaaa%=V:cccc$
  1095.   IF pppp%=0
  1096.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1097.   ELSE
  1098.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(9)+CHR$(13)+CHR$(13)+CHR$(12)+CHR$(14)
  1099.   ENDIF
  1100.   bbbb%=V:bbbb$
  1101.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1102. RETURN
  1103. PROCEDURE cadre_texte3_b(aaaa$,xxxx%,yyyy%,llll%,hhhh%,pppp%)
  1104.   LOCAL aaaa%,bbbb%,bbbb$,cccc$
  1105.   HIDEM
  1106.   IF aaaa$=""
  1107.     aaaa$=CHR$(0)
  1108.   ENDIF
  1109.   cccc$=aaaa$+CHR$(0)
  1110.   aaaa%=V:cccc$
  1111.   IF pppp%=0
  1112.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(13)+CHR$(13)+CHR$(14)+CHR$(12)
  1113.   ELSE
  1114.     bbbb$=MKI$(xxxx%)+MKI$(yyyy%)+MKI$(0)+MKI$(hhhh%)+CHR$(13)+CHR$(13)+CHR$(12)+CHR$(14)
  1115.   ENDIF
  1116.   bbbb%=V:bbbb$
  1117.   ~C:g_cadre_centre%(L:bbbb%,L:aaaa%,W:llll%)
  1118. RETURN
  1119. PROCEDURE grise_surface(xxxx%,yyyy%,llll%,hhhh%)
  1120.   ~C:g_grise_surface%(W:xxxx%,W:yyyy%,W:llll%,W:hhhh%)
  1121. RETURN
  1122. PROCEDURE grise_icone(nnn%,ttt%,xxxd%,yyyd%)
  1123.   GOSUB grise_surface(ADD(divbi&(0,nnn%,ttt%),xxxd%),ADD(divbi&(1,nnn%,ttt%),yyyd%),divbi&(2,nnn%,ttt%),divbi&(3,nnn%,ttt%))
  1124. RETURN
  1125. PROCEDURE affchaine_notrans(aaaa$,xxxx%,yyyy%,cccc%)
  1126.   LOCAL aaaa%,bbbb$
  1127.   IF aaaa$<>""
  1128.     HIDEM
  1129.     bbbb$=aaaa$+CHR$(0)
  1130.     aaaa%=V:bbbb$
  1131.     ~C:g_affchaine_notrans%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%)
  1132.   ENDIF
  1133. RETURN
  1134. PROCEDURE affchaine_trans(aaaa$,xxxx%,yyyy%,cccc%)
  1135.   LOCAL aaaa%,bbbb$
  1136.   IF aaaa$<>""
  1137.     HIDEM
  1138.     bbbb$=aaaa$+CHR$(0)
  1139.     aaaa%=V:bbbb$
  1140.     ~C:g_affchaine_trans%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%)
  1141.   ENDIF
  1142. RETURN
  1143. PROCEDURE affchaine_trans_ombr(aaaa$,xxxx%,yyyy%,cccc%,cccc2%)
  1144.   LOCAL aaaa%,bbbb$
  1145.   IF aaaa$<>""
  1146.     HIDEM
  1147.     bbbb$=aaaa$+CHR$(0)
  1148.     aaaa%=V:bbbb$
  1149.     ~C:g_affchaine_trans_ombr%(L:aaaa%,W:yyyy%,W:xxxx%,W:cccc%,W:cccc2%)
  1150.   ENDIF
  1151. RETURN
  1152. PROCEDURE affchaine_tronque(aaa$,xxx%,yyy%,ccc%,lll%)
  1153.   IF LEN(aaa$)>lll%
  1154.     aaa$=LEFT$(aaa$,PRED(lll%))+CHR$(8)
  1155.   ENDIF
  1156.   GOSUB affchaine_notrans(aaa$,xxx%,yyy%,ccc%)
  1157. RETURN
  1158. PROCEDURE affiche_icone(nnn%,ttt%,xxxd%,yyyd%,ccc%)
  1159.   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%)
  1160. RETURN
  1161. PROCEDURE affiche_icone_b(nnn%,ttt%,xxxd%,yyyd%,ccc%)
  1162.   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%)
  1163. RETURN
  1164. PROCEDURE affiche_bloc_icones(dd%,nn%,tt%,xxd%,yyd%)
  1165.   LOCAL ii%
  1166.   FOR ii%=dd% TO ADD(dd%,PRED(nn%))
  1167.     GOSUB affiche_icone(ii%,tt%,xxd%,yyd%,0)
  1168.   NEXT ii%
  1169. RETURN
  1170. PROCEDURE affiche_bloc_icones_b(dd%,nn%,tt%,xxd%,yyd%)
  1171.   LOCAL ii%
  1172.   FOR ii%=dd% TO ADD(dd%,PRED(nn%))
  1173.     GOSUB affiche_icone_b(ii%,tt%,xxd%,yyd%,0)
  1174.   NEXT ii%
  1175. RETURN
  1176. PROCEDURE affiche_pattern(pat%,lig%,pre%)
  1177.   LOCAL a%,b%,xm%,ym%,km%
  1178.   a%=V:para_affiche_pattern$
  1179.   BMOVE V:preset&(0,pre%),ADD(a%,8),64
  1180.   CARD{ADD(a%,2)}=FN nbr_lines(pat%)
  1181.   CARD{ADD(a%,4)}=MIN(nbr_colonnes%(pre%),nbr_col%)
  1182.   b%=FN adr_pat(pat%)
  1183.   MOUSE xm%,ym%,km%
  1184.   IF xm%>23 AND ym%>153 AND ym%<ADD(170,MUL(haut_lig%,6))
  1185.     HIDEM
  1186.   ELSE
  1187.     SHOWM
  1188.   ENDIF
  1189.   ~C:g_affiche_pattern%(W:lig%,L:a%,L:b%,L:adr_af_pat%,W:curs_col%,W:curs_x%)
  1190.   SHOWM
  1191. RETURN
  1192. PROCEDURE affiche_c_pattern
  1193.   LOCAL a%,b%,xm%,ym%,km%
  1194.   a%=V:para_affiche_pattern$
  1195.   BMOVE V:preset&(0,n_preset%),ADD(a%,8),64
  1196.   CARD{ADD(a%,2)}=FN nbr_lines2(songpos%)
  1197.   CARD{ADD(a%,4)}=MIN(nbr_colonnes%(n_preset%),nbr_col%)
  1198.   b%=FN adr_pat(song&(songpos%))
  1199.   MOUSE xm%,ym%,km%
  1200.   IF xm%>23 AND ym%>153 AND ym%<ADD(170,MUL(haut_lig%,6))
  1201.     HIDEM
  1202.   ELSE
  1203.     SHOWM
  1204.   ENDIF
  1205.   ~C:g_affiche_pattern%(W:posligne%,L:a%,L:b%,L:adr_af_pat%,W:curs_col%,W:curs_x%)
  1206.   SHOWM
  1207. RETURN
  1208. '
  1209. ' Affichages divers
  1210. ' -----------------
  1211. PROCEDURE affiche_info_sample
  1212.   LOCAL a%
  1213.   IF NOT se.sample_editor_flag!
  1214.     HIDEM
  1215.     GOSUB affchaine_notrans(" "+HEX$(instr%,2),ADD(divbi&(0,12,16),11),ADD(divbi&(1,12,16),2),1)
  1216.     GOSUB affchaine_notrans(" "+HEX$(sample%,2),ADD(divbi&(0,15,16),11),ADD(divbi&(1,15,16),2),1)
  1217.     GOSUB affchaine_notrans(FN instrname$(instr%),ADD(divbi&(0,22,16),9),ADD(divbi&(1,22,16),2),1)
  1218.   ENDIF
  1219.   IF ss_menu%=3
  1220.     GOSUB affiche_icones_instrb
  1221.   ELSE IF ss_menu%=4
  1222.     GOSUB affiche_icones_sampleb
  1223.   ENDIF
  1224. RETURN
  1225. PROCEDURE affiche_info_song
  1226.   LOCAL a$
  1227.   IF NOT se.sample_editor_flag!
  1228.     HIDEM
  1229.     GOSUB affchaine_notrans(" "+HEX$(songpos%,2),ADD(divbi&(0,0,16),11),ADD(divbi&(1,0,16),2),1)
  1230.     GOSUB affchaine_notrans(" "+HEX$(song&(songpos%),2),ADD(divbi&(0,3,16),11),ADD(divbi&(1,3,16),2),1)
  1231.     IF module&(101)<256
  1232.       GOSUB affchaine_notrans(" "+HEX$(module&(101),2),ADD(divbi&(0,6,16),11),ADD(divbi&(1,6,16),2),1)
  1233.     ELSE
  1234.       GOSUB affchaine_notrans(HEX$(module&(101),3),ADD(divbi&(0,6,16),11),ADD(divbi&(1,6,16),2),1)
  1235.     ENDIF
  1236.     GOSUB affchaine_notrans(" "+HEX$(module&(102),2),ADD(divbi&(0,9,16),11),ADD(divbi&(1,9,16),2),1)
  1237.     GOSUB affchaine_notrans(FN songname$,ADD(divbi&(0,21,16),9),ADD(divbi&(1,21,16),2),1)
  1238.     GOSUB affchaine_notrans(STR$(nbr_track%,2),ADD(divbi&(0,23,16),7),ADD(divbi&(1,23,16),2),1)
  1239.     GOSUB affchaine_notrans(STR$(FN nbr_lines3,3),ADD(divbi&(0,24,16),6),ADD(divbi&(1,24,16),2),1)
  1240.     posligne%=MAX(MIN(posligne%,PRED(FN nbr_lines3)),0)
  1241.     IF line_step%<0
  1242.       a$="-"+HEX$(ABS(line_step%),1)
  1243.     ELSE
  1244.       a$=HEX$(line_step%,2)
  1245.     ENDIF
  1246.     GOSUB affchaine_notrans(a$,ADD(divbi&(0,18,16),5),ADD(divbi&(1,18,16),2),1)
  1247.     IF ss_menu%=2 AND ss_menut%=3
  1248.       GOSUB affiche_icones_toolsb3
  1249.     ENDIF
  1250.   ENDIF
  1251. RETURN
  1252. PROCEDURE affiche_info_preset
  1253.   LOCAL iii%,aaa%
  1254.   SELECT type_affpiste%
  1255.   CASE 0
  1256.     aaa%=6
  1257.   CASE 2
  1258.     aaa%=12
  1259.   DEFAULT
  1260.     aaa%=10
  1261.   ENDSELECT
  1262.   HIDEM
  1263.   GOSUB cadre_texte2(STR$(SUCC(n_preset%)),ADD(MUL(n_preset%,2),8),130,1,1)
  1264.   FOR iii%=0 TO PRED(nbr_col%)
  1265.     IF iii%<nbr_colonnes%(n_preset%)
  1266.       GOSUB affchaine_notrans(STR$(SUCC(preset&(iii%,n_preset%)),2),ADD(MUL(iii%,aaa%),6),162,1)
  1267.       IF FN track_onoff(preset&(iii%,n_preset%))<>0
  1268.         GOSUB affchaine_notrans(CHR$(6),ADD(MUL(iii%,aaa%),5),162,1)
  1269.       ELSE
  1270.         GOSUB affchaine_notrans(CHR$(5),ADD(MUL(iii%,aaa%),5),162,1)
  1271.       ENDIF
  1272.     ELSE
  1273.       GOSUB affchaine_notrans("   ",ADD(MUL(iii%,aaa%),5),162,1)
  1274.       GOSUB cadre_ext(ADD(MUL(iii%,aaa%),4),170,SUB(aaa%,2),PRED(MUL(haut_lig%,6)),0,9,8,10)
  1275.     ENDIF
  1276.   NEXT iii%
  1277.   GOSUB affiche_c_pattern
  1278. RETURN
  1279. PROCEDURE affiche_barre_info
  1280.   GOSUB cadre_int(1,140,77,7,9,9,9,9)  ! Efface ce qu'il y avait avant
  1281.   GOSUB affchaine_trans("OCT",2,142,10)
  1282.   GOSUB affchaine_trans(STR$(SUCC(octave%),1),10,142,8)
  1283.   GOSUB affchaine_trans("BLK",20,142,10)
  1284.   GOSUB affchaine_trans("/  :  -",32,142,8)
  1285.   GOSUB affchaine_trans(STR$(SUCC(bl_trk&),2),28,142,8)
  1286.   GOSUB affchaine_trans(HEX$(bl_pat&,2),34,142,8)
  1287.   GOSUB affchaine_trans(HEX$(bl_start&,2),40,142,8)
  1288.   GOSUB affchaine_trans(HEX$(bl_end&,2),46,142,8)
  1289.   GOSUB affchaine_trans("NUMPAD",58,142,10)
  1290.   IF drumpad_flag%=0
  1291.     GOSUB affchaine_trans("SAMPLES",72,142,8)
  1292.   ELSE
  1293.     GOSUB affchaine_trans("DRUMKIT",72,142,8)
  1294.   ENDIF
  1295.   GOSUB affchaine_trans("FREE       Kb",94,142,10)
  1296.   GOSUB affchaine_trans(STR$(SHR(FN zone_free,10),5),104,142,8)
  1297. RETURN
  1298. PROCEDURE aff_message(a$)
  1299.   GOSUB cadre_int(0,149,PRED(scr_ncol%),8,13,13,12,14)  ! Efface ce qu'il y avait avant
  1300.   GOSUB affchaine_trans(LEFT$(a$,MIN(LEN(a$),scr_ncol%)),2,151,12)
  1301. RETURN
  1302. PROCEDURE affiche_temps
  1303.   LOCAL a%,m$,s$
  1304.   a%=DIV(SUB(TIMER,debut_temps%),200)
  1305.   s$=STR$(a% MOD 60)
  1306.   m$=STR$(DIV(a%,60) MOD 60)
  1307.   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)
  1308. RETURN
  1309. PROCEDURE aff_ps_pp_e
  1310.   HIDEM
  1311.   GOSUB affiche_icone(0,24,0,0,play%=1)
  1312.   GOSUB affiche_icone(5,24,0,0,play%=2)
  1313.   GOSUB affiche_icone(1,24,0,0,edit%)
  1314.   SHOWM
  1315. RETURN
  1316. PROCEDURE affiche_please_register
  1317.   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)
  1318. RETURN
  1319. '
  1320. ' Chargements/sauvegardes/disk
  1321. ' ----------------------------
  1322. PROCEDURE save_sample
  1323.   LOCAL a$
  1324.   IF flag_registered!
  1325.     IF km%=2 AND nfile_sample$<>""
  1326.       a$=npath_sample$+nfile_sample$
  1327.     ELSE
  1328.       CLS
  1329.       GOSUB cadre_texte("SAVE SAMPLE",0,0,PRED(scr_ncol%))
  1330.       FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  1331.     ENDIF
  1332.     IF a$<>""
  1333.       CLS
  1334.       GOSUB cadre_texte("WAITING : SAVING SAMPLE "+a$+"...",0,0,PRED(scr_ncol%))
  1335.       GOSUB save_sample2
  1336.       IF erreur%=0
  1337.         GOSUB separe_nom_chemin(a$)
  1338.         nfile_sample$=nfile_$
  1339.         npath_sample$=npath_$
  1340.       ENDIF
  1341.     ENDIF
  1342.   ELSE
  1343.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  1344.   ENDIF
  1345.   GOSUB affiche_panneau_principal
  1346. RETURN
  1347. PROCEDURE save_sample2
  1348.   ' Fournir a$ nom du sample, sample% numero du sample
  1349.   LOCAL a%,b$,i%,j%,k%,lon%,signe%
  1350.   erreur%=0
  1351.   warning%=0
  1352.   GOSUB bee(TRUE)
  1353.   lon%=FN length(sample%)
  1354.   IF lon%>0
  1355.     OPEN "o",#0,a$
  1356.     SEEK #0,0
  1357.     IF next_sample$="*.SPL"
  1358.       signe%=128
  1359.     ELSE
  1360.       signe%=signe_sam%
  1361.     ENDIF
  1362.     IF next_sample$="*.AVR"
  1363.       ' Entete du format .AVR
  1364.       GOSUB separe_nom_chemin(a$)       ! Recupere le nom
  1365.       b$=LEFT$(nfile_$,8)
  1366.       IF INSTR(b$,".")>1
  1367.         b$=LEFT$(b$,PRED(INSTR(b$,".")))
  1368.         IF LEN(b$)<8
  1369.           b$=b$+STRING$(SUB(8,LEN(b$)),0)
  1370.         ENDIF
  1371.       ENDIF
  1372.       b$="2BIT"+b$+MKI$(0)+MKI$(SHL(FN resol(sample%),3))+MKI$(signe%=0)
  1373.       IF FN repeat(sample%)>0 OR FN replen(sample%)>2
  1374.         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%)))
  1375.       ELSE
  1376.         b$=b$+MKI$(0)+MKI$(-1)+MKI$(&HFF00)+MKI$(FN freqech(sample%))+MKL$(DIV(lon%,FN resol(sample%)))+MKL$(0)+MKL$(0)
  1377.       ENDIF
  1378.       b$=b$+"This sample passed through GRAOUMF TRACKER (c) Laurent de Soras"
  1379.       b$=b$+STRING$(SUB(128,LEN(b$)),0)
  1380.       BPUT #0,V:b$,128
  1381.     ENDIF
  1382.     ' Sauvegarde des donnees du sample
  1383.     b$=STRING$(1024,0)  ! Buffer de signature
  1384.     i%=0
  1385.     k%=FN resol(sample%)
  1386.     REPEAT
  1387.       j%=MIN(1024,SUB(lon%,i%))
  1388.       BMOVE ADD(FN adresse(sample%),i%),V:b$,j%*(-flag_registered2!)    ! *** 2eme protection
  1389.       IF signe%<>0
  1390.         a%=V:b$
  1391.         ~C:g_signe_sample%(L:a%,L:j%,W:k%)
  1392.       ENDIF
  1393.       BPUT #0,V:b$,j%
  1394.       ADD i%,j%
  1395.     UNTIL i%=>lon%
  1396.     CLOSE #0
  1397.   ENDIF
  1398. RETURN
  1399. PROCEDURE load_sample
  1400.   LOCAL a$
  1401.   IF km%=2 AND nfile_sample$<>""
  1402.     a$=npath_sample$+nfile_sample$
  1403.   ELSE
  1404.     CLS
  1405.     GOSUB cadre_texte("LOAD SAMPLE",0,0,PRED(scr_ncol%))
  1406.     FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  1407.   ENDIF
  1408.   IF a$<>""
  1409.     IF FN exist(a$)
  1410.       CLS
  1411.       GOSUB cadre_texte("WAITING : LOADING SAMPLE "+a$+"...",0,0,PRED(scr_ncol%))
  1412.       GOSUB load_sample2
  1413.       IF erreur%=0
  1414.         GOSUB separe_nom_chemin(a$)
  1415.         nfile_sample$=nfile_$
  1416.         npath_sample$=npath_$
  1417.       ENDIF
  1418.     ENDIF
  1419.   ENDIF
  1420.   GOSUB bee(FALSE)
  1421.   IF erreur%=1
  1422.     GOSUB dialog("FILE","Error:|Not enough memory|to load this sample!","Cancel",MOUSEX,MOUSEY)
  1423.   ENDIF
  1424.   GOSUB affiche_panneau_principal
  1425. RETURN
  1426. PROCEDURE load_sample2
  1427.   ' Fournir a$ nom du sample, sample% numero du sample
  1428.   LOCAL adsam%,freq%,lonfic%,lonsam%,res%,signe%
  1429.   LOCAL buffer$
  1430.   ~FRE(0)
  1431.   GOSUB bee(TRUE)
  1432.   GOSUB chg_taille_sample(sample%,0)
  1433.   erreur%=0
  1434.   warning%=0
  1435.   res%=FN resol(sample%)
  1436.   freq%=FN freqech(sample%)
  1437.   signe%=signe_sam%
  1438.   buffer$=STRING$(128,0)
  1439.   OPEN "i",#0,a$
  1440.   lonfic%=LOF(#0)                               ! Taille du fichier
  1441.   BGET #0,V:buffer$,MIN(LOF(#0),128)
  1442.   ' Compacte ? Si, oui, cherche la vraie longueur
  1443.   IF LEFT$(buffer$,4)="ATM5"
  1444.     lonsam%=LONG{ADD(V:buffer$,4)}
  1445.   ELSE IF LEFT$(buffer$,4)="Ice!"
  1446.     lonsam%=LONG{ADD(V:buffer$,4)}
  1447.   ELSE IF LEFT$(buffer$,4)="ICE!"
  1448.     lonsam%=LONG{ADD(V:buffer$,8)}
  1449.   ELSE
  1450.     lonsam%=LOF(#0)
  1451.   ENDIF
  1452.   IF MAX(lonsam%,lonfic%)<FN zone_free          ! Assez de memoire pour charger ?
  1453.     GOSUB chg_taille_sample(sample%,SUCC(MAX(lonsam%,lonfic%)) AND -2)
  1454.     adsam%=FN adresse(sample%)
  1455.     SEEK #0,0
  1456.     BGET #0,adsam%,lonfic%
  1457.     ~C:g_atomic_35_unpack%(L:adsam%)
  1458.     ~C:g_packice_21_unpack%(L:adsam%)
  1459.     ~C:g_packice_24_unpack%(L:adsam%)
  1460.     IF LONG{adsam%}=&H32424954                  ! '2BIT' : Format AVR
  1461.       GOSUB load_sample_avr
  1462.     ELSE IF LONG{adsam%}=&H52494646             ! 'RIFF' : Format WAV
  1463.       GOSUB load_sample_wav
  1464.     ELSE                                        ! Format inconnu : donnees brutes
  1465.       GOSUB load_sample_raw
  1466.     ENDIF
  1467.   ELSE
  1468.     erreur%=1                                   ! Pas assez de memoire pour charger le fichier
  1469.   ENDIF
  1470.   CLOSE #0
  1471.   IF erreur%=0
  1472.     ~C:rr_boucle_sample%(W:sample%)
  1473.   ELSE
  1474.     GOSUB kill_sample(sample%)
  1475.   ENDIF
  1476.   ~FRE(0)
  1477. RETURN
  1478. PROCEDURE load_sample_raw
  1479.   ' Besoin de : a$, freq%, res%, signe%, adsam% et lonsam% (longueur du fichier et non du sample)
  1480.   LOCAL len%
  1481.   LOCAL b$
  1482.   len%=lonsam% AND -2
  1483.   GOSUB chg_sam_balance(sample%,&HFFFF)
  1484.   GOSUB chg_sam_volume(sample%,&H100)
  1485.   GOSUB chg_sam_finetune(sample%,0)
  1486.   GOSUB chg_sam_length(sample%,len%)
  1487.   GOSUB chg_sam_repeat(sample%,0)
  1488.   GOSUB chg_sam_replen(sample%,2)
  1489.   IF len%>0
  1490.     a%=FN adresse(sample%)
  1491.     IF signe%<>0 OR next_sample$="*.SPL"
  1492.       ~C:g_signe_sample%(L:a%,L:len%,W:res%)            ! Signature
  1493.     ENDIF
  1494.   ENDIF
  1495.   GOSUB chg_taille_sample(sample%,len%)
  1496.   b$=a$
  1497.   WHILE INSTR(b$,"\")>0
  1498.     a%=INSTR(b$,"\")
  1499.     b$=RIGHT$(b$,SUB(LEN(b$),a%))
  1500.   WEND
  1501.   GOSUB chg_samplename(b$,sample%)
  1502.   ~FRE(0)
  1503. RETURN
  1504. PROCEDURE load_sample_avr
  1505.   ' Besoin de : a$, freq%, res%, signe%, adsam% et lonsam% (longueur du fichier et non du sample)
  1506.   LOCAL a%,b%,c%,len%,loop%,rep_avr%,rep2_avr%,stereo%
  1507.   LOCAL b$
  1508.   res%=MAX(MIN(SHR(CARD{ADD(adsam%,14)},3),2),1)        ! Nbr d'octets/sample
  1509.   freq%=MAX(CARD{ADD(adsam%,24)},2000)                  ! Frequence d'echantillonnage du sample
  1510.   signe%=128
  1511.   IF CARD{ADD(adsam%,16)}<>0
  1512.     signe%=0
  1513.   ENDIF
  1514.   len%=MAX(0,MUL(LONG{ADD(adsam%,&H1A)},res%) AND -2)
  1515.   rep_avr%=MUL(LONG{ADD(adsam%,&H1E)},res%) AND -2
  1516.   rep2_avr%=MUL(LONG{ADD(adsam%,&H22)},res%) AND -2
  1517.   loop%=CARD{ADD(adsam%,18)}
  1518.   stereo%=CARD{ADD(adsam%,12)}
  1519.   IF stereo%<>0                                         ! Stereo
  1520.     GOSUB dialog("STEREO","Sample stereo.|What must I load ?","Left|Right|Mix|Cancel",MOUSEX,MOUSEY)
  1521.     IF bouton%=3                                        ! Cancel
  1522.       GOTO fin_load_sample2
  1523.     ENDIF
  1524.     GOSUB bee(TRUE)
  1525.     a%=ADD(adsam%,128)
  1526.     b%=a%
  1527.     IF bouton%<2                                        ! 1 seul canal
  1528.       ADD b%,MUL(res%,bouton%)
  1529.       ~C:g_stereo_2_mono_one%(L:b%,L:a%,L:len%,W:res%)
  1530.     ELSE                                                ! Mixage des deux canaux
  1531.       ~C:g_stereo_2_mono_ave%(L:b%,L:a%,L:len%,W:res%)
  1532.     ENDIF
  1533.   ENDIF
  1534.   a%=FN adresse(sample%)
  1535.   BMOVE ADD(adsam%,128),a%,len%
  1536.   GOSUB chg_taille_sample(sample%,len%)
  1537.   a%=FN adresse(sample%)
  1538.   IF signe%<>0
  1539.     ~C:g_signe_sample%(L:a%,L:len%,W:res%)          ! Signature
  1540.   ENDIF
  1541.   rep_avr%=MAX(0,MIN(SUB(len%,2),rep_avr%))
  1542.   GOSUB chg_sam_balance(sample%,&HFFFF)
  1543.   GOSUB chg_sam_nbits(sample%,res%)
  1544.   GOSUB chg_sam_freq(sample%,freq%)
  1545.   GOSUB chg_sam_volume(sample%,&H100)
  1546.   GOSUB chg_sam_finetune(sample%,0)
  1547.   GOSUB chg_sam_length(sample%,len%)
  1548.   IF loop%=0                                          ! Non boucle
  1549.     GOSUB chg_sam_repeat(sample%,0)
  1550.     GOSUB chg_sam_replen(sample%,2)
  1551.   ELSE                                                ! Boucle
  1552.     GOSUB chg_sam_repeat(sample%,rep_avr%)
  1553.     GOSUB chg_sam_replen(sample%,MAX(SUB(rep2_avr%,rep_avr%),2))
  1554.   ENDIF
  1555.   ' Le nom
  1556.   b$=a$
  1557.   WHILE INSTR(b$,"\")>0
  1558.     a%=INSTR(b$,"\")
  1559.     b$=RIGHT$(b$,SUB(LEN(b$),a%))
  1560.   WEND
  1561.   GOSUB chg_samplename(b$,sample%)
  1562.   ~FRE(0)
  1563. RETURN
  1564. PROCEDURE load_sample_wav
  1565.   ' Besoin de : a$, freq%, res%, signe%, adsam% et lonsam% (longueur du fichier et non du sample)
  1566.   ' Ne tient pas compte de la stereo!
  1567.   LOCAL a%,len%
  1568.   LOCAL b$
  1569.   GOSUB intel_l(ADD(adsam%,24))
  1570.   GOSUB intel_l(ADD(adsam%,40))
  1571.   res%=SHR(BYTE{ADD(adsam%,34)},3)
  1572.   len%=LONG{ADD(adsam%,40)} AND -2
  1573.   freq%=LONG{ADD(adsam%,24)}
  1574.   GOSUB chg_sam_balance(sample%,&HFFFF)
  1575.   GOSUB chg_sam_nbits(sample%,res%)
  1576.   GOSUB chg_sam_freq(sample%,freq%)
  1577.   GOSUB chg_sam_volume(sample%,&H100)
  1578.   GOSUB chg_sam_finetune(sample%,0)
  1579.   GOSUB chg_sam_length(sample%,len%)
  1580.   GOSUB chg_sam_repeat(sample%,0)
  1581.   GOSUB chg_sam_replen(sample%,2)
  1582.   IF len%>0
  1583.     a%=FN adresse(sample%)
  1584.     BMOVE ADD(adsam%,44),a%,len%
  1585.     IF FN resol(sample%)=2                          ! 16 bits
  1586.       ~C:g_intel_16_bits%(L:a%,L:len%)
  1587.     ENDIF
  1588.     ~C:g_signe_sample%(L:a%,L:len%,W:res%)          ! Signature
  1589.   ENDIF
  1590.   GOSUB chg_taille_sample(sample%,len%)
  1591.   ' Le nom
  1592.   b$=a$
  1593.   WHILE INSTR(b$,"\")>0
  1594.     a%=INSTR(b$,"\")
  1595.     b$=RIGHT$(b$,SUB(LEN(b$),a%))
  1596.   WEND
  1597.   GOSUB chg_samplename(b$,sample%)
  1598.   ~FRE(0)
  1599. RETURN
  1600. PROCEDURE save_module
  1601.   LOCAL a$
  1602.   IF flag_registered!
  1603.     IF km%=2 AND nfile_module$<>""
  1604.       a$=npath_module$+nfile_module$
  1605.     ELSE
  1606.       CLS
  1607.       IF next_module$="*.MOD"
  1608.         GOSUB cadre_texte("EXPORT MODULE .MOD",0,0,PRED(scr_ncol%))
  1609.         FILESELECT npath_module$+"*.MOD",nfile_module$,a$
  1610.       ELSE IF next_module$="*.S3M"
  1611.         GOSUB cadre_texte("EXPORT MODULE .S3M",0,0,PRED(scr_ncol%))
  1612.         FILESELECT npath_module$+"*.S3M",nfile_module$,a$
  1613.       ELSE IF next_module$="*.GTK"
  1614.         GOSUB cadre_texte("SAVE OLD MODULE",0,0,PRED(scr_ncol%))
  1615.         FILESELECT npath_module$+"*.GTK",nfile_module$,a$
  1616.       ELSE
  1617.         GOSUB cadre_texte("SAVE MODULE",0,0,PRED(scr_ncol%))
  1618.         FILESELECT npath_module$+"*.GT2",nfile_module$,a$
  1619.       ENDIF
  1620.     ENDIF
  1621.     IF a$<>""
  1622.       CLS
  1623.       GOSUB cadre_texte("WAITING : BACK UP OF THE MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  1624.       IF flag_backup_modules!
  1625.         e%=FN backup_file(a$)
  1626.         IF e%<0
  1627.           GOSUB dialog("ERROR","Error during the backup of the file|"+a$,"Continue",mousx,MOUSEY)
  1628.         ENDIF
  1629.       ENDIF
  1630.       CLS
  1631.       GOSUB cadre_texte("WAITING : SAVING MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  1632.       GOSUB save_module2
  1633.       GOSUB separe_nom_chemin(a$)
  1634.       nfile_module$=nfile_$
  1635.       npath_module$=npath_$
  1636.     ENDIF
  1637.   ELSE
  1638.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  1639.   ENDIF
  1640. RETURN
  1641. PROCEDURE save_module2
  1642.   ' Fournir a$ nom du module
  1643.   LOCAL i%,a%
  1644.   ~FRE(0)
  1645.   erreur%=0
  1646.   warning%=0
  1647.   GOSUB bee(TRUE)
  1648.   module&(1)=ADD(&H4B00,gtk_file_vnum%)
  1649.   OPEN "o",#0,a$
  1650.   SEEK #0,0
  1651.   IF next_module$="*.MOD"
  1652.     GOSUB save_module_mod
  1653.   ELSE IF next_module$="*.S3M"
  1654.     GOSUB save_module_s3m
  1655.   ELSE IF next_module$="*.GTK"
  1656.     GOSUB save_module_gtk
  1657.   ELSE
  1658.     GOSUB save_module_gt2
  1659.   ENDIF
  1660.   CLOSE #0
  1661. RETURN
  1662. PROCEDURE save_module_gt2
  1663.   LOCAL a%,i%,j%,nbs%,nbi%
  1664.   LOCAL a$,chk$,lsam$,lins$,lenv$
  1665.   LOCAL ok!
  1666.   ~FRE(0)
  1667.   '
  1668.   ' Travail preparatoire
  1669.   '
  1670.   ' Recherche les samples utilises
  1671.   lsam$=STRING$(256,0)
  1672.   nbs%=0
  1673.   FOR i%=1 TO 255
  1674.     IF FN length(i%)>0 OR FN samplename$(i%)<>SPACE$(28)
  1675.       BYTE{ADD(V:lsam$,i%)}=1           ! Criteres: longueur > 0 ou nom defini
  1676.       INC nbs%
  1677.     ENDIF
  1678.   NEXT i%
  1679.   ' Recherche les instruments utilises
  1680.   lins$=STRING$(256,0)
  1681.   nbi%=0
  1682.   FOR i%=1 TO 255
  1683.     j%=0
  1684.     ok!=FALSE
  1685.     REPEAT
  1686.       IF (BYTE{ADD(V:lsam$,FN isample(i%,j%))}<>0 AND FN length(FN isample(i%,j%))>0) OR FN instrname$(i%)<>SPACE$(28)
  1687.         BYTE{ADD(V:lins$,i%)}=1         ! Criteres: contient au moins un sample selectionne ou nom defini
  1688.         INC nbi%
  1689.         ok!=TRUE
  1690.       ENDIF
  1691.       INC j%
  1692.     UNTIL ok! OR j%>127
  1693.   NEXT i%
  1694.   ' Recherche des enveloppes utilisees
  1695.   lenv$=STRING$(192,0)
  1696.   FOR i%=1 TO 63
  1697.     FOR j%=0 TO 2                       ! Critere : longueur d'une section > 1
  1698.       IF FN env_sectlen(i%,j%,0)>1 OR FN env_sectlen(i%,j%,1)>1
  1699.         BYTE{ADD(V:lenv$,ADD(MUL(i%,3),j%))}=1
  1700.       ENDIF
  1701.     NEXT j%
  1702.   NEXT i%
  1703.   '
  1704.   ' Chunk d'informations generales
  1705.   '
  1706.   a$=DATE$
  1707.   a%=FN mod_tempo                       ! Tempo
  1708.   chk$="GT2"+CHR$(gt2_file_vnum%)+MKL$(0)+FN songname$+FN songcomment$
  1709.   chk$=chk$+CHR$(VAL(LEFT$(a$,2)))+CHR$(VAL(MID$(a$,4,2)))+MKI$(VAL(RIGHT$(a$,4)))
  1710.   chk$=chk$+"Graoumf Tracker v"+STR$(gtk_version%/10000)        ! Nom du Tracker
  1711.   chk$=chk$+SPACE$(SUB(228,LEN(chk$)))
  1712.   chk$=chk$+MKI$(CARD{r_mod_speed%})+MKI$(a%)+MKI$(CARD{r_master_vol%})+MKI$(nbr_track%)
  1713.   FOR i%=0 TO PRED(nbr_track%)                                  ! Les balances
  1714.     chk$=chk$+MKI$(CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,i%))})
  1715.   NEXT i%
  1716.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  1717.   BPUT #0,V:chk$,LEN(chk$)
  1718.   '
  1719.   ' Chunk de configuration du tracker
  1720.   '
  1721.   IF flag_gt2cnf!
  1722.     chk$="TCN1"+MKL$(2660)+MKI$(0)+MKI$(songpos%)+MKI$(posligne%)+MKI$(n_preset%)
  1723.     chk$=chk$+MKI$(type_affpiste%)+MKI$(curs_col%)+MKI$(curs_x%)+MKI$(ADD(play%,SHL(edit%,2)))
  1724.     chk$=chk$+MKI$(octave%)+MKI$(line_step%)+MKI$(instr%)+MKI$(sample%)
  1725.     FOR i%=0 TO 31
  1726.       chk$=chk$+MKI$(nbr_colonnes%(i%))
  1727.     NEXT i%
  1728.     FOR i%=0 TO 31
  1729.       chk$=chk$+SPACE$(16)                      ! *** Faire de vrais noms
  1730.     NEXT i%
  1731.     a$=STRING$(2048,0)
  1732.     BMOVE V:preset&(0,0),V:a$,2048
  1733.     chk$=chk$+a$
  1734.     a%=0
  1735.     FOR i%=0 TO 31
  1736.       IF FN track_onoff(i%)<>0
  1737.         a%=a% OR SHL(1,i%)
  1738.       ENDIF
  1739.     NEXT i%
  1740.     chk$=chk$+MKL$(a%)
  1741.     LONG{ADD(V:chk$,4)}=LEN(chk$)
  1742.     BPUT #0,V:chk$,LEN(chk$)
  1743.   ENDIF
  1744.   '
  1745.   ' Chunk de sequence de patterns
  1746.   '
  1747.   chk$="SONG"+MKL$(ADD(FN song_length,12))+MKI$(FN song_length)+MKI$(FN song_repeat)
  1748.   FOR i%=0 TO PRED(FN song_length)
  1749.     chk$=chk$+MKI$(song&(i%))
  1750.   NEXT i%
  1751.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  1752.   BPUT #0,V:chk$,LEN(chk$)
  1753.   '
  1754.   ' Chunk d'ensemble de patterns
  1755.   '
  1756.   chk$="PATS"+MKL$(12)+MKI$(nbr_track%)+MKI$(SUCC(FN last_pat_util))
  1757.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  1758.   BPUT #0,V:chk$,LEN(chk$)
  1759.   '
  1760.   ' Chunks des patterns
  1761.   '
  1762.   FOR i%=0 TO FN last_pat_util
  1763.     a%=MAX(FN adr_patchunk(i%)*(-flag_registered2!),&H1498)     ! A cause de la 2eme protection
  1764.     BPUT #0,a%,FN lon_patchunk(i%)
  1765.   NEXT i%
  1766.   '
  1767.   ' Chunk d'ensemble d'instruments
  1768.   '
  1769.   chk$="ORCH"+MKL$(10)+MKI$(nbi%)
  1770.   LONG{ADD(V:chk$,4)}=LEN(chk$)
  1771.   BPUT #0,V:chk$,LEN(chk$)
  1772.   '
  1773.   ' Chunks des instruments
  1774.   '
  1775.   FOR i%=1 TO 255
  1776.     IF BYTE{ADD(V:lins$,i%)}<>0
  1777.       a%=MAX(V:instrset%(0,i%)*(-flag_registered2!),&H1264)     ! A cause de la 2eme protection
  1778.       BPUT #0,a%,instrset%(1,i%)
  1779.     ENDIF
  1780.   NEXT i%
  1781.   '
  1782.   ' Chunks des samples
  1783.   '
  1784.   FOR i%=1 TO 255
  1785.     IF BYTE{ADD(V:lsam$,i%)}<>0
  1786.       a%=MAX(FN adrsamchk(i%)*(-flag_registered2!),&H1529)      ! A cause de la 2eme protection
  1787.       BPUT #0,a%,FN lonsamchk(i%)
  1788.     ENDIF
  1789.   NEXT i%
  1790.   '
  1791.   ' Chunks des enveloppes
  1792.   '
  1793.   FOR i%=1 TO 63
  1794.     FOR j%=0 TO 2
  1795.       IF BYTE{ADD(V:lenv$,ADD(MUL(i%,3),j%))}<>0
  1796.         a%=MAX(FN env_chunkadr(i%,j%)*(-flag_registered2!),&H1798)      ! A cause de la 2eme protection
  1797.         BPUT #0,a%,FN env_chunklen(i%,j%)
  1798.       ENDIF
  1799.     NEXT j%
  1800.   NEXT i%
  1801.   ~FRE(0)
  1802. RETURN
  1803. PROCEDURE save_module_gtk
  1804.   LOCAL a%,i%,j%,nblm%
  1805.   LOCAL a$
  1806.   '
  1807.   ' Le header du module
  1808.   '
  1809.   nblm%=FN nbr_lines_maxi
  1810.   a$=STRING$(206,0)
  1811.   BMOVE V:module&(0),V:a$,206
  1812.   CARD{ADD(V:a$,198)}=nblm%
  1813.   BPUT #0,V:a$,206
  1814.   '
  1815.   ' Les headers des samples
  1816.   '
  1817.   FOR j%=1 TO module&(98)
  1818.     i%=FN isample(j%,48)
  1819.     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%))
  1820.     BPUT #0,V:a$,64
  1821.   NEXT j%
  1822.   '
  1823.   ' La song
  1824.   '
  1825.   BPUT #0,V:song&(0),512
  1826.   '
  1827.   ' Les patterns
  1828.   '
  1829.   a%=FN last_pat_util
  1830.   FOR i%=0 TO a%
  1831.     nbl%=FN nbr_lines(i%)
  1832.     a$=STRING$(MIN(MUL(MUL(nbr_track%,nblm%),5),32767),0)
  1833.     BMOVE FN adr_pat(i%),V:a$,MUL(MUL(nbr_track%,nbl%),5)
  1834.     IF nbl%<nblm%
  1835.       CARD{ADD(V:a$,SUB(MUL(MUL(nbr_track%,nbl%),5),3))}=&HD00
  1836.     ENDIF
  1837.     IF EXP(flag_registered2!)=1                 ! *** 2eme protection
  1838.       a$=STRING$(LEN(a$),0)
  1839.     ENDIF
  1840.     BPUT #0,V:a$,LEN(a$)
  1841.   NEXT i%
  1842.   '
  1843.   ' Les samples
  1844.   '
  1845.   FOR j%=1 TO module&(98)
  1846.     i%=FN isample(j%,48)
  1847.     IF FN length(i%)>0
  1848.       a%=MAX(FN adresse(i%)*(-flag_registered2!),&H1895)        ! *** 2eme protection
  1849.       BPUT #0,a%,FN length(i%)
  1850.     ENDIF
  1851.   NEXT j%
  1852. RETURN
  1853. PROCEDURE save_module_mod
  1854.   ' Sauve un module au format .MOD
  1855.   LOCAL a%,b%,c%,d%,e%,i%,i2%,j%,k%,n%,nblm%
  1856.   LOCAL a&,b&
  1857.   LOCAL flag_fast!
  1858.   LOCAL a$,lig$,sam$,sam2$
  1859.   ~FRE(0)
  1860.   nblm%=FN nbr_lines_maxi
  1861.   IF nblm%=64 AND nbr_track%<>4                 ! On doit le sauver au format FastTracker ?
  1862.     flag_fast!=TRUE
  1863.   ELSE
  1864.     flag_fast!=FALSE
  1865.   ENDIF
  1866.   BPUT #0,V:module&(2),20                       ! Le nom du module
  1867.   '
  1868.   ' Rearrange les samples pour qu'ils puissent tous tenir
  1869.   '
  1870.   sam$=STRING$(256,0)                           ! Correspondance des samples pour la conversion des patterns
  1871.   sam2$=""
  1872.   FOR i%=1 TO 31
  1873.     sam2$=sam2$+CHR$(i%)
  1874.   NEXT i%
  1875.   BMOVE V:sam2$,SUCC(V:sam$),31
  1876.   i%=32
  1877.   j%=0
  1878.   REPEAT
  1879.     WHILE FN length(FN isample(BYTE{ADD(V:sam2$,j%)},48))<>0 AND j%<31
  1880.       INC j%
  1881.     WEND
  1882.     EXIT IF j%>=31
  1883.     IF FN length(FN isample(i%,48))>0
  1884.       BYTE{ADD(V:sam$,i%)}=SUCC(j%)
  1885.       BYTE{ADD(V:sam2$,j%)}=i%
  1886.       INC j%
  1887.     ENDIF
  1888.     INC i%
  1889.   UNTIL i%>255
  1890.   '
  1891.   ' Sauve les headers de sample
  1892.   '
  1893.   FOR j%=0 TO 30
  1894.     i2%=BYTE{ADD(V:sam2$,j%)}
  1895.     i%=FN isample(i2%,48)
  1896.     a$=FN samplename$(i%)                     ! Nom du sample
  1897.     BPUT #0,V:a$,22
  1898.     c%=FN resol(i%)
  1899.     a&=MIN(SHR(DIV(FN length(i%),c%),1),&H7FFF)
  1900.     BPUT #0,V:a&,2                            ! Longueur du sample
  1901.     b&=ADD(SHL(FN finetune(i%),8) AND &HF00,SHR(FN ivolume(i2%),2) AND &H7F)
  1902.     BPUT #0,V:b&,2                            ! Finetune + Volume
  1903.     b&=MAX(MIN(SHR(DIV(FN repeat(i%),c%),1),PRED(a&)),0)
  1904.     BPUT #0,V:b&,2                            ! Reppos
  1905.     b&=MAX(MIN(SHR(DIV(FN replen(i%),c%),1),SUB(a&,b&)),1)
  1906.     BPUT #0,V:b&,2                            ! Replen
  1907.   NEXT j%
  1908.   '
  1909.   ' La song
  1910.   '
  1911.   a&=ADD(SHL(MIN(module&(101),128),8),MIN(module&(102),127))
  1912.   BPUT #0,V:a&,2                ! Songlen + Songrepeat
  1913.   a&=SHR(a&,8)
  1914.   b&=0
  1915.   a%=0
  1916.   FOR i%=0 TO 127               ! La song
  1917.     b&=MIN(song&(i%),255)
  1918.     IF i%=>a&
  1919.       b&=0
  1920.     ENDIF
  1921.     a%=MAX(a%,b&)
  1922.     BPUT #0,SUCC(V:b&),1
  1923.   NEXT i%
  1924.   IF flag_fast!                 ! Format FastTracker
  1925.     b%=CVL(LEFT$(STR$(nbr_track%)+"CHN",4))
  1926.     BPUT #0,V:b%,4
  1927.   ELSE IF nblm%<>64             ! Format MOD Digital Tracker (FAxx)
  1928.     b%=CVL("FA"+CHR$(ADD(DIV(nbr_track%,10),48))+CHR$(ADD(nbr_track% MOD 10,48)))
  1929.     BPUT #0,V:b%,4
  1930.     b%=SHL(nblm%,16)
  1931.     BPUT #0,V:b%,4
  1932.   ELSE IF nbr_track%=4          ! Format ProTracker standard
  1933.     b%=&H4D2E4B2E
  1934.     BPUT #0,V:b%,4
  1935.   ENDIF
  1936.   '
  1937.   ' Les patterns
  1938.   '
  1939.   FOR j%=0 TO a%                ! Les patterns
  1940.     n%=FN nbr_lines(j%)
  1941.     lig$=STRING$(SHL(nbr_track%,2),0)
  1942.     b%=FN adr_pat(j%)
  1943.     FOR i%=0 TO PRED(n%)
  1944.       c%=V:lig$
  1945.       d%=V:sam$
  1946.       e%=MAX(nbr_track%*(-flag_registered2!),1) ! *** 2eme protection
  1947.       ~C:g_convert_gtk_2_nt%(L:b%,L:c%,L:d%,W:e%)
  1948.       IF i%=PRED(n%) AND n%<nblm%
  1949.         CARD{ADD(V:lig$,SUB(SHL(nbr_track%,2),2))}=ADD(CARD{ADD(V:lig$,SUB(SHL(nbr_track%,2),2))} AND &HF000,&HD00)
  1950.       ENDIF
  1951.       BPUT #0,V:lig$,SHL(nbr_track%,2)
  1952.       ADD b%,MUL(nbr_track%,5)
  1953.     NEXT i%
  1954.     IF n%<nblm%
  1955.       lig$=STRING$(MUL(SHL(nbr_track%,2),SUB(nblm%,n%)),0)
  1956.       BPUT #0,V:lig$,LEN(lig$)
  1957.     ENDIF
  1958.   NEXT j%
  1959.   '
  1960.   ' Les samples
  1961.   '
  1962.   ' Penser a reechantillonner si besoin est
  1963.   lig$=STRING$(16384,0)
  1964.   FOR j%=0 TO 30                ! Les samples
  1965.     i%=FN isample(BYTE{ADD(V:sam2$,j%)},48)
  1966.     a%=MIN(DIV(FN length(i%),FN resol(i%)) AND -2,&HFFFE)
  1967.     IF a%>0
  1968.       IF FN resol(i%)=2         ! Convertit 16 bits en 8 bits
  1969.         k%=0
  1970.         REPEAT
  1971.           b%=ADD(FN adresse(i%),SHL(k%,1))
  1972.           d%=MIN(SHL(SUB(a%,k%) AND -2,1),32768)
  1973.           c%=V:lig$
  1974.           IF COS(flag_registered2!)<1           ! *** 2eme protection
  1975.             ~C:g_copy_sample_16_2_8%(L:b%,L:c%,L:d%)
  1976.           ENDIF
  1977.           BPUT #0,V:lig$,SHR(d%,1)
  1978.           ADD k%,SHR(d%,1)
  1979.         UNTIL k%>=a%
  1980.       ELSE
  1981.         b%=MAX(FN adresse(i%)*(-flag_registered2!),&H1958)      ! *** 2eme protection
  1982.         BPUT #0,b%,a%
  1983.       ENDIF
  1984.     ENDIF
  1985.   NEXT j%
  1986.   ~FRE(0)
  1987. RETURN
  1988. PROCEDURE save_module_s3m
  1989.   LOCAL a%,b%,c%,d%,e%,f%,i%,j%,nbl%,nblm%,p%,xxx1%,xxx2%,xxx3%
  1990.   LOCAL a$,b$,mod$,pp$,ps$
  1991.   ~FRE(0)
  1992.   vide$=STRING$(16,0)
  1993.   nblm%=FN nbr_lines_maxi
  1994.   xxx1%=ADD(&H60,SUCC(FN song_length) AND -2)
  1995.   xxx2%=ADD(xxx1%,SHL(FN last_spl_util2,1))
  1996.   xxx3%=ADD(xxx2%,SHL(SUCC(FN last_pat_util),1))
  1997.   p%=ADD(ADD(xxx3%,32),15) AND -16      ! Debut des donnees de pat ou spl, alignement car parapointer
  1998.   '
  1999.   ' Le header du module
  2000.   '
  2001.   a%=FN mod_tempo                               ! Tempo
  2002.   mod$=LEFT$(FN songname$,28)+MKI$(&H1A10)+MKI$(0)
  2003.   mod$=mod$+MKI$(SUCC(FN song_length) AND -2)+MKI$(FN last_spl_util2)+MKI$(SUCC(FN last_pat_util))+MKI$(0)
  2004.   mod$=mod$+"GT"+MKI$(2)+"SCRM"
  2005.   mod$=mod$+CHR$(&H40)+CHR$(CARD{r_mod_speed%})+CHR$(a%)+CHR$(&HFF)+CHR$(0)+CHR$(252)+STRING$(10,0)
  2006.   GOSUB intel_w(ADD(V:mod$,&H20))
  2007.   GOSUB intel_w(ADD(V:mod$,&H22))
  2008.   GOSUB intel_w(ADD(V:mod$,&H24))
  2009.   GOSUB intel_w(ADD(V:mod$,&H26))
  2010.   GOSUB intel_w(ADD(V:mod$,&H2A))
  2011.   ' Les channels settings
  2012.   a%=0
  2013.   b%=0
  2014.   FOR i%=0 TO 31
  2015.     IF i%<nbr_track%
  2016.       IF FN balance(i%)<&H800
  2017.         mod$=mod$+CHR$(a%)
  2018.         a%=SUCC(a%) AND 7
  2019.       ELSE
  2020.         mod$=mod$+CHR$(ADD(b%,8))
  2021.         b%=SUCC(b%) AND 7
  2022.       ENDIF
  2023.     ELSE
  2024.       mod$=mod$+CHR$(255)
  2025.     ENDIF
  2026.   NEXT i%
  2027.   ' La song
  2028.   FOR i%=0 TO PRED(FN song_length)
  2029.     mod$=mod$+CHR$(song&(i%))
  2030.   NEXT i%
  2031.   IF (FN song_length AND 1)=1
  2032.     mod$=mod$+CHR$(255)
  2033.   ENDIF
  2034.   mod$=mod$+STRING$(SUB(p%,LEN(mod$)),0)
  2035.   ' Les Pan Pos
  2036.   FOR i%=0 TO PRED(nbr_track%)
  2037.     a%=ADD(FN balance(i%),&H80)                 ! Meilleure estimation possible
  2038.     BYTE{ADD(ADD(V:mod$,xxx3%),i%)}=ADD(MIN(DIV(MUL(a%,15),&H1000),15),32)
  2039.   NEXT i%
  2040.   BPUT #0,V:mod$,p%
  2041.   '
  2042.   ' Les samples
  2043.   '
  2044.   ps$=""                        ! Liste des parapointers
  2045.   FOR j%=1 TO FN last_spl_util2
  2046.     i%=FN isample(j%,48)
  2047.     ps$=ps$+MKI$(SHR(p%,4))
  2048.     ' Le header
  2049.     a$=CHR$(1)+"SAMPLE"+HEX$(j%,2)+STRING$(5,0)+MKI$(SHR(ADD(p%,&H50),4))
  2050.     a$=a$+MKL$(FN length(i%))+MKL$(FN repeat(i%))+MKL$(ADD(FN repeat(i%),FN replen(i%)))
  2051.     a$=a$+CHR$(SHR(FN ivolume(j%),2))+CHR$(0)+CHR$(0)
  2052.     IF ADD(FN repeat(i%),FN replen(i%))<=2
  2053.       a%=0
  2054.     ELSE
  2055.       a%=1
  2056.     ENDIF
  2057.     a$=a$+CHR$(ADD(a%,SHL(PRED(FN resol(i%)),2)))
  2058.     a%=FN freqech(i%)*(2^(FN finetune(i%)/96))
  2059.     a$=a$+MKL$(a%)+STRING$(12,0)+FN samplename$(i%)+"SCRS"
  2060.     GOSUB intel_w(ADD(V:a$,&HE))
  2061.     GOSUB intel_l(ADD(V:a$,&H10))
  2062.     GOSUB intel_l(ADD(V:a$,&H14))
  2063.     GOSUB intel_l(ADD(V:a$,&H18))
  2064.     GOSUB intel_l(ADD(V:a$,&H20))
  2065.     BPUT #0,V:vide$,16
  2066.     SEEK #0,p%
  2067.     BPUT #0,V:a$,&H50
  2068.     ADD p%,&H50
  2069.     ' Donnees
  2070.     a$=STRING$(16384,0)
  2071.     a%=0
  2072.     e%=FN resol(i%)
  2073.     WHILE SUB(FN length(i%),a%)>0
  2074.       b%=ADD(FN adresse(i%),a%)
  2075.       c%=V:a$
  2076.       d%=MIN(16384,SUB(FN length(i%),a%))
  2077.       f%=d%*(-flag_registered2!)                ! *** 2eme protection
  2078.       BMOVE b%,c%,f%
  2079.       ~C:g_signe_sample%(L:c%,L:d%,W:e%)
  2080.       IF e%=2
  2081.         ~C:g_intel_16_bits%(L:c%,L:d%)
  2082.       ENDIF
  2083.       BPUT #0,V:a$,d%
  2084.       ADD a%,d%
  2085.     WEND
  2086.     p%=ADD(ADD(p%,FN length(i%)),15) AND -16
  2087.   NEXT j%
  2088.   '
  2089.   ' les patterns
  2090.   '
  2091.   a$=STRING$(16384,0)           ! Au grand maximum...
  2092.   b$=STRING$(10240,0)
  2093.   pp$=""                        ! Liste des parapointers
  2094.   FOR i%=0 TO FN last_pat_util
  2095.     nbl%=FN nbr_lines(i%)
  2096.     pp$=pp$+MKI$(SHR(p%,4))
  2097.     GOSUB clear_mem(V:b$,10240)
  2098.     BMOVE FN adr_pat(i%),V:b$,MUL(MUL(nbr_track%,MIN(64,nblm%)),5)
  2099.     IF nbl%<64
  2100.       CARD{ADD(V:b$,SUB(MUL(MUL(nbr_track%,nbl%),5),3))}=&HD00
  2101.     ENDIF
  2102.     a%=V:b$
  2103.     b%=V:a$
  2104.     c%=MAX(nbr_track%*(-flag_registered2!),1)           ! *** 2eme protection
  2105.     d%=MAX(MIN(nblm%,64)*(-flag_registered2!),1)        ! *** 2eme protection
  2106.     ~C:g_convert_gtk_2_s3m%(L:a%,L:b%,W:c%,W:d%)
  2107.     a%=CARD{V:a$}
  2108.     GOSUB intel_w(V:a$)
  2109.     BPUT #0,V:vide$,16
  2110.     SEEK #0,p%
  2111.     BPUT #0,V:a$,a%
  2112.     p%=ADD(ADD(p%,a%),15) AND -16
  2113.   NEXT i%
  2114.   '
  2115.   ' Sauvegarde des parapointers
  2116.   '
  2117.   FOR i%=0 TO SUB(LEN(pp$),2) STEP 2
  2118.     GOSUB intel_w(ADD(V:pp$,i%))
  2119.   NEXT i%
  2120.   FOR i%=0 TO SUB(LEN(ps$),2) STEP 2
  2121.     GOSUB intel_w(ADD(V:ps$,i%))
  2122.   NEXT i%
  2123.   SEEK #0,xxx1%
  2124.   BPUT #0,V:ps$,LEN(ps$)
  2125.   SEEK #0,xxx2%
  2126.   BPUT #0,V:pp$,LEN(pp$)
  2127. RETURN
  2128. PROCEDURE load_module
  2129.   LOCAL a$
  2130.   ~FRE(0)
  2131.   IF km%=2 AND nfile_module$<>""
  2132.     a$=npath_module$+nfile_module$
  2133.   ELSE
  2134.     CLS
  2135.     GOSUB cadre_texte("LOAD MODULE",0,0,PRED(scr_ncol%))
  2136.     FILESELECT npath_module$+next_module$,nfile_module$,a$
  2137.   ENDIF
  2138.   IF a$<>""
  2139.     IF FN exist(a$)
  2140.       CLS
  2141.       GOSUB cadre_texte("WAITING : LOADING MODULE "+a$+"...",0,0,PRED(scr_ncol%))
  2142.       ~FRE(0)
  2143.       GOSUB load_module2
  2144.       IF erreur%=0
  2145.         GOSUB separe_nom_chemin(a$)
  2146.         npath_module$=npath_$
  2147.         nfile_module$=nfile_$
  2148.       ENDIF
  2149.     ENDIF
  2150.   ENDIF
  2151.   GOSUB bee(FALSE)
  2152.   SELECT erreur%
  2153.   CASE 0                                        ! Pas d'erreur, tout est OK
  2154.     IF play%=1
  2155.       GOSUB play_song(TRUE)
  2156.     ELSE IF play%=2
  2157.       GOSUB play_pattern(TRUE)
  2158.     ELSE
  2159.       GOSUB stop_voices
  2160.     ENDIF
  2161.   CASE 1
  2162.     GOSUB dialog("FILE","Error:|Not enough memory|to load this module!","Cancel",MOUSEX,MOUSEY)
  2163.   CASE 2
  2164.     GOSUB dialog("FILE","Error:|Not enough memory|to load the pattern section|of this module!","Cancel",MOUSEX,MOUSEY)
  2165.   CASE 3
  2166.     GOSUB dialog("FILE","Error:|Not enough memory|to load the sample section|of this module!","Cancel",MOUSEX,MOUSEY)
  2167.   CASE 4
  2168.     GOSUB dialog("FILE","Error:|Unknown module format, or|probably an unknown compression|type.","Cancel",MOUSEX,MOUSEY)
  2169.   ENDSELECT
  2170. RETURN
  2171. PROCEDURE load_module2
  2172.   ' a$ nom du module
  2173.   LOCAL a%,admod%,anc%,b%,c%,i%,j%,ticks%,mastervol%
  2174.   LOCAL lonmod%,place_totale2%,tempo%,translate%
  2175.   LOCAL a&
  2176.   LOCAL b$,balance$,chk$,chunk$,chknbv$,header$
  2177.   ~FRE(0)
  2178.   GOSUB bee(TRUE)
  2179.   erreur%=0
  2180.   warning%=0
  2181.   place_totale2%=place_totale%
  2182.   translate%=0                          ! Decalage du buffer au cours du chargement du module
  2183.   ticks%=6                              ! Vitesse de base
  2184.   tempo%=125                            ! Tempo BPM de base
  2185.   mastervol%=0                          ! Master
  2186.   FOR i%=0 TO 31                        ! Fixe la balance par defaut
  2187.     balance$=balance$+MKI$(MUL(SHR(SUCC(i%),1) AND 1,&HFFF))
  2188.   NEXT i%
  2189.   OPEN "i",#0,a$
  2190.   header$=STRING$(4096,0)
  2191.   SEEK #0,0
  2192.   BGET #0,V:header$,MIN(4096,LOF(#0))
  2193.   ~FRE(0)
  2194.   IF LEFT$(header$,3)="ATM"                     ! Si c'est un fichier packe (Atomic packer 3.5)
  2195.     lonmod%=LONG{ADD(V:header$,4)}              ! Longueur du module decompacte
  2196.     GOTO ld_mod2_comp_suite
  2197.   ELSE IF LEFT$(header$,4)="Ice!"               ! Si c'est un fichier packe (Ice Packer 2.1)
  2198.     lonmod%=LONG{ADD(V:header$,4)}              ! Longueur du module decompacte
  2199.     GOTO ld_mod2_comp_suite
  2200.   ELSE IF LEFT$(header$,4)="ICE!"               ! Si c'est un fichier packe (Ice Packer 2.4)
  2201.     lonmod%=LONG{ADD(V:header$,8)}              ! Longueur du module decompacte
  2202.   ld_mod2_comp_suite:
  2203.     IF lonmod%<FN zone_free2                    ! Y a la place ?
  2204.       GOSUB stop_voices
  2205.       GOSUB clear_samples
  2206.       GOSUB clear_instr
  2207.       admod%=SUB(FN zone_end,lonmod%)
  2208.       BMOVE ADD(FN adr_buffer,lonmod%),FN adr_buffer,SUB(FN lon_buffer,lonmod%)
  2209.       SEEK #0,0
  2210.       BGET #0,admod%,LOF(#0)
  2211.       IF flag_autoload!
  2212.         GOSUB aff_message("WAITING : DECRUNCHING MODULE")
  2213.       ELSE
  2214.         GOSUB cadre_texte("WAITING : DECRUNCHING MODULE",0,0,PRED(scr_ncol%))
  2215.       ENDIF
  2216.       GOSUB bee(TRUE)
  2217.       ~C:g_atomic_35_unpack%(L:admod%)
  2218.       ~C:g_packice_21_unpack%(L:admod%)
  2219.       ~C:g_packice_24_unpack%(L:admod%)
  2220.       BMOVE admod%,V:header$,4096               ! Nouveau header
  2221.       GOTO ld_module2_cv_in_mem
  2222.     ELSE
  2223.       erreur%=1
  2224.       GOTO ld_module2_fin
  2225.     ENDIF
  2226.   ELSE IF LOF(#0)<FN zone_free2
  2227.     ' On peut le charger en memoire puis le convertir apres
  2228.     GOSUB stop_voices
  2229.     GOSUB clear_samples
  2230.     GOSUB clear_instr
  2231.     lonmod%=LOF(#0)
  2232.     admod%=SUB(FN zone_end,lonmod%)
  2233.     BMOVE ADD(FN adr_buffer,lonmod%),FN adr_buffer,SUB(FN lon_buffer,lonmod%)
  2234.     SEEK #0,0
  2235.     BGET #0,admod%,lonmod%
  2236.   ld_module2_cv_in_mem:
  2237.     IF flag_autoload!
  2238.       GOSUB aff_message("WAITING : CONVERTING MODULE")
  2239.     ELSE
  2240.       GOSUB cadre_texte("WAITING : CONVERTING MODULE",0,0,PRED(scr_ncol%))
  2241.     ENDIF
  2242.     SUB place_totale2%,lonmod%
  2243.     SWAP place_totale%,place_totale2%
  2244.     GOSUB bee(TRUE)
  2245.     SHOWM
  2246.     IF LEFT$(header$,3)="GT2"
  2247.       GOSUB load_module_gt2_mem
  2248.     ELSE IF LEFT$(header$,3)="GTK"
  2249.       GOSUB load_module_gtk_mem
  2250.     ELSE
  2251.       ' Sinon ca doit encore etre un de ces p... de modules Noisetracker !!!
  2252.       chunk$="M.K.M&K&FLT4FLT6FLT8CD81M!K!RASP"
  2253.       chknbv$=MKL$(&H4040406)+MKL$(&H8080404)
  2254.       chk$=MID$(header$,&H439,4)
  2255.       a%=INSTR(chunk$,chk$)
  2256.       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)
  2257.         GOSUB load_module_mod_mem
  2258.       ELSE IF LONG{V:header$}=&H4D4D4431
  2259.         ' Format OCTAmed Amiga
  2260.         GOSUB load_module_octamed_mem
  2261.       ELSE IF CARD{V:header$}=&H6966
  2262.         ' Foramt 669
  2263.         GOSUB load_module_669_mem
  2264.       ELSE IF MID$(header$,1,3)="MTM"
  2265.         ' Format MTM
  2266.         GOSUB load_module_mtm_mem
  2267.       ELSE IF MID$(header$,&H2D,4)="SCRM"
  2268.         ' Format  Scream Tracker 3
  2269.         GOSUB load_module_s3m_mem
  2270.       ELSE IF LEFT$(header$,12)="MAS_UTrack_V"
  2271.         ' Format Ultra Tracker
  2272.         GOSUB load_module_ult_mem
  2273.       ELSE IF LEFT$(header$,4)="D.T."
  2274.         ' Format Digital Tracker
  2275.         GOSUB load_module_dtm_mem
  2276.       ELSE IF LEFT$(header$,17)="Extended Module: "
  2277.         ' Format FastTracker 2
  2278.         GOSUB load_module_xm_mem
  2279.       ELSE
  2280.         ' Autre format ?
  2281.         GOTO ld_module2_disk
  2282.       ENDIF
  2283.     ENDIF
  2284.     SWAP place_totale%,place_totale2%
  2285.     BMOVE FN adr_buffer,ADD(FN adr_buffer,SUB(lonmod%,translate%)),SUB(FN lon_buffer,SUB(lonmod%,translate%))
  2286.     GOTO ld_module2_reorg
  2287.   ENDIF
  2288. ld_module2_disk:
  2289.   ' Chargement et conversion a partir du disque (lent)
  2290.   IF flag_autoload!
  2291.     GOSUB aff_message("WAITING : LOADING & CONVERTING MODULE")
  2292.   ELSE
  2293.     GOSUB cadre_texte("WAITING : LOADING & CONVERTING MODULE",0,0,PRED(scr_ncol%))
  2294.   ENDIF
  2295.   GOSUB bee(TRUE)
  2296.   IF LEFT$(header$,3)="GT2"             ! C'est bien un de nos modules ?
  2297.     GOSUB stop_voices
  2298.     GOSUB load_module_gt2
  2299.   ELSE IF LEFT$(header$,3)="GTK"        ! Ancien module ?
  2300.     GOSUB stop_voices
  2301.     GOSUB load_module_gtk
  2302.   ELSE
  2303.     ' Sinon ca doit encore etre un de ces p... de modules Noisetracker !!!
  2304.     chunk$="M.K.M&K&FLT4FLT6FLT8CD81M!K!RASP"
  2305.     chknbv$=MKL$(&H4040406)+MKL$(&H8080404)
  2306.     SEEK #0,&H438
  2307.     BGET #0,V:a%,4
  2308.     chk$=MKL$(a%)
  2309.     a%=INSTR(chunk$,chk$)
  2310.     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)
  2311.       GOSUB stop_voices
  2312.       GOSUB load_module_mod
  2313.     ELSE IF LONG{V:header$}=&H4D4D4431
  2314.       ' Format OCTAmed Amiga
  2315.       GOSUB stop_voices
  2316.       GOSUB load_module_octamed
  2317.     ELSE IF CARD{V:header$}=&H6966
  2318.       ' Foramt 669
  2319.       GOSUB stop_voices
  2320.       GOSUB load_module_669
  2321.     ELSE IF MID$(header$,1,3)="MTM"
  2322.       ' Format MTM
  2323.       GOSUB stop_voices
  2324.       GOSUB load_module_mtm
  2325.     ELSE IF MID$(header$,&H2D,4)="SCRM"
  2326.       ' Format  Scream Tracker 3
  2327.       GOSUB stop_voices
  2328.       GOSUB load_module_s3m
  2329.     ELSE IF LEFT$(header$,12)="MAS_UTrack_V"
  2330.       ' Format Ultra Tracker
  2331.       GOSUB stop_voices
  2332.       GOSUB load_module_ult
  2333.     ELSE
  2334.       ' Autre format ?
  2335.       erreur%=4                 ! Format non reconnu
  2336.       GOTO ld_module2_fin
  2337.     ENDIF
  2338.   ENDIF
  2339. ld_module2_reorg:
  2340.   IF erreur%=0
  2341.     ' Reorganise un peut tout ca
  2342.     para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  2343.     FOR i%=1 TO 255
  2344.       ~C:rr_boucle_sample%(W:i%)
  2345.     NEXT i%
  2346.     module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  2347.     module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  2348.     ARRAYFILL pattern_bidon%(),0
  2349.     bl_start&=0
  2350.     bl_end&=0
  2351.     bl_trk&=0
  2352.     bl_pat&=0
  2353.     IF mastervol%=0
  2354.       DPOKE r_master_vol%,MIN(DIV(&H3000,ADD(nbr_track%,4)),&H500)
  2355.     ELSE
  2356.       DPOKE r_master_vol%,mastervol%
  2357.     ENDIF
  2358.     GOSUB chg_tempo(tempo%)
  2359.     DPOKE r_mod_speed%,ticks%
  2360.     DPOKE r_mod_nbrtrack%,nbr_track%
  2361.     GOSUB set_balance(balance$)
  2362.   ENDIF
  2363. ld_module2_fin:
  2364.   GOSUB garbage_collection
  2365.   CLOSE #0
  2366.   ~FRE(0)
  2367. RETURN
  2368. PROCEDURE load_module_gtk               !!!
  2369.   ' Modules GTK
  2370.   ' header$ : 4096 octets du debut du module
  2371. ld_module_gtk_fin:
  2372. RETURN
  2373. PROCEDURE load_module_gtk_mem
  2374.   ' Conversion d'un module au format GTK (ancien format interne) deja en memoire
  2375.   ' header$ : 4096 octets du debut du module
  2376.   LOCAL a%,b%,c%,i%,nvf%,pt%,nbs%,nbl%,adi$
  2377.   ~FRE(0)
  2378.   nvf%=BYTE{ADD(admod%,3)}              ! Numero de version du format
  2379.   nbl%=CARD{ADD(admod%,198)}            ! Nombre de lignes
  2380.   GOSUB new_pattern_format(CARD{ADD(admod%,200)})
  2381.   BMOVE admod%,V:module&(0),&HCE
  2382.   nbs%=module&(98)
  2383.   module&(98)=255
  2384.   pt%=ADD(admod%,&HCE)                  ! Pointe dans le fichier en memoire
  2385.   '
  2386.   ' Les headers des instruments
  2387.   '
  2388.   FOR i%=1 TO nbs%
  2389.     GOSUB chg_samplename2(pt%,28,i%)
  2390.     GOSUB chg_instrname2(pt%,28,i%)
  2391.     IF nvf%>2
  2392.       GOSUB chg_sam_balance(i%,CARD{ADD(pt%,42)})
  2393.     ELSE
  2394.       SUB pt%,16
  2395.     ENDIF
  2396.     IF nvf%>1
  2397.       GOSUB chg_sam_nbits(i%,CARD{ADD(pt%,44)})
  2398.       GOSUB chg_sam_freq(i%,CARD{ADD(pt%,46)})
  2399.     ENDIF
  2400.     GOSUB chg_sam_length(i%,LONG{ADD(pt%,48)})
  2401.     GOSUB chg_sam_repeat(i%,LONG{ADD(pt%,52)})
  2402.     GOSUB chg_sam_replen(i%,LONG{ADD(pt%,56)})
  2403.     GOSUB chg_ins_volume(i%,CARD{ADD(pt%,60)})
  2404.     GOSUB chg_sam_volume(i%,&H100)
  2405.     GOSUB chg_sam_finetune(i%,INT{ADD(pt%,62)})
  2406.     ADD pt%,64
  2407.   NEXT i%
  2408.   '
  2409.   ' La song
  2410.   '
  2411.   BMOVE pt%,V:song&(0),512
  2412.   ADD pt%,512
  2413.   a%=0
  2414.   FOR i%=0 TO PRED(module&(101))
  2415.     a%=MAX(a%,song&(i%))
  2416.   NEXT i%
  2417.   c%=MUL(MUL(SUCC(a%),MUL(nbr_track%,nbl%)),5)
  2418.   ~FRE(0)
  2419.   '
  2420.   ' Les patterns
  2421.   '
  2422.   GOSUB create_space_multipatchunk(STRING$(SUCC(a%),MKI$(nbr_track%)+MKI$(nbl%)),SUCC(a%),FALSE)
  2423.   c%=MUL(nbr_track%,nbl%)
  2424.   IF nvf%<4
  2425.     FOR i%=0 TO a%
  2426.       b%=FN adr_pat(i%)
  2427.       BMOVE pt%,b%,SHL(c%,2)
  2428.       ADD pt%,SHL(c%,2)
  2429.       ~C:g_convert_gtk_2_gtk_vol%(L:b%,L:c%)
  2430.     NEXT i%
  2431.   ELSE
  2432.     FOR i%=0 TO a%
  2433.       BMOVE pt%,FN adr_pat(i%),MUL(c%,5)
  2434.       ADD pt%,MUL(c%,5)
  2435.     NEXT i%
  2436.   ENDIF
  2437.   '
  2438.   ' Les instruments
  2439.   '
  2440.   adi$=""
  2441.   FOR i%=1 TO nbs%
  2442.     adi$=adi$+MKL$(pt%)
  2443.     ADD pt%,FN length(i%)
  2444.   NEXT i%
  2445.   FOR i%=1 TO nbs%
  2446.     GOSUB decale_sample(i%,nbs%,V:adi$)
  2447.   NEXT i%
  2448. ld_module_gtk_mem_fin:
  2449. RETURN
  2450. PROCEDURE load_module_gt2               !!!
  2451. RETURN
  2452. PROCEDURE load_module_gt2_mem
  2453.   ' Conversion d'un module au format GT2 (nouveau format interne) deja en memoire
  2454.   LOCAL a%,b%,c%,d%,e%,f%,i%,j%,finmod%,flags%,linestoadd%
  2455.   LOCAL orchchk%,patschk%,songchk%,tcn1chk%
  2456.   LOCAL adp$,ads$,adi$,ade$,map$
  2457.   ~FRE(0)
  2458.   '
  2459.   ' Recherche des adresses de tous les chunks
  2460.   '
  2461.   finmod%=ADD(admod%,lonmod%)
  2462.   a%=ADD(admod%,LONG{ADD(admod%,4)})    ! Pointe sur le 2eme chunk du module
  2463.   adp$=STRING$(1024,0)                  ! Adresses des chunks des patterns
  2464.   ads$=STRING$(1024,0)                  ! Adresses des chunks des samples
  2465.   adi$=STRING$(1024,0)                  ! Adresses des chunks des instruments
  2466.   ade$=STRING$(768,0)                   ! Adresses des chunks des enveloppes
  2467.   songchk%=0
  2468.   patschk%=0
  2469.   orchchk%=0
  2470.   tcn1chk%=0
  2471.   WHILE a%<finmod%
  2472.     SELECT LONG{a%}
  2473.     CASE "SONG"
  2474.       songchk%=a%
  2475.     CASE "TCN1"
  2476.       tcn1chk%=a%
  2477.     CASE "PATS"
  2478.       patschk%=a%
  2479.     CASE "PATD"
  2480.       LONG{ADD(V:adp$,SHL(CARD{ADD(a%,8)},2))}=a%
  2481.     CASE "ORCH"
  2482.       orchchk%=a%
  2483.     CASE "INST"
  2484.       LONG{ADD(V:adi$,SHL(CARD{ADD(a%,8)},2))}=a%
  2485.     CASE "SAMP"
  2486.       LONG{ADD(V:ads$,SHL(CARD{ADD(a%,8)},2))}=a%
  2487.     CASE "VENV"
  2488.       LONG{ADD(V:ade$,MUL(CARD{ADD(a%,8)},12))}=a%
  2489.     CASE "TENV"
  2490.       LONG{ADD(V:ade$,ADD(MUL(CARD{ADD(a%,8)},12),4))}=a%
  2491.     CASE "PENV"
  2492.       LONG{ADD(V:ade$,ADD(MUL(CARD{ADD(a%,8)},12),8))}=a%
  2493.     ENDSELECT
  2494.     ADD a%,LONG{ADD(a%,4)}              ! Chunk suivant
  2495.   WEND
  2496.   '
  2497.   ' Chargement des informations generales
  2498.   '
  2499.   GOSUB chg_songname2(ADD(admod%,8),32)
  2500.   GOSUB chg_songcomment2(ADD(admod%,40),160)
  2501.   mastervol%=CARD{ADD(admod%,232)}
  2502.   ticks%=CARD{ADD(admod%,228)}
  2503.   tempo%=CARD{ADD(admod%,230)}          ! Tempo
  2504.   BMOVE ADD(admod%,236),V:balance$,SHL(CARD{ADD(admod%,234)},1)
  2505.   '
  2506.   ' Recherche du nombre de lignes et de pistes
  2507.   '
  2508.   IF patschk%>0
  2509.     map$=""
  2510.     a%=CARD{ADD(patschk%,8)}            ! Nombre de pistes
  2511.     linestoadd%=0                       ! Nombre de lignes a ajouter au total
  2512.     FOR i%=0 TO 255
  2513.       c%=LONG{ADD(V:adp$,SHL(i%,2))}
  2514.       IF c%>0
  2515.         IF CARD{ADD(c%,26)}=0           ! Format de pattern 0 : donnees brutes
  2516.           ADD linestoadd%,SUB(CARD{ADD(c%,28)},1)
  2517.           map$=map$+MKI$(a%)+MKI$(CARD{ADD(c%,28)})
  2518.         ELSE
  2519.           map$=map$+MKI$(a%)+MKI$(1)
  2520.         ENDIF
  2521.       ELSE
  2522.         map$=map$+MKI$(a%)+MKI$(1)
  2523.       ENDIF
  2524.     NEXT i%
  2525.     GOSUB new_pattern_format(a%)
  2526.   ENDIF
  2527.   '
  2528.   ' Les configurations
  2529.   '
  2530.   IF tcn1chk%>0 AND flag_gt2cnf!
  2531.     songpos%=CARD{ADD(tcn1chk%,10)}
  2532.     posligne%=CARD{ADD(tcn1chk%,12)}
  2533.     n_preset%=CARD{ADD(tcn1chk%,14)}
  2534.     GOSUB chg_type_affpiste(CARD{ADD(tcn1chk%,16)})
  2535.     curs_col%=CARD{ADD(tcn1chk%,18)}
  2536.     curs_x%=CARD{ADD(tcn1chk%,20)}
  2537.     flags%=CARD{ADD(tcn1chk%,22)}
  2538.     play%=flags% AND 3
  2539.     edit%=SHR(flags%,2) AND 1
  2540.     octave%=CARD{ADD(tcn1chk%,24)}
  2541.     line_step%=CARD{ADD(tcn1chk%,26)}
  2542.     instr%=CARD{ADD(tcn1chk%,28)}
  2543.     sample%=CARD{ADD(tcn1chk%,30)}
  2544.     FOR i%=0 TO 31                              ! Les presets
  2545.       nbr_colonnes%(i%)=CARD{ADD(tcn1chk%,ADD(32,SHL(i%,1)))}
  2546.     NEXT i%
  2547.     ' *** Penser aux noms
  2548.     BMOVE ADD(tcn1chk%,608),V:preset&(0,0),2048
  2549.     a%=LONG{ADD(tcn1chk%,2656)}                 ! Les pistes on/off
  2550.     FOR i%=0 TO 31
  2551.       DPOKE ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,i%)),BTST(a%,i%) AND 1
  2552.     NEXT i%
  2553.   ENDIF
  2554.   '
  2555.   ' Chargement de la song
  2556.   '
  2557.   IF songchk%>0
  2558.     module&(101)=CARD{ADD(songchk%,8)}
  2559.     module&(102)=CARD{ADD(songchk%,10)}
  2560.     FOR i%=0 TO PRED(FN song_length)
  2561.       song&(i%)=CARD{ADD(ADD(songchk%,12),SHL(i%,1))}
  2562.     NEXT i%
  2563.   ENDIF
  2564.   '
  2565.   ' Chargement des patterns
  2566.   '
  2567.   IF patschk%>0
  2568.     GOSUB create_space_multipatchunk(map$,256,TRUE)
  2569.     FOR i%=0 TO 255
  2570.       a%=LONG{ADD(V:adp$,SHL(i%,2))}
  2571.       IF a%>0
  2572.         GOSUB chg_patternname2(ADD(a%,10),16,i%)
  2573.         IF CARD{ADD(a%,26)}=0           ! Format de pattern 0 : donnees brutes
  2574.           b%=CARD{ADD(a%,28)}           ! Nombre de lignes de ce pattern
  2575.           ' Ignore le nombre de voies
  2576.           ~C:g_bmove%(L:ADD(a%,32),L:FN adr_pat(i%),L:MUL(MUL(nbr_track%,b%),5))
  2577.         ENDIF
  2578.       ENDIF
  2579.     NEXT i%
  2580.   ENDIF
  2581.   '
  2582.   ' Chargement des instruments
  2583.   '
  2584.   FOR i%=1 TO 255
  2585.     a%=LONG{ADD(V:adi$,SHL(i%,2))}
  2586.     IF a%>0
  2587.       BMOVE a%,V:instrset%(0,i%),LONG{ADD(a%,4)}
  2588.     ENDIF
  2589.   NEXT i%
  2590.   '
  2591.   ' Chargement des enveloppes
  2592.   '
  2593.   FOR i%=1 TO 63
  2594.     FOR j%=0 TO 2
  2595.       a%=LONG{ADD(V:ade$,SHL(ADD(MUL(i%,3),j%),2))}
  2596.       IF a%>0
  2597.         b%=LONG{ADD(a%,4)}              ! Taille du chunk
  2598.         c%=CARD{ADD(a%,30)}             ! Taille de la section Attack
  2599.         GOSUB chg_env_length(i%,j%,0,c%)
  2600.         GOSUB chg_env_length(i%,j%,1,SUB(SUB(b%,32),c%))
  2601.         BMOVE a%,FN env_chunkadr(i%,j%),b%
  2602.       ENDIF
  2603.     NEXT j%
  2604.   NEXT i%
  2605.   '
  2606.   ' Chargement des samples
  2607.   '
  2608.   FOR i%=1 TO 255
  2609.     a%=LONG{ADD(V:ads$,SHL(i%,2))}
  2610.     IF a%>0
  2611.       b%=LONG{ADD(a%,4)}                ! Longueur du nouveau chunk
  2612.       c%=FN adrsamchk(i%)               ! Adresse de l'ancien chunk
  2613.       d%=FN lonsamchk(i%)               ! Longueur de l'ancien chunk
  2614.       e%=ADD(c%,b%)
  2615.       j%=SUCC(i%)
  2616.       WHILE j%<256
  2617.         f%=LONG{ADD(V:ads$,SHL(j%,2))}
  2618.         EXIT IF f%<e% AND f%>0
  2619.         INC j%                          ! Cherche si des samples genent
  2620.       WEND
  2621.       IF j%<256 OR flag_keep_buffer!    ! On est oblige de faire une rotation
  2622.         ~C:g_bmove%(L:a%,L:c%,L:d%)     ! Copie ce qui tient
  2623.         GOSUB mem_rotation(ADD(c%,d%),SUB(ADD(a%,b%),ADD(c%,d%)),SUB(b%,d%))    ! et deplace le reste
  2624.         ADD translate%,SUB(b%,d%)
  2625.         IF i%<255
  2626.           FOR j%=SUCC(i%) TO 255        ! Remise a jour des chunks de sample
  2627.             GOSUB chg_sam_chunkadr(j%,ADD(FN adrsamchk(j%),SUB(b%,d%)))
  2628.             e%=LONG{ADD(V:ads$,SHL(j%,2))}
  2629.             IF e%>0 AND e%<a%
  2630.               LONG{ADD(V:ads$,SHL(j%,2))}=ADD(e%,SUB(b%,d%))
  2631.             ENDIF
  2632.           NEXT j%
  2633.         ENDIF
  2634.       ELSE
  2635.         IF i%<255
  2636.           ~C:g_bmove%(L:ADD(c%,d%),L:ADD(c%,b%),L:SUB(FN adr_buffer,ADD(c%,d%)))
  2637.         ENDIF
  2638.         ~C:g_bmove%(L:a%,L:c%,L:b%)
  2639.         IF i%<255
  2640.           FOR j%=SUCC(i%) TO 255        ! Remise a jour des chunks de sample
  2641.             GOSUB chg_sam_chunkadr(j%,ADD(FN adrsamchk(j%),SUB(b%,d%)))
  2642.           NEXT j%
  2643.         ENDIF
  2644.       ENDIF
  2645.     ENDIF
  2646.   NEXT i%
  2647. RETURN
  2648. PROCEDURE load_module_mod               !!!
  2649.   ' Modules classiques type ProTracker Amiga
  2650.   ' header$ : 4096 octets du debut du module
  2651. ld_module_mod_fin:
  2652. RETURN
  2653. PROCEDURE load_module_mod_mem
  2654.   ' Modules classiques type ProTracker Amiga, deja en memoire
  2655.   ' header$ : 4096 octets du debut du module
  2656.   LOCAL pt%,a%,b%,i%,nbl%,nbt%
  2657.   LOCAL a&
  2658.   LOCAL flag_digital!,flag_intel!
  2659.   LOCAL chk$,chknbv$,chunk$,adi$
  2660.   ~FRE(0)
  2661.   '
  2662.   ' Trouve le bon format
  2663.   '
  2664.   flag_digital!=FALSE
  2665.   flag_intel!=FALSE
  2666.   chunk$="M.K.M&K&FLT4FLT6FLT8CD81M!K!RASP"
  2667.   chknbv$=MKL$(&H4040406)+MKL$(&H8080404)
  2668.   chk$=MID$(header$,&H439,4)
  2669.   a%=INSTR(chunk$,chk$)
  2670.   nbl%=64
  2671.   IF (a% AND 3)=1               ! Format courant
  2672.     nbt%=ASC(MID$(chknbv$,SUCC(SHR(PRED(a%),2)),1))
  2673.   ELSE IF RIGHT$(chk$,3)="CHN"  ! FastTracker
  2674.     nbt%=VAL(LEFT$(chk$,1))
  2675.   ELSE IF RIGHT$(chk$,2)="CH"   ! FastTracker
  2676.     nbt%=VAL(LEFT$(chk$,2))
  2677.   ELSE IF LEFT$(chk$,2)="FA"    ! Format Digital Tracker
  2678.     nbt%=VAL(RIGHT$(chk$,2))
  2679.     flag_digital!=TRUE
  2680.     nbl%=CARD{ADD(admod%,&H43C)}
  2681.   ENDIF
  2682.   GOSUB new_pattern_format(nbt%)
  2683.   pt%=admod%
  2684.   GOSUB chg_songname2(pt%,20)                   ! Le nom du module
  2685.   ADD pt%,20
  2686.   '
  2687.   ' Lit les entetes des instruments
  2688.   '
  2689.   FOR j%=1 TO 31
  2690.     GOSUB chg_samplename2(pt%,22,j%)
  2691.     GOSUB chg_instrname2(pt%,22,j%)
  2692.     a&=INT{ADD(pt%,22)}                 ! Longueur
  2693.     IF falg_intel!
  2694.       GOSUB intel_w(V:a&)
  2695.     ENDIF
  2696.     GOSUB chg_sam_length(j%,SHL(a& AND 65535,1))
  2697.     a&=BYTE{ADD(pt%,24)}                ! Finetune
  2698.     IF a&<8
  2699.       GOSUB chg_sam_finetune(j%,a&)
  2700.     ELSE
  2701.       GOSUB chg_sam_finetune(j%,SUB(a&,16))
  2702.     ENDIF
  2703.     a&=BYTE{ADD(pt%,25)}                ! Volume
  2704.     GOSUB chg_ins_volume(j%,SHL(a&,2))
  2705.     GOSUB chg_sam_volume(j%,&H100)
  2706.     a&=INT{ADD(pt%,26)}                 ! Repeat
  2707.     IF falg_intel!
  2708.       GOSUB intel_w(V:a&)
  2709.     ENDIF
  2710.     GOSUB chg_sam_repeat(j%,SHL(a& AND 65535,1))
  2711.     a&=INT{ADD(pt%,28)}                 ! Replen
  2712.     IF falg_intel!
  2713.       GOSUB intel_w(V:a&)
  2714.     ENDIF
  2715.     GOSUB chg_sam_replen(j%,SHL(a& AND 65535,1))
  2716.     ADD pt%,30
  2717.   NEXT j%
  2718.   '
  2719.   ' La song
  2720.   '
  2721.   module&(101)=BYTE{pt%}        ! Longueur
  2722.   a&=BYTE{SUCC(pt%)}            ! Boucle
  2723.   ADD pt%,2
  2724.   IF a&>PRED(module&(101))
  2725.     a&=0
  2726.   ENDIF
  2727.   module&(102)=a&
  2728.   a%=0                          ! Numero du dernier pattern sauve
  2729.   FOR i%=0 TO 127               ! La song
  2730.     song&(i%)=BYTE{ADD(pt%,i%)}
  2731.     a%=MAX(a%,song&(i%))
  2732.   NEXT i%
  2733.   '
  2734.   ' Chargement des patterns
  2735.   '
  2736.   GOSUB create_space_multipatchunk(STRING$(SUCC(a%),MKI$(nbt%)+MKI$(nbl%)),SUCC(a%),FALSE)
  2737.   IF flag_digital!
  2738.     pt%=ADD(admod%,&H440)       ! Les patterns (pour DT)
  2739.   ELSE
  2740.     pt%=ADD(admod%,&H43C)       ! Les patterns (modules courants)
  2741.   ENDIF
  2742.   b%=MUL(SUCC(a%),SHL(MUL(nbl%,nbr_track%),2))
  2743.   '
  2744.   ' Conversion des patterns
  2745.   '
  2746.   c%=MUL(nbl%,nbr_track%)
  2747.   FOR i%=0 TO a%
  2748.     a%=FN adr_pat(i%)
  2749.     ~C:g_bmove%(L:pt%,L:a%,L:SHL(c%,2))
  2750.     ADD pt%,SHL(c%,2)
  2751.     ~C:g_convert_nt_2_gtk%(L:a%,L:c%)
  2752.   NEXT i%
  2753.   '
  2754.   ' Les samples
  2755.   '
  2756.   adi$=""
  2757.   FOR i%=1 TO 31
  2758.     adi$=adi$+MKL$(pt%)
  2759.     ADD pt%,FN length(i%)
  2760.   NEXT i%
  2761.   FOR i%=1 TO 31
  2762.     GOSUB decale_sample(i%,31,V:adi$)
  2763.   NEXT i%
  2764. ld_module_mod_mem_fin:
  2765. RETURN
  2766. PROCEDURE load_module_octamed           !!!
  2767.   ' Chargement d'un module au format OctaMED Pro Amiga
  2768.   ' header$ : 4096 octets du debut du module
  2769. RETURN
  2770. PROCEDURE load_module_octamed_mem       !!!
  2771.   ' Chargement d'un module au format OctaMED Pro Amiga deja en memoire
  2772.   LOCAL a%,asc%,b%,c%,d%,e%,flags%,flags2%,i%,instrhdr%,j%,k%,l%
  2773.   LOCAL mmd0song%,mmd0block%,mmd0exp%,nbi%,nbs%,no%,rl%,rs%,sc%,t%,type%,wf%
  2774.   LOCAL a$,adi$,b$,octstart$,samiff$,transpose$,map$
  2775.   ~FRE(0)
  2776.   '
  2777.   ' Recherche des adresses de principaux chunks
  2778.   ' et des principales informations
  2779.   '
  2780.   mmd0song%=ADD(admod%,LONG{ADD(admod%,8)})     ! Pointe sur le header de la song
  2781.   mmd0block%=ADD(admod%,LONG{ADD(admod%,16)})   ! Pointe sur les offsets des patterns
  2782.   instrhdr%=ADD(admod%,LONG{ADD(admod%,24)})
  2783.   mmd0exp%=ADD(admod%,LONG{ADD(admod%,32)})     ! Pointe sur les donnees d'expansion
  2784.   ' Recherche nombre voies/piste
  2785.   numblock%=CARD{ADD(mmd0song%,504)}            ! Nombre de patterns
  2786.   t%=1
  2787.   map$=""
  2788.   FOR i%=0 TO PRED(numblock%)
  2789.     a%=LONG{ADD(mmd0block%,SHL(i%,2))}          ! Offset du header du pattern i
  2790.     IF a%>0
  2791.       t%=MAX(t%,CARD{ADD(admod%,a%)})
  2792.       l%=SUCC(CARD{ADD(ADD(admod%,a%),2)})
  2793.       map$=map$+MKI$(1)+MKI$(l%)
  2794.     ELSE
  2795.       map$=map$+MKI$(1)+MKI$(1)
  2796.     ENDIF
  2797.   NEXT i%
  2798.   FOR i%=0 TO SHL(PRED(numblock%),2) STEP 4
  2799.     CARD{ADD(V:map$,i%)}=t%
  2800.   NEXT i%
  2801.   GOSUB new_pattern_format(t%)
  2802.   GOSUB create_space_multipatchunk(map$,numblock%,TRUE)
  2803.   flags%=BYTE{ADD(mmd0song%,767)}
  2804.   flags2%=BYTE{ADD(mmd0song%,768)}
  2805.   ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2806.   ' PRINT AT(1,5);CARD{ADD(mmd0song%,764)},SUCC(flag2% AND 31),BYTE{ADD(mmd0song%,769)}
  2807.   ' IF BTST(flags2%,5)
  2808.   '   PRINT "Ok"
  2809.   ' ENDIF
  2810.   ' ~INP(2)
  2811.   ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2812.   ' Le Tempo
  2813.   ' IF BTST(flags2%,5)
  2814.   '   tempo%=CARD{ADD(mmd0song%,764)}             ! BPM
  2815.   ' ENDIF
  2816.   ' b%=SUCC(flags2% AND 31)
  2817.   '
  2818.   ' La song
  2819.   '
  2820.   module&(101)=CARD{ADD(mmd0song%,506)}
  2821.   module&(102)=0
  2822.   FOR i%=0 TO PRED(FN song_length)
  2823.     song&(i%)=BYTE{ADD(ADD(mmd0song%,508),i%)}
  2824.   NEXT i%
  2825.   '
  2826.   ' Les patterns
  2827.   '
  2828.   transpose$=STRING$(64,35)
  2829.   FOR i%=0 TO PRED(numblock%)
  2830.     a%=LONG{ADD(mmd0block%,SHL(i%,2))}
  2831.     IF a%>0
  2832.       t%=CARD{ADD(admod%,a%)}
  2833.       l%=SUCC(CARD{ADD(admod%,ADD(a%,2))})
  2834.       IF t%>0 AND l%>0
  2835.         e%=ADD(admod%,ADD(a%,8))
  2836.         d%=SUB(nbr_track%,t%)
  2837.         b%=FN adr_pat(i%)
  2838.         c%=V:transpose$
  2839.         ~C:g_convert_mmd1_2_gtk%(L:e%,L:b%,L:c%,W:t%,W:l%,W:d%)
  2840.       ENDIF
  2841.     ENDIF
  2842.   NEXT i%
  2843.   '
  2844.   ' Les headers d'instruments
  2845.   '
  2846.   nbi%=BYTE{ADD(mmd0song%,787)}                 ! Nbr d'instruments
  2847.   nbs%=0                                        ! Nombre actuel de samples decodes
  2848.   adi$=""
  2849.   samiff$="000000 432110 221100 110000 332210 543210 654321"
  2850.   octstart$="001224364860 121212122424 001212242436 001212243636 001212242424 121212121212 121212121212"
  2851.   FOR i%=1 TO nbi%
  2852.     a%=LONG{ADD(instrhdr%,SHL(PRED(i%),2))}
  2853.     IF a%>0
  2854.       ADD a%,admod%                             ! Pointe sur le header de l'instrument
  2855.       b%=ADD(mmd0song%,MUL(PRED(i%),8))         ! Pointe sur d'autres infos sur le sample
  2856.       t%=FN sbyte(BYTE{ADD(b%,7)})              ! Transposition generale de l'instrument
  2857.       GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(b%,6)},2))
  2858.       type%=INT{ADD(a%,4)}                      ! Type de l'instrument
  2859.       SELECT type%
  2860.       CASE 0 TO 6
  2861.         ' --- Sample de 1 a 7 octaves ---
  2862.         ' -------------------------------
  2863.       ld_mmd_samples:
  2864.         no%=VAL(MID$("1532467",SUCC(type%),1))  ! Nombre d'octaves dans l'instrument
  2865.         sc%=SUCC(nbs%)                          ! Sample en cours de traitement
  2866.         asc%=ADD(a%,6)                          ! Adr spl "   "    "    "
  2867.         FOR j%=0 TO PRED(no%)
  2868.           GOSUB chg_sam_nbits(sc%,1)
  2869.           GOSUB chg_sam_volume(sc%,&H100)
  2870.           GOSUB chg_sam_freq(sc%,8363)
  2871.           GOSUB chg_sam_finetune(sc%,0)         ! 0 par defaut, mais on voit plus tard si y en a
  2872.           rs%=SHL(CARD{b%},SUCC(j%))            ! Repeat
  2873.           rl%=SHL(CARD{ADD(b%,2)},SUCC(j%))     ! Replen
  2874.           IF type%=0                            ! Un sample/instr : on prend la longueur totale
  2875.             GOSUB chg_sam_length(sc%,LONG{a%} AND -2)
  2876.           ELSE                                  ! Sinon c'est repeat+replen
  2877.             GOSUB chg_sam_length(sc%,ADD(rs%,rl%))
  2878.           ENDIF
  2879.           GOSUB chg_sam_repeat(sc%,rs%)
  2880.           GOSUB chg_sam_replen(sc%,MAX(rl%,2))
  2881.           adi$=adi$+MKL$(asc%)
  2882.           ADD asc%,ADD(rs%,rl%)
  2883.           INC sc%
  2884.         NEXT j%
  2885.         ' Transpositions et affectation des samples aux instruments
  2886.         FOR j%=0 TO 5
  2887.           c%=ADD(VAL(MID$(samiff$,ADD(SUCC(MUL(type%,7)),j%),1)),SUCC(nbs%))
  2888.           d%=ADD(SUB(VAL(MID$(octstart$,ADD(SUCC(MUL(type%,13)),SHL(j%,1)),2)),MUL(j%,12)),t%)
  2889.           FOR k%=ADD(MUL(j%,12),36) TO ADD(MUL(j%,12),47)
  2890.             GOSUB chg_ins_sample(i%,k%,c%)      ! Sample
  2891.             GOSUB chg_ins_transp(i%,k%,d%)      ! Transposition
  2892.           NEXT k%
  2893.         NEXT j%
  2894.         FOR j%=1 TO 35
  2895.           GOSUB chg_ins_sample(i%,j%,FN isample(i%,36))
  2896.           GOSUB chg_ins_transp(i%,j%,FN itransp(i%,36))
  2897.         NEXT j%
  2898.         FOR j%=108 TO 127
  2899.           GOSUB chg_ins_sample(i%,j%,FN isample(i%,107))
  2900.           GOSUB chg_ins_transp(i%,j%,FN itransp(i%,107))
  2901.         NEXT j%
  2902.         GOSUB chg_ins_sample(i%,0,0)
  2903.         GOSUB chg_ins_transp(i%,0,0)
  2904.         ADD nbs%,no%
  2905.       CASE -1
  2906.         ' ---------- Synthetic ----------
  2907.         ' -------------------------------
  2908.         ' Ne prend pour l'instant en compte que la 1ere forme d'onde
  2909.         sc%=SUCC(nbs%)
  2910.         GOSUB chg_sam_nbits(sc%,1)
  2911.         GOSUB chg_sam_volume(sc%,&H100)
  2912.         GOSUB chg_sam_freq(sc%,8363)
  2913.         GOSUB chg_sam_finetune(sc%,0)
  2914.         wf%=ADD(a%,LONG{ADD(a%,278)})
  2915.         GOSUB chg_sam_length(sc%,SHL(CARD{wf%},1))
  2916.         GOSUB chg_sam_repeat(sc%,0)
  2917.         GOSUB chg_sam_replen(sc%,SHL(CARD{wf%},1))
  2918.         adi$=adi$+MKL$(ADD(wf%,2))
  2919.         FOR j%=1 TO 127
  2920.           GOSUB chg_ins_sample(i%,j%,sc%)
  2921.           GOSUB chg_ins_transp(i%,j%,SUB(t%,24))
  2922.         NEXT j%
  2923.         GOSUB chg_ins_sample(i%,0,0)
  2924.         GOSUB chg_ins_transp(i%,0,0)
  2925.         INC nbs%
  2926.         '
  2927.         '
  2928.         '
  2929.         '
  2930.       CASE -2
  2931.         ' ----------- Hybrid ------------
  2932.         ' -------------------------------
  2933.         '
  2934.         '
  2935.         '
  2936.         '
  2937.         b%=ADD(a%,8)                            ! Seulement valable pour Rep/Replen!!!
  2938.         a%=ADD(a%,LONG{ADD(a%,278)})            ! Pointe sur un instrument classique
  2939.         type%=INT{ADD(a%,4)}                    ! Nouveau type de l'instrument
  2940.         GOTO ld_mmd_samples
  2941.       ENDSELECT
  2942.     ENDIF
  2943.   NEXT i%
  2944.   '
  2945.   ' Donnees d'expansion
  2946.   '
  2947.   IF mmd0exp%>admod%
  2948.     ' --- Finetunes ---
  2949.     a%=LONG{ADD(mmd0exp%,4)}
  2950.     b%=CARD{ADD(mmd0exp%,8)}
  2951.     c%=CARD{ADD(mmd0exp%,10)}
  2952.     IF a%>0 AND b%>0 AND c%=>4
  2953.       FOR i%=1 TO MIN(nbi%,b%)
  2954.         a$=FN ins_used_samples$(i%)
  2955.         IF LEN(a$)>0
  2956.           d%=FN sbyte(BYTE{ADD(admod%,ADD(a%,3))})
  2957.           FOR j%=0 TO SUB(LEN(a$),2) STEP 2
  2958.             GOSUB chg_sam_finetune(CARD{ADD(V:a$,j%)},d%)
  2959.           NEXT j%
  2960.         ENDIF
  2961.         ADD a%,c%                       ! Structure suivante
  2962.       NEXT i%
  2963.     ENDIF
  2964.     ' --- Noms des instruments ---
  2965.     a%=LONG{ADD(mmd0exp%,20)}           ! a% sur les noms
  2966.     b%=CARD{ADD(mmd0exp%,24)}           ! b% nbr de noms
  2967.     c%=CARD{ADD(mmd0exp%,26)}           ! c% taille d'un nom
  2968.     IF a%>0 AND b%>0 AND c%>0           ! S'il y a bien des noms
  2969.       FOR i%=1 TO MIN(nbi%,b%)
  2970.         GOSUB chg_instrname2(ADD(admod%,a%),c%,i%)
  2971.         a$=FN ins_used_samples$(i%)
  2972.         b$=SPACE$(28)
  2973.         BMOVE ADD(admod%,a%),V:b$,MIN(c%,28)
  2974.         IF LEN(a$)=2                    ! 1 seul sample
  2975.           GOSUB chg_samplename(b$,CARD{V:a$})
  2976.         ELSE IF LEN(a$)>2               ! Pluseurs samples d'octaves differents
  2977.           FOR j%=0 TO SUB(LEN(a$),2) STEP 2
  2978.             b$=LEFT$(b$,25)+"("+STR$(SUCC(SHR(j%,1)))+")"
  2979.             GOSUB chg_samplename(b$,CARD{ADD(V:a$,j%)})
  2980.           NEXT j%
  2981.         ENDIF
  2982.         ADD a%,c%                       ! Structure suivante
  2983.       NEXT i%
  2984.     ENDIF
  2985.     ' --- Nom de la chanson ---
  2986.     a%=LONG{ADD(mmd0exp%,44)}
  2987.     b%=LONG{ADD(mmd0exp%,48)}
  2988.     IF a%>0 AND b%>0
  2989.       GOSUB chg_songname2(ADD(a%,admod%),b%)
  2990.     ELSE
  2991.       GOSUB chg_songname("")
  2992.     ENDIF
  2993.   ENDIF
  2994.   '
  2995.   ' Les donnees des samples
  2996.   '
  2997.   IF nbs%>0
  2998.     FOR i%=1 TO nbs%
  2999.       GOSUB decale_sample(i%,nbs%,V:adi$)
  3000.     NEXT i%
  3001.   ENDIF
  3002. RETURN
  3003. PROCEDURE load_module_669               !!!
  3004.   ' Chargement d'un module au format 669
  3005.   ' header$ : 4096 octets du debut du module
  3006. RETURN
  3007. PROCEDURE load_module_669_mem
  3008.   ' Chargement d'un module au format 669 deja en memoire
  3009.   ' header$ : 4096 octets du debut du module
  3010.   LOCAL pt%,a%,b%,c%,i%,j%,nbs%,nbp%,res%,sec%,tem%,brk%,os$
  3011.   ~FRE(0)
  3012.   GOSUB new_pattern_format(9)           ! 8 + 1 voies
  3013.   GOSUB chg_songname2(ADD(admod%,2),108)
  3014.   nbs%=BYTE{ADD(admod%,110)}            ! nbs% = nombre de samples
  3015.   nbp%=BYTE{ADD(admod%,111)}            ! nbp% = nombre de patterns
  3016.   res%=BYTE{ADD(admod%,112)}            ! res% = position de rebouclage
  3017.   sec%=ADD(admod%,113)
  3018.   tem%=ADD(admod%,241)
  3019.   brk%=ADD(admod%,369)
  3020.   '
  3021.   ' Les headers des instruments
  3022.   '
  3023.   IF nbs%>0
  3024.     pt%=ADD(admod%,497)
  3025.     a%=0
  3026.     b%=ADD(497,ADD(MUL(nbs%,25),MUL(nbp%,&H600)))       ! b% = offset de sample
  3027.     os$=""
  3028.     FOR i%=1 TO nbs%
  3029.       os$=os$+MKL$(ADD(b%,admod%))
  3030.       GOSUB chg_samplename2(pt%,13,i%)
  3031.       GOSUB chg_instrname2(pt%,13,i%)
  3032.       ADD pt%,13
  3033.       a%=LONG{pt%}
  3034.       ADD pt%,4
  3035.       GOSUB intel_l(V:a%)
  3036.       ADD b%,a%
  3037.       a%=a% AND -2
  3038.       GOSUB chg_sam_length(i%,a%)
  3039.       a%=LONG{pt%}
  3040.       ADD pt%,4
  3041.       GOSUB intel_l(V:a%)
  3042.       a%=a% AND -2
  3043.       GOSUB chg_sam_repeat(i%,a%)
  3044.       a%=LONG{pt%}
  3045.       ADD pt%,4
  3046.       GOSUB intel_l(V:a%)
  3047.       IF a%<&HFFFF0
  3048.         a%=SUB(a%,FN replen(i%)) AND -2
  3049.       ELSE
  3050.         GOSUB chg_sam_repeat(i%,0)
  3051.         a%=2
  3052.       ENDIF
  3053.       GOSUB chg_sam_volume(i%,&H100)
  3054.       GOSUB chg_sam_replen(i%,a%)
  3055.       GOSUB chg_sam_freq(i%,&H12224)            ! 8740 Hz
  3056.     NEXT i%
  3057.   ENDIF
  3058.   '
  3059.   ' Les patterns
  3060.   '
  3061.   IF nbp%>0
  3062.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(9)+MKI$(64)),nbp%,TRUE)
  3063.     pt%=ADD(admod%,ADD(497,MUL(nbs%,25)))
  3064.     FOR i%=0 TO PRED(nbp%)
  3065.       b%=FN adr_pat(i%)
  3066.       ~C:g_convert_669_2_gtk%(L:pt%,L:b%)
  3067.       LONG{b%}=ADD(&HA800,BYTE{ADD(tem%,i%)})           ! Vitesse du pattern
  3068.       LONG{ADD(b%,MUL(BYTE{ADD(brk%,i%)},45))}=&HD00    ! Fin du pattern
  3069.       ADD pt%,&H600
  3070.     NEXT i%
  3071.   ENDIF
  3072.   '
  3073.   ' La song
  3074.   '
  3075.   FOR i%=0 TO 127
  3076.     IF BYTE{ADD(sec%,i%)}=255
  3077.       a%=i%
  3078.       i%=127
  3079.     ELSE
  3080.       song&(i%)=BYTE{ADD(sec%,i%)}
  3081.     ENDIF
  3082.   NEXT i%
  3083.   a%=MAX(1,a%)
  3084.   module&(101)=a%
  3085.   module&(102)=MIN(res%,PRED(a%))
  3086.   '
  3087.   ' Les instruments
  3088.   '
  3089.   IF nbs%>0
  3090.     FOR i%=1 TO nbs%
  3091.       b%=FN length(i%)
  3092.       IF b%>0
  3093.         GOSUB decale_sample(i%,nbs%,V:os$)
  3094.         a%=FN adresse(i%)
  3095.         ~C:g_signe_sample%(L:a%,L:b%,W:1)
  3096.       ENDIF
  3097.     NEXT i%
  3098.   ENDIF
  3099.   FOR i%=2 TO 16 STEP 2
  3100.     CARD{ADD(V:balance$,i%)}=MUL(SHR(SUB(i%,2),1) AND 1,&HFFF)
  3101.   NEXT i%
  3102.   tick%=4
  3103.   tempo%=80
  3104.   ~FRE(0)
  3105. RETURN
  3106. PROCEDURE load_module_mtm               !!!
  3107.   ' Chargement d'un module au format Multi Tracker
  3108.   ' header$ : 4096 octets du debut du module
  3109. RETURN
  3110. PROCEDURE load_module_mtm_mem
  3111.   ' Chargement d'un module au format Multi Tracker deja en memoire
  3112.   ' header$ : 4096 octets du debut du module
  3113.   LOCAL pt%,a%,b%,c%,d%,i%,j%,k%,lon%,nbp%,nps%,nbt%,sle%,nbl%,p1%,p2%,p3%,p4%
  3114.   LOCAL os$
  3115.   ~FRE(0)
  3116.   GOSUB clear_song(TRUE)
  3117.   GOSUB chg_songname2(ADD(admod%,4),20)
  3118.   GOSUB intel_w(ADD(admod%,24))
  3119.   GOSUB intel_w(ADD(admod%,28))
  3120.   nbt%=CARD{ADD(admod%,24)}             ! Nombre de pistes sauvees
  3121.   nbp%=SUCC(BYTE{ADD(admod%,26)})       ! Nombre de patterns
  3122.   lon%=SUCC(BYTE{ADD(admod%,27)})       ! Nombre de positions
  3123.   sle%=CARD{ADD(admod%,28)}             ! Song Length Extra-comment
  3124.   nbs%=BYTE{ADD(admod%,30)}             ! Nombre de samples
  3125.   nbl%=BYTE{ADD(admod%,32)}             ! Nombre de lignes
  3126.   GOSUB new_pattern_format(BYTE{ADD(admod%,33)})
  3127.   GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(BYTE{ADD(admod%,33)})+MKI$(nbl%)),nbp%,TRUE)
  3128.   module&(101)=MAX(lon%,1)
  3129.   FOR i%=0 TO PRED(nbr_track%)          ! Regle la balance de chaque piste
  3130.     CARD{ADD(V:balance$,SHL(i%,1))}=VAL("&H"+MID$("000100200300400500600700800924A48B6CC90DB4ED8FFF",SUCC(MUL(BYTE{ADD(admod%,ADD(i%,34))},3)),3))
  3131.   NEXT i%
  3132.   p1%=ADD(66,MUL(nbs%,37))              ! Pointe sur la sequence
  3133.   p2%=ADD(ADD(p1%,128),MUL(nbt%,192))   ! Pointe sur la disposition des pistes
  3134.   p3%=ADD(p2%,MUL(nbp%,64))             ! Pointe sur l'extra-comment
  3135.   p4%=ADD(p3%,sle%)                     ! Pointe sur les samples
  3136.   '
  3137.   ' Chargement des headers des samples
  3138.   '
  3139.   IF nbs%>0
  3140.     pt%=ADD(admod%,66)
  3141.     os$=""
  3142.     a%=p4%                              ! Offset du premier sample
  3143.     FOR i%=1 TO nbs%
  3144.       GOSUB chg_samplename2(pt%,22,i%)
  3145.       GOSUB chg_instrname2(pt%,22,i%)
  3146.       GOSUB intel_l(ADD(pt%,22))
  3147.       GOSUB intel_l(ADD(pt%,26))
  3148.       GOSUB intel_l(ADD(pt%,30))
  3149.       b%=LONG{ADD(pt%,22)}
  3150.       os$=os$+MKL$(ADD(admod%,a%))
  3151.       ADD a%,b%
  3152.       b%=b% AND -2
  3153.       ADD d%,b%
  3154.       c%=MAX(MIN(LONG{ADD(pt%,26)} AND -2,SUB(b%,2)),0)
  3155.       GOSUB chg_sam_nbits(i%,SUCC(BYTE{ADD(pt%,36)} AND 1))
  3156.       GOSUB chg_sam_length(i%,b%)
  3157.       GOSUB chg_sam_repeat(i%,c%)
  3158.       GOSUB chg_sam_replen(i%,MAX(MIN(SUB(LONG{ADD(pt%,30)},c%),SUB(b%,c%)) AND -2,2))
  3159.       GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(pt%,35)},2))
  3160.       GOSUB chg_sam_volume(i%,&H100)
  3161.       b%=BYTE{ADD(pt%,36)}
  3162.       IF b%>7
  3163.         SUB b%,16
  3164.       ENDIF
  3165.       GOSUB chg_sam_finetune(i%,b%)
  3166.       ADD pt%,37
  3167.     NEXT i%
  3168.   ENDIF
  3169.   '
  3170.   ' Chargement de la song
  3171.   '
  3172.   pt%=ADD(admod%,p1%)
  3173.   FOR i%=0 TO PRED(lon%)
  3174.     song&(i%)=BYTE{ADD(pt%,i%)}
  3175.   NEXT i%
  3176.   '
  3177.   ' Chargement des patterns
  3178.   '
  3179.   d%=ADD(admod%,p2%)
  3180.   FOR i%=d% TO ADD(d%,SUB(MUL(nbp%,64),2)) STEP 2
  3181.     GOSUB intel_w(i%)
  3182.   NEXT i%
  3183.   pt%=ADD(admod%,ADD(p1%,128))
  3184.   FOR i%=1 TO nbt%
  3185.     b%=0
  3186.     FOR j%=0 TO MUL(PRED(nbp%),64) STEP 64
  3187.       a%=FN adr_pat(b%)
  3188.       FOR k%=j% TO ADD(j%,SHL(PRED(nbr_track%),1)) STEP 2
  3189.         IF i%=CARD{ADD(d%,k%)}
  3190.           ~C:g_convert_mtmv_2_gtk%(L:pt%,L:a%,W:nbr_track%,W:nbl%)
  3191.         ENDIF
  3192.         ADD a%,5
  3193.       NEXT k%
  3194.       INC b%
  3195.     NEXT j%
  3196.     ADD pt%,192
  3197.   NEXT i%
  3198.   '
  3199.   ' Charge les instruments
  3200.   '
  3201.   IF nbs%>0
  3202.     FOR i%=1 TO nbs%
  3203.       b%=FN length(i%)
  3204.       IF b%>0
  3205.         GOSUB decale_sample(i%,nbs%,V:os$)
  3206.         a%=FN adresse(i%)
  3207.         c%=FN resol(i%)
  3208.         IF c%=2
  3209.           ~C:g_intel_16_bits%(L:a%,L:b%)
  3210.         ENDIF
  3211.         ~C:g_signe_sample%(L:a%,L:b%,W:c%)
  3212.       ENDIF
  3213.     NEXT i%
  3214.   ENDIF
  3215.   ~FRE(0)
  3216. RETURN
  3217. PROCEDURE load_module_s3m               !!!
  3218.   ' Chargement d'un module au format Scream Tracker 3
  3219.   ' header$ : 4096 octets du debut du module
  3220. RETURN
  3221. PROCEDURE load_module_s3m_mem
  3222.   ' Chargement d'un module au format Scream Tracker 3 deja en memoire
  3223.   ' header$ : 4096 octets du debut du module
  3224.   LOCAL pt%,a%,b%,c%,d%,convtrk$,ffv%,flg%,i%,j%,lon%,nbp%,nbs%,xxx1%,xxx2%,xxx3%,os$
  3225.   ~FRE(0)
  3226.   GOSUB chg_songname2(admod%,28)
  3227.   GOSUB intel_w(ADD(admod%,&H20))
  3228.   GOSUB intel_w(ADD(admod%,&H22))
  3229.   GOSUB intel_w(ADD(admod%,&H24))
  3230.   GOSUB intel_w(ADD(admod%,&H2A))
  3231.   lon%=CARD{ADD(admod%,&H20)}           ! Longueur de la song (pair)
  3232.   nbs%=CARD{ADD(admod%,&H22)}           ! Nombre de samples
  3233.   nbp%=CARD{ADD(admod%,&H24)}           ! Nombre de patterns sauves
  3234.   ffv%=CARD{ADD(admod%,&H2A)}           ! File Format Version
  3235.   ticks%=BYTE{ADD(admod%,&H31)}         ! Vitesse
  3236.   tempo%=BYTE{ADD(admod%,&H32)}         ! Tempo
  3237.   xxx1%=ADD(&H60,SUCC(lon%) AND -2)     ! Ca doit toujours etre pair mais on ne sait jamais...
  3238.   xxx2%=ADD(xxx1%,SHL(nbs%,1))
  3239.   xxx3%=ADD(xxx2%,SHL(nbp%,1))
  3240.   '
  3241.   ' Recherche du nombre de voies
  3242.   '
  3243.   nbt%=0                                ! Nombre de voies
  3244.   convtrk$=""
  3245.   FOR i%=0 TO 31
  3246.     b%=BYTE{ADD(admod%,ADD(i%,&H40))} AND 127
  3247.     IF b%<16
  3248.       convtrk$=convtrk$+CHR$(nbt%)
  3249.       CARD{ADD(V:balance$,SHL(nbt%,1))}=MUL(SHR(b%,3),&HFFF)
  3250.       INC nbt%
  3251.     ELSE
  3252.       convtrk$=convtrk$+CHR$(255)
  3253.     ENDIF
  3254.   NEXT i%
  3255.   IF nbt%>0
  3256.     GOSUB new_pattern_format(nbt%)
  3257.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbt%)+MKI$(64)),nbp%,TRUE)
  3258.     '
  3259.     ' Les pan positions
  3260.     '
  3261.     IF BYTE{ADD(admod%,&H35)}=252
  3262.       FOR i%=0 TO PRED(nbt%)
  3263.         a%=BYTE{ADD(ADD(admod%,xxx3%),i%)}
  3264.         IF BTST(a%,5)
  3265.           a%=a% AND 15
  3266.           CARD{ADD(V:balance$,SHL(i%,1))}=MIN(DIV(MUL(a%,&H1000),15),&HFFF)
  3267.         ENDIF
  3268.       NEXT i%
  3269.     ENDIF
  3270.     '
  3271.     ' Chargement du header des samples
  3272.     '
  3273.     os$=""
  3274.     IF nbs%>0
  3275.       FOR i%=1 TO nbs%
  3276.         a%=ADD(admod%,ADD(xxx1%,SHL(PRED(i%),1)))
  3277.         GOSUB intel_w(a%)
  3278.         pt%=ADD(admod%,SHL(CARD{a%},4))
  3279.         a%=0
  3280.         IF BYTE{pt%}=1                    ! Est-ce bien un sample ?
  3281.           IF BYTE{ADD(pt%,&H1E)}=0        ! Sample non compacte
  3282.             GOSUB chg_samplename2(ADD(pt%,&H30),28,i%)
  3283.             GOSUB chg_instrname2(ADD(pt%,&H30),28,i%)
  3284.             GOSUB intel_w(ADD(pt%,&HE))
  3285.             GOSUB intel_l(ADD(pt%,&H10))
  3286.             GOSUB intel_l(ADD(pt%,&H14))
  3287.             GOSUB intel_l(ADD(pt%,&H18))
  3288.             GOSUB intel_l(ADD(pt%,&H20))
  3289.             flg%=BYTE{ADD(pt%,&H1F)}      ! Flags divers
  3290.             a%=MIN(MAX(LONG{ADD(pt%,&H10)},0),&HFFFFFE) AND -2
  3291.             IF BTST(flg%,0)               ! Boucle
  3292.               b%=MIN(MAX(LONG{ADD(pt%,&H14)},0) AND -2,SUB(a%,2))
  3293.               c%=MIN(MAX(SUB(MAX(LONG{ADD(pt%,&H18)},0) AND -2,b%),2),SUB(a%,b%))
  3294.             ELSE                          ! Pas boucle
  3295.               b%=0
  3296.               c%=2
  3297.             ENDIF
  3298.             GOSUB chg_sam_freq(i%,LONG{ADD(pt%,&H20)} AND 65535)
  3299.             GOSUB chg_sam_nbits(i%,SUB(1,BTST(flg%,2)))
  3300.             GOSUB chg_sam_length(i%,a%)
  3301.             GOSUB chg_sam_repeat(i%,b%)
  3302.             GOSUB chg_sam_replen(i%,c%)
  3303.             GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(pt%,&H1C)},2))
  3304.             GOSUB chg_sam_volume(i%,&H100)
  3305.             os$=os$+MKL$(ADD(admod%,SHL(CARD{ADD(pt%,&HE)},4)))
  3306.           ELSE
  3307.             os$=os$+MKL$(0)
  3308.           ENDIF
  3309.         ELSE
  3310.           os$=os$+MKL$(0)
  3311.         ENDIF
  3312.       NEXT i%
  3313.     ENDIF
  3314.     IF lon%>0 AND nbt%>0
  3315.       '
  3316.       ' Chargement de la sequence
  3317.       '
  3318.       a%=0
  3319.       b%=0
  3320.       REPEAT
  3321.         song&(a%)=BYTE{ADD(admod%,ADD(b%,&H60))}
  3322.         IF song&(a%)<254
  3323.           INC a%
  3324.         ENDIF
  3325.         INC b%
  3326.       UNTIL b%=lon%                     ! OR BYTE{ADD(admod%,ADD(b%,&H60))}=255
  3327.       song&(a%)=0
  3328.       module&(101)=a%
  3329.       '
  3330.       ' Chargement des patterns
  3331.       '
  3332.       FOR i%=0 TO PRED(nbp%)
  3333.         a%=ADD(admod%,ADD(xxx2%,SHL(i%,1)))
  3334.         GOSUB intel_w(a%)
  3335.         pt%=ADD(admod%,SHL(CARD{a%},4))
  3336.         a%=CARD{pt%}                    ! Longueur du pattern
  3337.         GOSUB intel_w(ADD(V:a%,2))      ! Mais qu'est-ce que j'en fais ???
  3338.         ADD pt%,2
  3339.         b%=FN adr_pat(i%)
  3340.         c%=V:convtrk$
  3341.         ~C:g_convert_s3m_2_gtk%(L:pt%,L:b%,L:c%,W:nbr_track%)
  3342.       NEXT i%
  3343.     ENDIF
  3344.     '
  3345.     ' Chargement des sample
  3346.     '
  3347.     IF nbs%>0
  3348.       FOR i%=1 TO nbs%
  3349.         a%=FN length(i%)
  3350.         IF a%>0
  3351.           GOSUB decale_sample(i%,nbs%,V:os$)
  3352.           d%=FN adresse(i%)
  3353.           b%=FN resol(i%)
  3354.           IF b%=2               ! 16 bits
  3355.             ~C:g_intel_16_bits%(L:d%,L:a%)
  3356.           ENDIF
  3357.           IF ffv%=2
  3358.             ~C:g_signe_sample%(L:d%,L:a%,W:b%)
  3359.           ENDIF
  3360.         ENDIF
  3361.       NEXT i%
  3362.     ENDIF
  3363.   ENDIF
  3364.   ~FRE(0)
  3365. RETURN
  3366. PROCEDURE load_module_ult               !!!
  3367.   ' Chargement d'un module au format Ultra Tracker
  3368.   ' header$ : 4096 octets du debut du module
  3369. RETURN
  3370. PROCEDURE load_module_ult_mem
  3371.   ' Chargement d'un module au format Ultra Tracker
  3372.   ' header$ : 4096 octets du debut du module
  3373.   LOCAL pt%,a%,b%,bidi%,c%,d%,e%,i%,j%,nbp%,nbs%,ofp%,patt_seq%,res%,shs%,ver%,pat$,os$
  3374.   ~FRE(0)
  3375.   ver%=1                                ! Numero de version du format
  3376.   shs%=64                               ! Taille d'un header de sample
  3377.   SELECT VAL(MID$(header$,13,3))
  3378.   CASE 2
  3379.     ver%=2
  3380.   CASE 3
  3381.     ver%=3
  3382.   CASE 4
  3383.     ver%=4
  3384.     shs%=66
  3385.   ENDSELECT
  3386.   GOSUB chg_songname2(ADD(admod%,15),32)
  3387.   res%=ADD(MUL(BYTE{ADD(admod%,47)},32),49)     ! Offset des descripteurs de samples
  3388.   nbs%=BYTE{ADD(admod%,PRED(res%))}
  3389.   patt_seq%=ADD(res%,MUL(nbs%,shs%))            ! Offset de la song
  3390.   nbp%=SUCC(BYTE{ADD(admod%,ADD(patt_seq%,257))})       ! Nombre de patterns
  3391.   GOSUB new_pattern_format(SUCC(BYTE{ADD(admod%,ADD(patt_seq%,256))}))
  3392.   IF ver%>2
  3393.     FOR i%=0 TO PRED(nbr_track%)
  3394.       CARD{ADD(V:balance$,SHL(i%,1))}=MUL(BYTE{ADD(ADD(admod%,ADD(patt_seq%,258)),i%)},&H111)
  3395.     NEXT i%
  3396.   ENDIF
  3397.   '
  3398.   ' La song
  3399.   '
  3400.   i%=0
  3401.   REPEAT
  3402.     a%=BYTE{ADD(admod%,ADD(patt_seq%,i%))}
  3403.     IF a%<nbp%
  3404.       song&(i%)=a%
  3405.       INC i%
  3406.     ENDIF
  3407.   UNTIL a%=>nbp% OR i%=>256
  3408.   module&(101)=i%
  3409.   '
  3410.   ' Chargement des patterns
  3411.   '
  3412.   IF ver%<3
  3413.     ofp%=ADD(patt_seq%,258)
  3414.   ELSE
  3415.     ofp%=ADD(patt_seq%,ADD(258,nbr_track%))
  3416.   ENDIF
  3417.   IF nbp%>0
  3418.     GOSUB create_space_multipatchunk(STRING$(nbp%,MKI$(nbr_track%)+MKI$(64)),nbp%,FALSE)
  3419.     FOR j%=0 TO PRED(nbr_track%)
  3420.       FOR i%=0 TO PRED(nbp%)
  3421.         a%=ADD(admod%,ofp%)
  3422.         b%=FN adr_trk(i%,0,j%)
  3423.         a%=C:g_convert_ult_2_gtk%(L:a%,L:b%,W:nbr_track%)       ! Convertit et prend la longueur de cette voie
  3424.         ADD ofp%,a%
  3425.       NEXT i%
  3426.     NEXT j%
  3427.   ENDIF
  3428.   '
  3429.   ' Chargement des samples
  3430.   '
  3431.   IF nbs%>0
  3432.     os$=""
  3433.     FOR i%=1 TO nbs%
  3434.       pt%=ADD(admod%,ADD(res%,MUL(PRED(i%),shs%)))
  3435.       GOSUB chg_samplename2(pt%,28,i%)
  3436.       GOSUB chg_instrname2(pt%,28,i%)
  3437.       GOSUB intel_l(ADD(pt%,44))
  3438.       GOSUB intel_l(ADD(pt%,48))
  3439.       GOSUB intel_l(ADD(pt%,52))
  3440.       GOSUB intel_l(ADD(pt%,56))
  3441.       GOSUB intel_w(ADD(pt%,SUB(shs%,2)))
  3442.       bidi%=BYTE{ADD(pt%,61)}
  3443.       b%=SUB(LONG{ADD(pt%,56)},LONG{ADD(pt%,52)})       ! Longueur
  3444.       c%=LONG{ADD(pt%,44)}                              ! Loop start
  3445.       d%=LONG{ADD(pt%,48)}                              ! Loop end
  3446.       IF BTST(bidi%,2)                                  ! 16 bits ?
  3447.         ADD b%,b%
  3448.         ADD c%,c%
  3449.         ADD d%,d%
  3450.       ENDIF
  3451.       os$=os$+MKL$(ADD(admod%,ofp%))
  3452.       ADD ofp%,b%
  3453.       b%=MIN(MAX(b% AND -2,0),&HFFFFFE)
  3454.       IF BTST(bidi%,3) OR BTST(bidi%,4)                 ! Bouclage
  3455.         c%=MAX(MIN(c% AND -2,SUB(b%,2)),0)
  3456.         d%=MAX(SUB(MIN(d%,b%),c%),2) AND -2
  3457.       ELSE
  3458.         c%=0
  3459.         d%=2
  3460.       ENDIF
  3461.       GOSUB chg_sam_length(i%,b%)
  3462.       GOSUB chg_sam_repeat(i%,c%)
  3463.       GOSUB chg_sam_replen(i%,d%)
  3464.       d%=CARD{ADD(pt%,SUB(shs%,2))} AND 15      ! Finetune
  3465.       IF d%>7
  3466.         SUB d%,16
  3467.       ENDIF
  3468.       GOSUB chg_sam_finetune(i%,d%)
  3469.       GOSUB chg_ins_volume(i%,BYTE{ADD(pt%,60)})
  3470.       GOSUB chg_sam_volume(i%,&H100)
  3471.       GOSUB chg_sam_nbits(i%,SUB(1,BTST(bidi%,2)))
  3472.       IF ver%>3                         ! Frequence d'echantillonnage
  3473.         GOSUB intel_w(ADD(pt%,SUB(shs%,4)))
  3474.         GOSUB chg_sam_freq(i%,CARD{ADD(pt%,SUB(shs%,4))})
  3475.       ENDIF
  3476.     NEXT i%
  3477.     FOR i%=1 TO nbs%
  3478.       a%=FN length(i%)
  3479.       IF a%>0
  3480.         GOSUB decale_sample(i%,nbs%,V:os$)
  3481.         IF FN resol(i%)=2       ! 16 bits
  3482.           d%=FN adresse(i%)
  3483.           ~C:g_intel_16_bits%(L:d%,L:a%)
  3484.         ENDIF
  3485.       ENDIF
  3486.     NEXT i%
  3487.   ENDIF
  3488.   ~FRE(0)
  3489. RETURN
  3490. PROCEDURE load_module_dtm_mem
  3491.   LOCAL a%,b%,c%,adsq%,adpatt%,adinst%,finmod%,i%,j%,k%,l%,nbs%,nbp%,pt%
  3492.   LOCAL adp$,adi$,map$
  3493.   ~FRE(0)
  3494.   '
  3495.   ' Identification des chunks
  3496.   '
  3497.   finmod%=ADD(admod%,lonmod%)
  3498.   adp$=STRING$(1024,0)
  3499.   adi$=STRING$(1024,0)
  3500.   map$=STRING$(256,MKI$(1)+MKI$(1))
  3501.   a%=admod%
  3502.   REPEAT
  3503.     SELECT LONG{a%}
  3504.     CASE "S.Q."
  3505.       adsq%=a%
  3506.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  3507.     CASE "PATT"
  3508.       adpatt%=a%
  3509.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  3510.     CASE "INST"
  3511.       adinst%=a%
  3512.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  3513.     CASE "DAPT"
  3514.       LONG{ADD(V:adp$,SHL(CARD{ADD(a%,12)},2))}=a%
  3515.       CARD{ADD(V:map$,ADD(SHL(CARD{ADD(a%,12)},2),2))}=CARD{ADD(a%,14)}
  3516.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  3517.     CASE "DAIT"
  3518.       LONG{ADD(V:adi$,SHL(CARD{ADD(a%,8)},2))}=a%
  3519.       ADD a%,ADD(LONG{ADD(a%,4)},8)
  3520.     ENDSELECT
  3521.     a%=C:g_dtm_next_chunk%(L:a%,L:finmod%)
  3522.   UNTIL a%>=finmod%
  3523.   '
  3524.   ' Infos generales
  3525.   '
  3526.   GOSUB new_pattern_format(CARD{ADD(adpatt%,8)})
  3527.   GOSUB chg_songname2(ADD(admod%,22),20)
  3528.   IF CARD{ADD(admod%,14)}<>0
  3529.     ticks%=CARD{ADD(admod%,14)}                 ! Vitesse
  3530.   ENDIF
  3531.   IF CARD{ADD(admod%,16)}<>0                    ! Tempo
  3532.     tempo%=CARD{ADD(admod%,16)}
  3533.   ENDIF
  3534.   nbs%=CARD{ADD(adinst%,8)}
  3535.   '
  3536.   ' La song
  3537.   '
  3538.   module&(101)=CARD{ADD(adsq%,8)}
  3539.   module&(102)=CARD{ADD(adsq%,10)}
  3540.   ARRAYFILL song&(),0
  3541.   FOR i%=0 TO PRED(module&(101))
  3542.     song&(i%)=BYTE{ADD(ADD(adsq%,16),i%)}
  3543.   NEXT i%
  3544.   '
  3545.   ' Les patterns
  3546.   '
  3547.   nbp%=CARD{ADD(adpatt%,10)}
  3548.   FOR i%=0 TO SHL(PRED(nbp%),2) STEP 4
  3549.     CARD{ADD(V:map$,i%)}=nbr_track%
  3550.   NEXT i%
  3551.   GOSUB create_space_multipatchunk(map$,nbp%,FALSE)
  3552.   FOR i%=0 TO PRED(nbp%)
  3553.     a%=LONG{ADD(V:adp$,SHL(i%,2))}      ! Adresse du pattern
  3554.     IF a%<>0
  3555.       l%=CARD{ADD(a%,14)}
  3556.       IF l%>0
  3557.         ADD a%,16                       ! Adresse des donnees
  3558.         b%=FN adr_pat(i%)
  3559.         c%=MUL(l%,nbr_track%)
  3560.         IF LONG{ADD(adpatt%,12)}=&H322E3034     ! '2.04'
  3561.           ~C:g_convert_dtm_2_gtk%(L:a%,L:b%,L:c%)
  3562.         ELSE                                    ! Ancien format
  3563.           BMOVE a%,b%,SHL(c%,2)
  3564.           ~C:g_convert_nt_2_gtk%(L:b%,L:c%)
  3565.         ENDIF
  3566.       ENDIF
  3567.     ENDIF
  3568.   NEXT i%
  3569.   '
  3570.   ' Les instruments
  3571.   '
  3572.   IF nbs%>0
  3573.     FOR i%=1 TO nbs%
  3574.       IF LONG{ADD(V:adi$,SHL(PRED(i%),2))}>admod%
  3575.         a%=ADD(ADD(adinst%,10),MUL(PRED(i%),50))
  3576.         GOSUB chg_samplename2(ADD(a%,18),22,i%)
  3577.         GOSUB chg_instrname2(ADD(a%,18),22,i%)
  3578.         c%=LONG{ADD(a%,4)} AND -2
  3579.         GOSUB chg_sam_length(i%,c%)
  3580.         IF c%>0
  3581.           GOSUB chg_sam_freq(i%,LONG{ADD(a%,46)})
  3582.           GOSUB chg_sam_nbits(i%,SHR(BYTE{ADD(a%,41)},3))
  3583.           GOSUB chg_sam_repeat(i%,MIN(SUB(c%,2),MAX(0,LONG{ADD(a%,10)} AND -2)))
  3584.           GOSUB chg_sam_replen(i%,MIN(SUB(c%,FN repeat(i%)),MAX(2,LONG{ADD(a%,14)} AND -2)))
  3585.           c%=BYTE{ADD(a%,8)}
  3586.           IF c%>7
  3587.             SUB c%,16
  3588.           ENDIF
  3589.           GOSUB chg_sam_finetune(i%,c%)
  3590.           GOSUB chg_ins_volume(i%,SHL(BYTE{ADD(a%,9)},2))
  3591.           GOSUB chg_sam_volume(i%,&H100)
  3592.         ENDIF
  3593.       ENDIF
  3594.     NEXT i%
  3595.   ENDIF
  3596.   ~FRE(0)
  3597.   IF nbs%>0
  3598.     FOR i%=0 TO PRED(nbs%)
  3599.       IF FN length(SUCC(i%))>0
  3600.         LONG{ADD(V:adi$,SHL(i%,2))}=ADD(LONG{ADD(V:adi$,SHL(i%,2))},10)
  3601.       ELSE
  3602.         LONG{ADD(V:adi$,SHL(i%,2))}=0
  3603.       ENDIF
  3604.     NEXT i%
  3605.     FOR i%=1 TO nbs%
  3606.       GOSUB decale_sample(i%,nbs%,V:adi$)
  3607.     NEXT i%
  3608.   ENDIF
  3609. RETURN
  3610. PROCEDURE load_module_xm_mem            !!!
  3611.   LOCAL a%,b%,c%,d%,i%,j%,l%,hs%,nbi%,nbl%,nbp%,nbt%,pt%,sl%,snum%,sr%,tem%
  3612.   LOCAL transp$,adi$,map$
  3613.   ~FRE(0)
  3614.   '
  3615.   ' Header du module
  3616.   '
  3617.   GOSUB chg_songname2(ADD(admod%,17),20)
  3618.   GOSUB intel_l(ADD(admod%,60))
  3619.   GOSUB intel_w(ADD(admod%,64))
  3620.   GOSUB intel_w(ADD(admod%,66))
  3621.   GOSUB intel_w(ADD(admod%,68))
  3622.   GOSUB intel_w(ADD(admod%,70))
  3623.   GOSUB intel_w(ADD(admod%,72))
  3624.   GOSUB intel_w(ADD(admod%,76))
  3625.   GOSUB intel_w(ADD(admod%,78))
  3626.   pt%=ADD(ADD(60,admod%),LONG{ADD(admod%,60)})  ! Pointe sur le 1er pattern
  3627.   sl%=CARD{ADD(admod%,64)}              ! Song length
  3628.   sr%=CARD{ADD(admod%,66)}              ! Song repeat
  3629.   nbt%=CARD{ADD(admod%,68)}             ! Nombre de tracks
  3630.   nbp%=CARD{ADD(admod%,70)}             ! Nombre de patterns
  3631.   nbi%=CARD{ADD(admod%,72)}             ! Nombre d'instruments
  3632.   ticks%=CARD{ADD(admod%,76)}           ! Vitesse
  3633.   tempo%=CARD{ADD(admod%,78)}           ! Tempo
  3634.   '
  3635.   ' Recherche du nombre de lignes
  3636.   ' DesINTELisation des mots dans les headers des patterns
  3637.   '
  3638.   map$=""
  3639.   nbl%=1
  3640.   a%=pt%
  3641.   FOR i%=1 TO nbp%
  3642.     GOSUB intel_l(a%)
  3643.     GOSUB intel_w(ADD(a%,5))
  3644.     GOSUB intel_w(ADD(a%,7))
  3645.     nbl%=CARD{ADD(a%,5)}
  3646.     map$=map$+MKI$(nbt%)+MKI$(nbl%)
  3647.     ADD a%,ADD(LONG{a%},CARD{ADD(a%,7)})
  3648.   NEXT i%
  3649.   GOSUB new_pattern_format(nbt%)
  3650.   '
  3651.   ' La song
  3652.   '
  3653.   module&(101)=sl%
  3654.   module&(102)=sr%
  3655.   FOR i%=0 TO PRED(FN song_length)
  3656.     song&(i%)=BYTE{ADD(ADD(admod%,80),i%)}
  3657.   NEXT i%
  3658.   '
  3659.   ' Les patterns
  3660.   '
  3661.   GOSUB create_space_multipatchunk(map$,nbp%,FALSE)
  3662.   FOR i%=0 TO PRED(nbp%)
  3663.     IF BYTE{ADD(pt%,4)}=0               ! Packing type 0
  3664.       l%=CARD{ADD(pt%,5)}
  3665.       a%=ADD(pt%,9)
  3666.       b%=FN adr_pat(i%)
  3667.       ~C:g_convert_ft2_2_gtk%(L:a%,L:b%,W:nbr_track%,W:l%)
  3668.       pt%=ADD(a%,CARD{ADD(pt%,7)})
  3669.     ENDIF
  3670.   NEXT i%
  3671.   '
  3672.   ' Les instruments et headers des samples
  3673.   '
  3674.   snum%=1                               ! Sample courant
  3675.   adi$=""
  3676.   FOR i%=1 TO nbi%
  3677.     GOSUB intel_l(pt%)
  3678.     GOSUB intel_w(ADD(pt%,27))
  3679.     hs%=LONG{pt%}                       ! Taille du header d'instr
  3680.     c%=CARD{ADD(pt%,27)}                ! Nombre de samples dans l'instr
  3681.     GOSUB chg_instrname2(ADD(pt%,4),22,i%)
  3682.     IF c%=0
  3683.       ADD pt%,hs%                       ! Si pas de sample, instr suivant
  3684.     ELSE
  3685.       GOSUB chg_ins_volume(i%,256)
  3686.       FOR j%=1 TO 95                    ! Affectation des samples pour chaque note
  3687.         GOSUB chg_ins_sample(i%,j%,ADD(BYTE{ADD(pt%,ADD(33,j%))},snum%))
  3688.       NEXT j%
  3689.       FOR j%=96 TO 127
  3690.         GOSUB chg_ins_sample(i%,j%,FN isample(i%,95))
  3691.       NEXT j%
  3692.       GOSUB chg_ins_sample(i%,0,0)
  3693.       transp$=STRING$(256,0)            ! Table des transposition pour chaque sample
  3694.       GOSUB intel_l(ADD(pt%,29))
  3695.       a%=LONG{ADD(pt%,29)}              ! Taille des Sample Headers
  3696.       ADD pt%,hs%                       ! Pointe sur le premier header de sample
  3697.       ' Scanne chaque header de sample
  3698.       b%=0                              ! Taille totale des sample data de l'instrument
  3699.       FOR j%=1 TO c%                    ! DesINTELise tous les headers
  3700.         GOSUB intel_l(pt%)
  3701.         GOSUB intel_l(ADD(pt%,4))
  3702.         GOSUB intel_l(ADD(pt%,8))
  3703.         BYTE{ADD(V:transp$,snum%)}=BYTE{ADD(pt%,16)}    ! Memorise la transposition
  3704.         adi$=adi$+MKL$(b%)
  3705.         d%=LONG{pt%}
  3706.         ADD b%,d%
  3707.         d%=d% AND -2
  3708.         GOSUB chg_sam_length(snum%,d%)
  3709.         IF BTST(BYTE{ADD(pt%,14)},0) OR BTST(BYTE{ADD(pt%,14)},1)
  3710.           GOSUB chg_sam_repeat(snum%,LONG{ADD(pt%,4)} AND -2)
  3711.           GOSUB chg_sam_replen(snum%,MIN(MAX(LONG{ADD(pt%,8)},2),SUB(FN length(snum%),FN repeat(snum%))) AND -2)
  3712.         ELSE
  3713.           GOSUB chg_sam_repeat(snum%,0)
  3714.           GOSUB chg_sam_replen(snum%,2)
  3715.         ENDIF
  3716.         GOSUB chg_sam_volume(snum%,SHL(BYTE{ADD(pt%,12)},2))
  3717.         GOSUB chg_sam_freq(snum%,8363)
  3718.         GOSUB chg_sam_finetune(snum%,DIV(FN sbyte(BYTE{ADD(pt%,13)}),16))
  3719.         GOSUB chg_sam_nbits(snum%,SUB(1,BTST(BYTE{ADD(pt%,14)},4)))
  3720.         GOSUB chg_sam_balance(snum%,SHL(BYTE{ADD(pt%,15)},4))
  3721.         GOSUB chg_samplename2(ADD(pt%,18),22,snum%)
  3722.         ADD pt%,a%
  3723.         INC snum%                       ! Attention faut pas depasser 255!!!!!
  3724.       NEXT j%
  3725.       FOR j%=1 TO c%                    ! Les adresses des samples dans le XM
  3726.         LONG{ADD(V:adi$,SHL(SUB(PRED(snum%),j%),2))}=ADD(LONG{ADD(V:adi$,SHL(SUB(PRED(snum%),j%),2))},pt%)
  3727.       NEXT j%
  3728.       ADD pt%,b%                        ! Saute les donnees de sample
  3729.       FOR j%=1 TO 95                    ! Affecte les transpositions a chaque note suivant les samples
  3730.         GOSUB chg_ins_transp(i%,j%,BYTE{ADD(V:transp$,FN isample(i%,j%))})
  3731.       NEXT j%
  3732.       FOR j%=96 TO 127
  3733.         GOSUB chg_ins_transp(i%,j%,FN itransp(i%,95))
  3734.       NEXT j%
  3735.       GOSUB chg_ins_transp(i%,0,0)
  3736.     ENDIF
  3737.   NEXT i%
  3738.   '
  3739.   ' Deplacement des samples et conversion en absolu
  3740.   '
  3741.   IF snum%>1
  3742.     FOR i%=1 TO PRED(snum%)
  3743.       GOSUB decale_sample(i%,PRED(snum%),V:adi$)
  3744.       a%=FN adresse(i%)
  3745.       b%=FN length(i%)
  3746.       c%=FN resol(i%)
  3747.       IF c%=2                           ! 16 bits
  3748.         ~C:g_intel_16_bits%(L:a%,L:b%)
  3749.       ENDIF
  3750.       ~C:g_delta_2_absolu%(L:a%,L:b%,W:c%)
  3751.     NEXT i%
  3752.   ENDIF
  3753. RETURN
  3754. PROCEDURE save_instrument
  3755.   LOCAL a$
  3756.   IF flag_registered!
  3757.     IF km%=2 AND nfile_instrument$<>""
  3758.       a$=npath_div$+nfile_instrument$
  3759.     ELSE
  3760.       CLS
  3761.       GOSUB cadre_texte("SAVE INSTRUMENT",0,0,PRED(scr_ncol%))
  3762.       FILESELECT npath_div$+"*.INS",nfile_instrument$,a$
  3763.     ENDIF
  3764.     IF a$<>""
  3765.       CLS
  3766.       GOSUB cadre_texte("WAITING : SAVING INSTRUMENT "+a$+"...",0,0,PRED(scr_ncol%))
  3767.       GOSUB save_instrument2
  3768.       GOSUB separe_nom_chemin(a$)
  3769.       nfile_instrument$=nfile_$
  3770.       npath_div$=npath_$
  3771.     ENDIF
  3772.   ELSE
  3773.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  3774.   ENDIF
  3775.   GOSUB affiche_panneau_principal
  3776. RETURN
  3777. PROCEDURE save_instrument2
  3778.   ' Fournir a$ nom du module, instr% numero de l'instrument
  3779.   LOCAL a%,i%
  3780.   LOCAL b$
  3781.   erreur%=0
  3782.   warning%=0
  3783.   OPEN "o",#0,a$
  3784.   SEEK #0,0
  3785.   '
  3786.   ' Travail preparatoire
  3787.   '
  3788.   ' Cherche les samples utilises par cet instrument
  3789.   lsam$=STRING$(256,0)
  3790.   FOR i%=0 TO 127
  3791.     a%=FN isample(instr%,i%)
  3792.     IF a%<>0
  3793.       BYTE{ADD(V:lsam$,a%)}=1
  3794.     ENDIF
  3795.   NEXT i%
  3796.   '
  3797.   ' Chunk de l'instrument
  3798.   '
  3799.   BPUT #0,V:instrset%(0,instr%),instrset%(1,instr%)
  3800.   '
  3801.   ' Chunks des samples
  3802.   '
  3803.   FOR i%=1 TO 255
  3804.     IF BYTE{ADD(V:lsam$,i%)}<>0
  3805.       a%=MAX(FN adrsamchk(i%)*(-flag_registered2!),&H1563)      ! *** 2eme protection
  3806.       BPUT #0,a%,FN lonsamchk(i%)
  3807.     ENDIF
  3808.   NEXT i%
  3809.   CLOSE #0
  3810. RETURN
  3811. PROCEDURE load_instrument
  3812.   LOCAL a$
  3813.   IF km%=2 AND nfile_instrument$<>""
  3814.     a$=npath_div$+nfile_instrument$
  3815.   ELSE
  3816.     CLS
  3817.     GOSUB cadre_texte("LOAD SAMPLE",0,0,PRED(scr_ncol%))
  3818.     FILESELECT npath_div$+"*.INS",nfile_instrument$,a$
  3819.   ENDIF
  3820.   IF FN exist(a$)
  3821.     CLS
  3822.     GOSUB cadre_texte("WAITING : LOADING INSTRUMENT "+a$+"...",0,0,PRED(scr_ncol%))
  3823.     GOSUB load_instrument2
  3824.     IF erreur%=0
  3825.       GOSUB separe_nom_chemin(a$)
  3826.       nfile_instrument$=nfile_$
  3827.       npath_div$=npath_$
  3828.     ENDIF
  3829.   ENDIF
  3830.   GOSUB affiche_panneau_principal
  3831.   IF erreur%=1
  3832.     GOSUB aff_message("NOT AN INSTRUMENT.")
  3833.   ELSE IF erreur%=2
  3834.     GOSUB aff_message("NOT ENOUGH MEMORY TO LOAD THIS INSTRUMENT !")
  3835.   ELSE IF erreur%=3
  3836.     GOSUB aff_message("TOO MANY SAMPLES IN THIS INSTRUMENT")
  3837.   ENDIF
  3838. RETURN
  3839. PROCEDURE load_instrument2
  3840.   ' Nom fourni dans a$
  3841.   LOCAL a%,b%,c%,i%,j%,lchk%,nbs%,posact%,totlon%
  3842.   LOCAL chk$,sam$
  3843.   ~FRE(0)
  3844.   erreur%=0
  3845.   warning%=0
  3846.   OPEN "i",#0,a$
  3847.   totlon%=LOF(#0)
  3848.   posact%=0
  3849.   '
  3850.   ' Chargement du chunk de l'instrument
  3851.   '
  3852.   chk$=STRING$(8,0)
  3853.   SEEK #0,posact%
  3854.   BGET #0,V:chk$,8
  3855.   ADD posact%,8
  3856.   IF LEFT$(chk$,4)="INST"                       ! Verifie que c'est bien un instrument
  3857.     lchk%=LONG{ADD(V:chk$,4)}
  3858.     chk$=chk$+STRING$(SUB(lchk%,8),0)
  3859.     BGET #0,ADD(V:chk$,8),SUB(lchk%,8)
  3860.     ADD posact%,SUB(lchk%,8)
  3861.     ' Table de conversion de numero d'instrument
  3862.     sam$=STRING$(256,0)
  3863.     nbs%=0                                      ! Nombre de samples
  3864.     a%=0
  3865.     FOR i%=1 TO 127
  3866.       b%=BYTE{ADD(ADD(V:chk$,60),SHL(i%,1))}
  3867.       IF BYTE{ADD(V:sam$,b%)}=0 AND b%>0
  3868.         INC nbs%
  3869.         REPEAT
  3870.           INC a%
  3871.           EXIT IF a%>255
  3872.         UNTIL FN length(a%)=0                   ! Cherche un sample libre : longueur nulle
  3873.         IF a%<=255
  3874.           BYTE{ADD(V:sam$,b%)}=a%
  3875.         ELSE
  3876.           erreur%=3                             ! Plus de sample libre : erreur
  3877.           i%=999
  3878.         ENDIF
  3879.       ENDIF
  3880.     NEXT i%
  3881.     IF erreur%<>0
  3882.       GOTO ld_instr2_fin
  3883.     ENDIF
  3884.     CARD{ADD(V:chk$,8)}=instr%
  3885.     CARD{ADD(V:chk$,60)}=0
  3886.     FOR i%=1 TO 127                             ! Nouveaux numeros de sample
  3887.       BYTE{ADD(ADD(V:chk$,60),SHL(i%,1))}=BYTE{ADD(V:sam$,BYTE{ADD(ADD(V:chk$,60),(SHL(i%,1)))})}
  3888.     NEXT i%
  3889.     BMOVE V:chk$,V:instrset%(0,instr%),316
  3890.     '
  3891.     ' Chargement des samples
  3892.     '
  3893.     IF nbs%>0
  3894.       a%=0                                      ! Nombre de samples charges
  3895.       WHILE posact%<totlon% AND a%<nbs%
  3896.         chk$=STRING$(64,0)
  3897.         SEEK #0,posact%
  3898.         BGET #0,V:chk$,64
  3899.         ADD posact%,64
  3900.         lchk%=LONG{ADD(V:chk$,4)}               ! Longueur totale du chunk du sample
  3901.         c%=LONG{ADD(V:chk$,46)}                 ! Longueur en octets
  3902.         d%=CARD{ADD(V:chk$,8)}                  ! Ancien numero du sample
  3903.         b%=BYTE{ADD(V:sam$,d%)}                 ! Nouveau numero du sample
  3904.         IF b%<>0                                ! S'il etait bien declare dans le chunk de l'instrument
  3905.           CARD{ADD(V:chk$,8)}=b%
  3906.           GOSUB chg_taille_sample(b%,c%)        ! Change d'abord la taille
  3907.           BMOVE V:chk$,FN adrsamchk(b%),64      ! Transfert ensuite le chunk
  3908.           BGET #0,FN adresse(b%),c%             ! Puis transfert les donnees (taille indiquee dans Length)
  3909.           ADD posact%,SUB(lchk%,64)             ! Pointe sur le chunk suivant
  3910.           BYTE{ADD(V:sam$,d%)}=0                ! Indique que le sample est deja charge
  3911.           INC a%
  3912.         ELSE                                    ! Sample qui etait en trop
  3913.           ADD posact%,SUB(lchk%,64)
  3914.         ENDIF
  3915.       WEND
  3916.     ENDIF
  3917.     IF a%<nbs%
  3918.       warning%=1                                ! Tous les samples n'ont pas ete trouves
  3919.     ENDIF
  3920.     FOR i%=1 TO 255
  3921.       ~C:rr_boucle_sample%(W:i%)
  3922.     NEXT i%
  3923.   ELSE
  3924.     erreur%=1
  3925.   ENDIF
  3926. ld_instr2_fin:
  3927.   CLOSE #0
  3928. RETURN
  3929. PROCEDURE load_prefs
  3930.   LOCAL a$
  3931.   IF km%=2 AND nfile_sample$<>""
  3932.     a$=npath_prefs$+nfile_prefs$
  3933.   ELSE
  3934.     CLS
  3935.     GOSUB cadre_texte("LOAD PREFERENCES",0,0,PRED(scr_ncol%))
  3936.     FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  3937.   ENDIF
  3938.   IF a$<>""
  3939.     IF FN exist(a$)
  3940.       CLS
  3941.       GOSUB cadre_texte("WAITING : LOADING PREFERENCES "+a$+"...",0,0,PRED(scr_ncol%))
  3942.       GOSUB load_prefs2(a$,FALSE)
  3943.     ENDIF
  3944.   ENDIF
  3945.   GOSUB bee(FALSE)
  3946.   GOSUB affiche_panneau_principal
  3947. RETURN
  3948. PROCEDURE load_prefs2(fic$,first_time!) !!!
  3949.   LOCAL a%,b%,i%
  3950.   LOCAL a$,lig$,p$,p1$,p2$
  3951.   LOCAL error!
  3952.   OPEN "i",#0,fic$
  3953.   WHILE NOT EOF(#0)
  3954.     LINE INPUT #0,lig$
  3955.     IF LEN(lig$)>2
  3956.       ' Transforme les caracteres non ASCII en espaces
  3957.       FOR i%=0 TO PRED(LEN(lig$))
  3958.         IF BYTE{ADD(V:lig$,i%)}<32
  3959.           BYTE{ADD(V:lig$,i%)}=32
  3960.         ENDIF
  3961.       NEXT i%
  3962.       lig$=TRIM$(lig$)
  3963.       a%=INSTR(lig$,"=")
  3964.       IF a%>1
  3965.         p$=UPPER$(TRIM$(LEFT$(lig$,PRED(a%))))  ! p$ contient le nom de la variable
  3966.         p1$=RIGHT$(lig$,SUB(LEN(lig$),a%))      ! p1$ contient le reste brut de la ligne
  3967.         b%=INSTR(p1$,";")
  3968.         IF b%>0
  3969.           p2$=UPPER$(TRIM$(LEFT$(p1$,PRED(b%))))        ! p2$ contient le 2eme terme sans commentaire
  3970.         ELSE
  3971.           p2$=UPPER$(TRIM$(p1$))
  3972.         ENDIF
  3973.         '
  3974.         ' Main pannel
  3975.         ' -----------
  3976.         '
  3977.         ' Disk
  3978.         '
  3979.         IF p$="PROGRAM_PATH"
  3980.           npath_prog$=p2$
  3981.         ELSE IF p$="MODULE_PATH"
  3982.           npath_module$=p2$
  3983.         ELSE IF p$="SAMPLE_PATH"
  3984.           npath_sample$=p2$
  3985.         ELSE IF p$="AUTOLOAD_PATH"
  3986.           npath_autoload$=p2$
  3987.         ELSE IF p$="PREF_PATH"
  3988.           npath_prefs$=p2$
  3989.         ELSE IF p$="MISC_PATH"
  3990.           npath_div$=p2$
  3991.         ELSE IF p$="MODULE_EXTENSION"
  3992.           next_module$=p2$
  3993.         ELSE IF p$="SAMPLE_EXTENSION"
  3994.           next_sample$=p2$
  3995.         ELSE IF p$="MODULE_FILE"
  3996.           IF p2$<>"/"
  3997.             nfile_module$=p2$
  3998.           ELSE
  3999.             nfile_module$=""
  4000.           ENDIF
  4001.         ELSE IF p$="SAMPLE_FILE"
  4002.           IF p2$<>"/"
  4003.             nfile_sample$=p2$
  4004.           ELSE
  4005.             nfile_sample$=""
  4006.           ENDIF
  4007.         ELSE IF p$="AUTOLOAD_FILE"
  4008.           IF p2$<>"/"
  4009.             nfile_autoload$=p2$
  4010.           ELSE
  4011.             nfile_autoload$=""
  4012.           ENDIF
  4013.         ELSE IF p$="PREF_FILE"
  4014.           IF p2$<>"/"
  4015.             nfile_prefs$=p2$
  4016.           ELSE
  4017.             nfile_prefs$=""
  4018.           ENDIF
  4019.         ELSE IF p$="SAVE_CONFIG_GT2"
  4020.           IF p2$="TRUE"
  4021.             flag_gt2cnf!=TRUE
  4022.           ELSE
  4023.             flag_gt2cnf!=FALSE
  4024.           ENDIF
  4025.         ELSE IF p$="MODULE_BACKUP"
  4026.           IF p2$="TRUE"
  4027.             flag_backup_modules!=TRUE
  4028.           ELSE
  4029.             flag_backup_modules!=FALSE
  4030.           ENDIF
  4031.           '
  4032.           ' Divers
  4033.           '
  4034.         ELSE IF p$="COLOR_PAL"
  4035.           error!=FALSE
  4036.           a$=""
  4037.           FOR i%=0 TO 15
  4038.             IF LEN(p2$)<3
  4039.               error!=TRUE
  4040.             ELSE
  4041.               a$=a$+LEFT$(p2$,3)
  4042.               p2$=TRIM$(RIGHT$(p2$,SUB(LEN(p2$),3)))
  4043.             ENDIF
  4044.           NEXT i%
  4045.           IF NOT error!
  4046.             color_pal$=a$
  4047.           ENDIF
  4048.         ELSE IF p$="PATTERN_LINE_MAX"
  4049.           haut_lig%=MIN(MAX(VAL(p2$) OR 1,1),99999)
  4050.           IF NOT first_time!
  4051.             haut_lig%=MIN(DIV(SUB(scr_haut%,180),6) OR 1,haut_lig%)
  4052.           ENDIF
  4053.         ELSE IF p$="INSTRUMENT"
  4054.           instr%=MIN(MAX(VAL(p2$),1),255)
  4055.         ELSE IF p$="SAMPLE"
  4056.           sample%=MIN(MAX(VAL(p2$),1),255)
  4057.         ELSE IF p$="LINE_STEP"
  4058.           line_step%=MIN(MAX(VAL(p2$),-64),64)
  4059.         ELSE IF p$="NUMBER_OF_TRACKS"
  4060.           IF first_time!
  4061.             nbr_track%=MIN(MAX(VAL(p2$),1),32)
  4062.           ENDIF
  4063.         ELSE IF p$="PRESET"
  4064.           n_preset%=MIN(MAX(PRED(VAL(p2$)),0),31)
  4065.         ELSE IF p$="OCTAVE"
  4066.           octave%=MIN(MAX(PRED(VAL(p2$)),0),6)
  4067.         ELSE IF p$="MENU"
  4068.           IF p2$="DISK"
  4069.             ss_menu%=1
  4070.           ELSE IF p2$="TOOLS"
  4071.             ss_menu%=2
  4072.           ELSE IF p2$="INSTRUMENTS"
  4073.             ss_menu%=3
  4074.           ELSE IF p2$="SAMPLES"
  4075.             ss_menu%=4
  4076.           ELSE IF p2$="ENVELOPES"
  4077.             ss_menu%=5
  4078.           ELSE IF p2$="CONTROL"
  4079.             ss_menu%=6
  4080.           ELSE
  4081.             ss_menu%=MIN(MAX(VAL(p2$),1),5)
  4082.           ENDIF
  4083.         ELSE IF p$="NUMPAD"
  4084.           IF p2$="DRUMKIT"
  4085.             drumpad_flag%=1
  4086.           ELSE
  4087.             drumpad_flag%=0
  4088.           ENDIF
  4089.         ELSE IF p$="PATTERN_DISPLAY"
  4090.           type_affpiste%=MIN(MAX(VAL(p2$),0),2)
  4091.         ELSE IF p$="BLOCK_REPLACE"
  4092.           IF p2$="TRUE"
  4093.             replace_block%=1
  4094.           ELSE
  4095.             replace_block%=0
  4096.           ENDIF
  4097.           '
  4098.           ' Tools
  4099.           '
  4100.         ELSE IF p$="BLOCK_TYPE"
  4101.           IF p2$="PATTERN"
  4102.             trackpat%=1
  4103.           ELSE IF p2$="PRESET"
  4104.             trackpat%=2
  4105.           ELSE
  4106.             trackpat%=0
  4107.           ENDIF
  4108.         ELSE IF p$="BLOCK_SONG"
  4109.           IF p2$="TRUE"
  4110.             bl_flagsong!=TRUE
  4111.           ELSE
  4112.             bl_flagsong!=FALSE
  4113.           ENDIF
  4114.         ELSE IF p$="BLOCK_MASK"
  4115.           IF p2$="TRUE"
  4116.             maskblock%=1
  4117.           ELSE
  4118.             maskblock%=0
  4119.           ENDIF
  4120.         ELSE IF p$="BLOCK_MASK1"
  4121.           '
  4122.           '
  4123.           '
  4124.         ELSE IF p$="BLOCK_MASK2"
  4125.           '
  4126.           '
  4127.           '
  4128.         ELSE IF p$="TOOLS_ECHO_STEP"
  4129.           bl_echo_lines%=MIN(MAX(VAL(p2$),1),64)
  4130.         ELSE IF p$="TOOLS_ECHO_FDBKVAL"
  4131.           bl_echo_feedback%=MIN(MAX(VAL(p2$),0),100)
  4132.         ELSE IF p$="TOOLS_ECHO_FADESTEP"
  4133.           bl_echo_fadestep%=MIN(MAX(VAL(p2$),0),256)
  4134.         ELSE IF p$="TOOLS_ECHO_CONT"
  4135.           IF p2$="TRUE"
  4136.             bl_echo_cont!=TRUE
  4137.           ELSE
  4138.             bl_echo_cont!=FALSE
  4139.           ENDIF
  4140.         ELSE IF p$="TOOLS_ECHO_FEEDBACK"
  4141.           IF p2$="TRUE"
  4142.             bl_echo_fdbk!=TRUE
  4143.           ELSE
  4144.             bl_echo_fdbk!=FALSE
  4145.           ENDIF
  4146.         ELSE IF p$="NOTE_EXTENSION"
  4147.           '
  4148.           '
  4149.           '
  4150.           '
  4151.           ' Envelopes
  4152.           '
  4153.         ELSE IF p$="ENVELOPE"
  4154.           env_num&=MIN(MAX(VAL(p2$),1),64)
  4155.         ELSE IF p$="ENV_SECTION"
  4156.           IF p2$="KEYOFF"
  4157.             env_sect&=1
  4158.           ELSE
  4159.             env_sect&=0
  4160.           ENDIF
  4161.         ELSE IF p$="ENVELOPE_TYPE"
  4162.           IF p2$="TONE"
  4163.             ss_menue%=1
  4164.           ELSE IF p2$="PANNING"
  4165.             ss_menue%=2
  4166.           ELSE
  4167.             ss_menue%=0
  4168.           ENDIF
  4169.         ELSE IF p$="ENVELOPE_COPY"
  4170.           env_copy&=MIN(MAX(VAL(p2$),1),64)
  4171.           '
  4172.           '
  4173.           '
  4174.           '
  4175.           '
  4176.           ' Sample Editor
  4177.           ' -------------
  4178.         ELSE IF p$="KEEP_BUFFER"
  4179.           IF first_time!
  4180.             IF p2$="TRUE"
  4181.               flag_keep_buffer!=TRUE
  4182.             ELSE
  4183.               flag_keep_buffer!=FALSE
  4184.             ENDIF
  4185.           ENDIF
  4186.           '
  4187.           ' Mix
  4188.           '
  4189.         ELSE IF p$="MIX_MASTER_VOLUME"
  4190.           se.mix_master_volume%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4191.           '
  4192.           ' Frequency
  4193.           '
  4194.         ELSE IF p$="FREQ_NEW_SAMPLE_FREQ"
  4195.           se.freq_nfe%=MIN(MAX(VAL(p2$),2000),65000)
  4196.         ELSE IF p$="FREQ_OLD_NOTE_FREQ"+STR$(se.freq_ofn%)
  4197.           se.freq_ofn%=MIN(MAX(VAL(p2$),20),32500)
  4198.         ELSE IF p$="FREQ_NEW_NOTE_FREQ"+STR$(se.freq_nfn%)
  4199.           se.freq_nfn%=MIN(MAX(VAL(p2$),20),32500)
  4200.         ELSE IF p$="FREQ_INTERPOLATION"""
  4201.           IF p2$="LINEAR"
  4202.             se.freq_iptype%=1
  4203.           ELSE IF p2$="3RD DEGREE"
  4204.             se.freq_iptype%=2
  4205.           ELSE
  4206.             se.freq_iptype%=0
  4207.           ENDIF
  4208.         ELSE IF p$="FREQ_FFT_DISPLAY"
  4209.           IF p2$="LOGARITHMIC"
  4210.             se.freq_fftdisp%=1
  4211.           ELSE
  4212.             se.freq_fftdisp%=0
  4213.           ENDIF
  4214.         ELSE IF p$="FREQ_FFT_WINDOW"
  4215.           IF p2$="BLACKMAN"
  4216.             se.freq_fftwin%=1
  4217.           ELSE
  4218.             se.freq_fftwin%=0
  4219.           ENDIF
  4220.         ELSE IF p$="FREQ_FFT_NOTE_DISPLAY"
  4221.           IF p2$="FALSE"
  4222.             se.freq_fftnoteon!=FALSE
  4223.           ELSE
  4224.             se.freq_fftnoteon!=TRUE
  4225.           ENDIF
  4226.         ELSE IF p$="FREQ_FFT_NUM_OF_POINTS"
  4227.           se.freq_fft_pnbr%=MIN(MAX(VAL(p2$),1),1024)
  4228.           '
  4229.           ' Flanger
  4230.           '
  4231.         ELSE IF p$="FLANGER_DRY_LEVEL"
  4232.           se.flanger_dry%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4233.         ELSE IF p$="FLANGER_WET_LEVEL"
  4234.           se.flanger_wet%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4235.         ELSE IF p$="FLANGER_LEFT_SOURCE"
  4236.           se.flanger_lsource%=MIN(MAX(VAL(p2$),0),255)
  4237.         ELSE IF p$="FLANGER_RIGHT_SOURCE"
  4238.           se.flanger_rsource%=MIN(MAX(VAL(p2$),0),255)
  4239.         ELSE IF p$="FLANGER_DELAY"
  4240.           se.flanger_time%=MIN(MAX(VAL(p2$)*1000,0),10000)
  4241.         ELSE IF p$="FLANGER_FREQ"
  4242.           se.flanger_freq%=MIN(MAX(VAL(p2$)*1000,0),50000)
  4243.         ELSE IF p$="FLANGER_DEPTH"
  4244.           se.flanger_depth%=MIN(MAX(VAL(p2$)*1000,0),6350)
  4245.         ELSE IF p$="FLANGER_FDBK_L_L"
  4246.           se.flanger_fdbkll%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4247.         ELSE IF p$="FLANGER_FDBK_L_R"
  4248.           se.flanger_fdbklr%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4249.         ELSE IF p$="FLANGER_FDBK_R_R"
  4250.           se.flanger_fdbkrr%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4251.         ELSE IF p$="FLANGER_FDBK_R_L"
  4252.           se.flanger_fdbkrl%=DIV(32768*MIN(MAX(VAL(p2$),0),999.9),100)
  4253.         ELSE IF p$="FLANGER_INIT_PHASE"
  4254.           se.flanger_phase%=DIV(VAL(p2$)*4096,360) AND 4095
  4255.         ELSE IF p$="FLANGER_WAVE_TYPE"
  4256.           IF p2$="SQUARE"
  4257.             se.flanger_wave%=1
  4258.           ELSE IF p2$="TRIANGLE"
  4259.             se.flanger_wave%=2
  4260.           ELSE IF p2$="RAMPDOWN"
  4261.             se.flanger_wave%=3
  4262.           ELSE IF p2$="RAMPUP"
  4263.             se.flanger_wave%=4
  4264.           ELSE
  4265.             se.flanger_wave%=0
  4266.           ENDIF
  4267.         ELSE IF p$="FLANGER_STEREO"
  4268.           IF p2$="TRUE"
  4269.             se.flanger_stereo!=TRUE
  4270.           ELSE
  4271.             se.flanger_stereo!=FALSE
  4272.           ENDIF
  4273.         ENDIF
  4274.       ENDIF
  4275.     ENDIF
  4276.   WEND
  4277.   CLOSE #0
  4278. RETURN
  4279. PROCEDURE save_prefs
  4280.   LOCAL a$
  4281.   IF flag_registered!
  4282.     IF km%=2 AND nfile_prefs$<>""
  4283.       a$=npath_prefs$+nfile_prefs$
  4284.     ELSE
  4285.       CLS
  4286.       GOSUB cadre_texte("SAVE PREFERENCES",0,0,PRED(scr_ncol%))
  4287.       FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  4288.     ENDIF
  4289.     IF a$<>""
  4290.       CLS
  4291.       GOSUB cadre_texte("WAITING : SAVING PREFERENCES "+a$+"...",0,0,PRED(scr_ncol%))
  4292.       GOSUB save_prefs2(a$)
  4293.       GOSUB separe_nom_chemin(a$)
  4294.       nfile_prefs$=nfile_$
  4295.       npath_prefs$=npath_$
  4296.     ENDIF
  4297.   ELSE
  4298.     GOSUB dialog("SHAREWARE!","PLEASE REGISTER","Now!",MOUSEX,MOUSEY)
  4299.   ENDIF
  4300.   GOSUB affiche_panneau_principal
  4301. RETURN
  4302. PROCEDURE save_prefs2(fic$)
  4303.   LOCAL i%
  4304.   LOCAL lig$
  4305.   OPEN "o",#0,fic$
  4306.   PRINT #0,";*****************************************************************************"
  4307.   PRINT #0,";*                                                                           *"
  4308.   PRINT #0,";*                              GRAOUMF TRACKER                              *"
  4309.   PRINT #0,";*                        by Laurent de Soras 1994-95                        *"
  4310.   PRINT #0,";*                                                                           *"
  4311.   PRINT #0,";*                              Preference file                              *"
  4312.   PRINT #0,";*                          Last update: "+LEFT$(DATE$+"  ",10)+"                          *"
  4313.   PRINT #0,";*                                                                           *"
  4314.   PRINT #0,";*****************************************************************************"
  4315.   PRINT #0,"; Tab = 8"
  4316.   PRINT #0
  4317.   PRINT #0,"; Text following a "";"" is a comment and ignored by Graoumf Tracker."
  4318.   PRINT #0,"; In the file names, a ""/"" means no file."
  4319.   PRINT #0,"; ""$"" means the value is in hexadecimal."
  4320.   PRINT #0
  4321.   PRINT #0
  4322.   PRINT #0
  4323.   '
  4324.   '
  4325.   '
  4326.   PRINT #0,";============================================================================;"
  4327.   PRINT #0,";                       Main pannel                                          ;"
  4328.   PRINT #0,";============================================================================;"
  4329.   PRINT #0
  4330.   lig$="color_pal ="
  4331.   FOR i%=0 TO 15
  4332.     lig$=lig$+" "+HEX$(SHR(PEEK(ADD(&HFFFF9800,SHL(i%,2))),4),1)
  4333.     lig$=lig$+HEX$(SHR(PEEK(ADD(&HFFFF9801,SHL(i%,2))),4),1)
  4334.     lig$=lig$+HEX$(SHR(PEEK(ADD(&HFFFF9803,SHL(i%,2))),4),1)
  4335.   NEXT i%
  4336.   PRINT #0,lig$
  4337.   lig$=""
  4338.   GOSUB write_comment("RGB for 16 colors")
  4339.   lig$="number_of_tracks = "+STR$(nbr_track%)
  4340.   GOSUB write_comment("1-32")
  4341.   lig$="instrument = "+STR$(instr%)
  4342.   GOSUB write_comment("1-255")
  4343.   lig$="sample = "+STR$(sample%)
  4344.   GOSUB write_comment("1-255")
  4345.   lig$="preset = "+STR$(n_preset%)
  4346.   GOSUB write_comment("1-32")
  4347.   lig$="line_step = "+STR$(line_step%)
  4348.   GOSUB write_comment("Jump n-1 lines when entering a note")
  4349.   lig$="octave = "+STR$(SUCC(octave%))
  4350.   GOSUB write_comment("1-7")
  4351.   lig$="pattern_display = "+STR$(type_affpiste%)
  4352.   GOSUB write_comment("0 (without effect), 1 (normal) or 2 (with")
  4353.   GOSUB write_comment("volume column)")
  4354.   a%=DIV(SUB(scr_haut%,180),6) OR 1
  4355.   IF a%=haut_lig%
  4356.     a%=99999
  4357.   ELSE
  4358.     a%=haut_lig%
  4359.   ENDIF
  4360.   lig$="pattern_line_max = "+STR$(a%)
  4361.   GOSUB write_comment("Maximum number of lines displayed on screen.")
  4362.   GOSUB write_comment("99999 (or very high #) = resolution limit.")
  4363.   lig$="numpad = "+FN get_elt_in_list$("samples,drumkit",drumpad_flag%)
  4364.   GOSUB write_comment("samples, drumkit")
  4365.   lig$="menu = "+FN get_elt_in_list$("disk,tools,instruments,samples,envelopes",PRED(ss_menu%))
  4366.   GOSUB write_comment("disk, tools, instruments, samples, envelopes, control")
  4367.   PRINT #0
  4368.   PRINT #0,";-----------------------------------------------------------------------------"
  4369.   PRINT #0,"; Disk"
  4370.   PRINT #0,";------"
  4371.   PRINT #0
  4372.   lig$=";program_path = "+npath_prog$
  4373.   GOSUB write_comment("Path of GTPLAY.PGT and DUMTRACK.PGT. Usually")
  4374.   GOSUB write_comment("unused.")
  4375.   PRINT #0,"module_path = "+npath_module$
  4376.   PRINT #0,"sample_path = "+npath_sample$
  4377.   PRINT #0,"autoload_path = "+npath_autoload$
  4378.   PRINT #0,"pref_path = "+npath_prefs$
  4379.   PRINT #0,"misc_path = "+npath_div$
  4380.   PRINT #0
  4381.   PRINT #0,"module_ext = "+next_module$
  4382.   PRINT #0,"sample_ext = "+next_sample$
  4383.   PRINT #0
  4384.   PRINT #0,"module_file = ";
  4385.   IF nfile_module$<>""
  4386.     PRINT #0,nfile_module$
  4387.   ELSE
  4388.     PRINT #0,"/"
  4389.   ENDIF
  4390.   PRINT #0,"sample_file = ";
  4391.   IF nfile_sample$<>""
  4392.     PRINT #0,nfile_sample$
  4393.   ELSE
  4394.     PRINT #0,"/"
  4395.   ENDIF
  4396.   PRINT #0,"autoload_file = ";
  4397.   IF nfile_autoload$<>""
  4398.     PRINT #0,nfile_autoload$
  4399.   ELSE
  4400.     PRINT #0,"/"
  4401.   ENDIF
  4402.   PRINT #0,"pref_file = ";
  4403.   IF nfile_prefs$<>""
  4404.     PRINT #0,nfile_prefs$
  4405.   ELSE
  4406.     PRINT #0,"/"
  4407.   ENDIF
  4408.   PRINT #0
  4409.   PRINT #0,"save_config_gt2 = "+FN falsetrue$(flag_gt2cnf!)
  4410.   PRINT #0,"module_backup = "+FN falsetrue$(flag_backup_modules!)
  4411.   PRINT #0
  4412.   PRINT #0,";-----------------------------------------------------------------------------"
  4413.   PRINT #0,"; Tools"
  4414.   PRINT #0,";-------"
  4415.   PRINT #0
  4416.   lig$="block_type = "+FN get_elt_in_list$("track,pattern,preset",trackpat%)
  4417.   GOSUB write_comment("track, pattern, preset")
  4418.   lig$="block_song = "+FN falsetrue$(bl_flagsong!)
  4419.   GOSUB write_comment("If it's on the whole song or just 1 pattern")
  4420.   PRINT #0,"block_replace = "+FN falsetrue$(replaceblock%)
  4421.   PRINT #0,"block_mask = "+FN falsetrue$(maskblock%)
  4422.   ' block_mask1 = ??? ?? ???? ??    ; * Not implemented *
  4423.   ' block_mask2 = ??? ?? ???? ??    ; * Not implemented *
  4424.   lig$="tools_echo_step = "+STR$(bl_echo_lines%)
  4425.   GOSUB write_comment("1-64")
  4426.   lig$="tools_echo_fdbkval = "+STR$(bl_echo_feedback%)
  4427.   GOSUB write_comment("Feedback value (0-100 per cent)")
  4428.   lig$="tools_echo_fadestep = "+STR$(bl_echo_fadestep%)
  4429.   GOSUB write_comment("0-255")
  4430.   PRINT #0,"tools_echo_cont = "+FN falsetrue$(bl_echo_cont!)
  4431.   lig$="tools_echo_feedback = "+FN falsetrue$(bl_echo_fdbk!)
  4432.   GOSUB write_comment("Feedback (logarithmic fade) or linear fade")
  4433.   PRINT #0
  4434.   ' note_extension = ???? ??    ; * Not implemented *
  4435.   PRINT #0
  4436.   PRINT #0,";-----------------------------------------------------------------------------"
  4437.   PRINT #0,"; Envelopes"
  4438.   PRINT #0,";-----------"
  4439.   PRINT #0
  4440.   lig$="envelope = "+STR$(env_num&)
  4441.   GOSUB write_comment("1-64")
  4442.   lig$="env_section = "+FN get_elt_in_list$("attack,keyoff",env_sect&)
  4443.   GOSUB write_comment("attack, keyoff")
  4444.   lig$="envelope_type = "+FN get_elt_in_list$("volume,tone,panning",ss_menue%)
  4445.   GOSUB write_comment("volume, tone, panning")
  4446.   lig$="envelope_copy = "+STR$(env_copy&)
  4447.   GOSUB write_comment("1-64")
  4448.   PRINT #0
  4449.   PRINT #0
  4450.   PRINT #0
  4451.   PRINT #0,";============================================================================;"
  4452.   PRINT #0,";                       Sample Editor                                        ;"
  4453.   PRINT #0,";============================================================================;"
  4454.   PRINT #0
  4455.   lig$="keep_buffer = "+FN falsetrue$(flag_keep_buffer!)
  4456.   GOSUB write_comment("true: keep better the buffer when loading")
  4457.   GOSUB write_comment("a module (but it's slower)")
  4458.   PRINT #0
  4459.   PRINT #0,";-----------------------------------------------------------------------------"
  4460.   PRINT #0,"; Mix"
  4461.   PRINT #0,";-----"
  4462.   PRINT #0
  4463.   lig$="mix_master_volume = "+FN pourcent$(se.mix_master_volume%,32768)
  4464.   GOSUB write_comment("%")
  4465.   PRINT #0
  4466.   PRINT #0,";-----------------------------------------------------------------------------"
  4467.   PRINT #0,"; Frequency"
  4468.   PRINT #0,";-----------"
  4469.   PRINT #0
  4470.   lig$="freq_new_sample_freq = "+STR$(se.freq_nfe%)
  4471.   GOSUB write_comment("Hz")
  4472.   lig$="freq_old_note_freq = "+STR$(se.freq_ofn%)
  4473.   GOSUB write_comment("Hz")
  4474.   lig$="freq_new_note_freq = "+STR$(se.freq_nfn%)
  4475.   GOSUB write_comment("Hz")
  4476.   lig$="freq_interpolation = "+FN get_elt_in_list$("none,linear,3rd degree",se.freq_iptype%)
  4477.   GOSUB write_comment("none, linear")
  4478.   lig$="freq_fft_display = "+FN get_elt_in_list$("linear,logarithmic",se.freq_fftdisp%)
  4479.   GOSUB write_comment("linear, logarithmic")
  4480.   lig$="freq_fft_window = "+FN get_elt_in_list$("rectangle,Blackman",se.freq_fftwin%)
  4481.   GOSUB write_comment("rectangle, Blackman")
  4482.   PRINT #0,"freq_fft_note_display = "+FN falsetrue$(se.freq_fftnoteon!)
  4483.   lig$="freq_fft_num_of_points = "+STR$(se.freq_fft_pnbr%)
  4484.   GOSUB write_comment("1-1024")
  4485.   PRINT #0
  4486.   PRINT #0,";-----------------------------------------------------------------------------"
  4487.   PRINT #0,"; Flanger"
  4488.   PRINT #0,";---------"
  4489.   PRINT #0
  4490.   lig$="flanger_dry_level = "+FN pourcent$(se.flanger_dry%,32768)
  4491.   GOSUB write_comment("%")
  4492.   lig$="flanger_wet_level = "+FN pourcent$(se.flanger_wet%,32768)
  4493.   GOSUB write_comment("%")
  4494.   lig$="flanger_left_source = "
  4495.   IF se.flanger_lsource%=0
  4496.     lig$=lig$+"buffer"
  4497.   ELSE
  4498.     lig$=lig$+STR$(se.flanger_lsource%)
  4499.   ENDIF
  4500.   GOSUB write_comment("Left source: buffer or sample # (1-255)")
  4501.   lig$="flanger_right_source = "
  4502.   IF se.flanger_rsource%=0
  4503.     lig$=lig$+"buffer"
  4504.   ELSE
  4505.     lig$=lig$+STR$(se.flanger_rsource%)
  4506.   ENDIF
  4507.   GOSUB write_comment("Right source: buffer or sample # (1-255)")
  4508.   lig$="flanger_delay = "+STR$(se.flanger_time%/1000)
  4509.   GOSUB write_comment("Flanger delay (ms). Maximum: 10 ms")
  4510.   lig$="flanger_freq = "+STR$(se.flanger_freq%/1000)
  4511.   GOSUB write_comment("Flanger LFO frequency (Hz). Maximum: 50 Hz")
  4512.   lig$="flanger_depth = "+STR$(se.flanger_depth%/1000)
  4513.   GOSUB write_comment("Flanger depth (ms). Maximum: 6.35 ms")
  4514.   lig$="flanger_fdbk_l_l = "+FN pourcent$(se.flanger_fdbkll%,32768)
  4515.   GOSUB write_comment("Feedback Left -> Left (%)")
  4516.   lig$="flanger_fdbk_l_r = "+FN pourcent$(se.flanger_fdbklr%,32768)
  4517.   GOSUB write_comment("Feedback Left -> Right (%)")
  4518.   lig$="flanger_fdbk_r_r = "+FN pourcent$(se.flanger_fdbkrr%,32768)
  4519.   GOSUB write_comment("Feedback Right -> Right (%)")
  4520.   lig$="flanger_fdbk_r_l = "+FN pourcent$(se.flanger_fdbkrl%,32768)
  4521.   GOSUB write_comment("Feedback Right -> Left (%)")
  4522.   lig$="flanger_init_phase = "+STR$(MUL(se.flanger_phase%,360)/4096)
  4523.   GOSUB write_comment("Initial phase (0-359°)")
  4524.   lig$="flanger_wave_type = "+FN get_elt_in_list$("sin,square,triangle,rampdown,rampup",se.flanger_wave%)
  4525.   GOSUB write_comment("sin, square, triangle, rampdown or rampup")
  4526.   lig$="flanger_stereo = "+FN falsetrue$(se.flanger_stereo!)
  4527.   GOSUB write_comment("false = mono, true = stereo")
  4528.   PRINT #0
  4529.   PRINT #0,";-----------------------------------------------------------------------------"
  4530.   PRINT #0,"; End of file"
  4531.   CLOSE #0
  4532. RETURN
  4533. PROCEDURE write_comment(a$)
  4534.   ' Ecrit sur le fichier #0 un commentaire au bout de la variable lig$
  4535.   ' Utilise et modifie lig$
  4536.   lig$=lig$+STRING$(MAX(SUCC(DIV(SUB(31,LEN(lig$)),8)),1),9)
  4537.   lig$=lig$+"; "+a$
  4538.   PRINT #0,lig$
  4539.   lig$=""
  4540. RETURN
  4541. PROCEDURE make_directory
  4542.   LOCAL a$,bouton%
  4543.   CLS
  4544.   GOSUB cadre_texte("MAKE NEW DIRECTORY",0,0,PRED(scr_ncol%))
  4545.   FILESELECT npath_div$+"*.*","",a$
  4546.   IF a$<>""
  4547.     CLS
  4548.     GOSUB separe_nom_chemin(a$)
  4549.     IF nfile_$<>""
  4550.       GOSUB dialog("DISK","Do you really want|to create a new directory|"+a$+"\|ON DISK ?","YES|CANCEL",MOUSEX,MOUSEY)
  4551.       IF bouton%=0
  4552.         CLS
  4553.         GOSUB cadre_texte("CREATING DIRECTORY "+a$+"\...",0,0,PRED(scr_ncol%))
  4554.         MKDIR a$
  4555.         npath_div$=a$+"\"
  4556.       ENDIF
  4557.     ENDIF
  4558.   ENDIF
  4559.   GOSUB affiche_panneau_principal
  4560. RETURN
  4561. PROCEDURE delete_directory
  4562.   LOCAL bouton%,e%
  4563.   LOCAL a$,b$
  4564.   CLS
  4565.   GOSUB cadre_texte("DELETE DIRECTORY",0,0,PRED(scr_ncol%))
  4566.   FILESELECT npath_div$+"*.*","",a$
  4567.   IF a$<>""
  4568.     CLS
  4569.     GOSUB separe_nom_chemin(a$)
  4570.     IF FN exist(npath_$+"*.*")
  4571.       GOSUB dialog("STOP","Directory|"+npath_$+"|must be empty","Cancel",MOUSEX,MOUSEY)
  4572.     ELSE
  4573.       GOSUB dialog("DISK","Do you really want|to delete directory|"+npath_$+"|on disk ?","Ok|Cancel",MOUSEX,MOUSEY)
  4574.       IF bouton%=0
  4575.         CLS
  4576.         GOSUB cadre_texte("DELETING DIRECTORY "+npath_$+"...",0,0,PRED(scr_ncol%))
  4577.         a$=LEFT$(npath_$,PRED(LEN(npath_$)))
  4578.         b$=a$+CHR$(0)
  4579.         e%=GEMDOS(58,L:V:b$)
  4580.         IF e%<0
  4581.           GOSUB dialog("FILE","Error "+STR$(e%)+"during deleting directory|"+a$+"\","Cancel",MOUSEX,MOUSEY)
  4582.         ENDIF
  4583.         GOSUB separe_nom_chemin(a$)
  4584.         npath_div$=npath_$
  4585.       ENDIF
  4586.     ENDIF
  4587.   ENDIF
  4588.   GOSUB affiche_panneau_principal
  4589. RETURN
  4590. PROCEDURE delete_file
  4591.   LOCAL bouton%,e%
  4592.   LOCAL b$
  4593.   CLS
  4594.   GOSUB cadre_texte("DELETE FILE",0,0,PRED(scr_ncol%))
  4595.   FILESELECT npath_div$+"*.*","",a$
  4596.   IF a$<>""
  4597.     IF FN exist(a$)
  4598.       CLS
  4599.       GOSUB dialog("FILE","Do you really|want to delete|"+a$+"|on disk ?","Ok|Cancel",MOUSEX,MOUSEY)
  4600.       IF bouton%=0
  4601.         CLS
  4602.         GOSUB cadre_texte("DELETING FILE "+a$+"...",0,0,PRED(scr_ncol%))
  4603.         b$=a$+CHR$(0)
  4604.         e%=GEMDOS(65,L:V:a$)
  4605.         IF e%<0
  4606.           GOSUB dialog("FILE","Error "+STR$(e%)+" during deleting|file "+a$,"Cancel",MOUSEX,MOUSEY)
  4607.         ENDIF
  4608.         GOSUB separe_nom_chemin(a$)
  4609.         npath_div$=npath_$
  4610.       ENDIF
  4611.     ELSE
  4612.       GOSUB dialog("FILE","File not found:|"+a$,"Cancel",MOUSEX,MOUSEY)
  4613.     ENDIF
  4614.   ENDIF
  4615.   GOSUB affiche_panneau_principal
  4616. RETURN
  4617. PROCEDURE format_disk                   !!!
  4618. RETURN
  4619. PROCEDURE rename_file
  4620.   LOCAL e%
  4621.   LOCAL a$,b$,c$,d$,e$,f$
  4622.   ~FRE(0)
  4623.   CLS
  4624.   GOSUB cadre_texte("RENAME A FILE",0,0,PRED(scr_ncol%))
  4625.   FILESELECT npath_div$+"*.*","",a$
  4626.   IF a$<>""
  4627.     IF FN exist(a$)
  4628.       CLS
  4629.       GOSUB cadre_texte("SELECT NEW NAME OF "+a$,0,0,PRED(scr_ncol%))
  4630.       GOSUB separe_nom_chemin(a$)
  4631.       npath_div$=npath_$
  4632.       c$=nfile_$
  4633.       FILESELECT npath_div$+"*.*",c$,b$
  4634.       GOSUB separe_nom_chemin(b$)
  4635.       d$=nfile_$
  4636.       IF d$<>"" AND d$<>c$ AND npath_$=npath_div$
  4637.         CLS
  4638.         GOSUB cadre_texte("RENAMING "+a$+" AS "+d$+"...",0,0,PRED(scr_ncol%))
  4639.         f$=a$+CHR$(0)
  4640.         e$=b$+CHR$(0)
  4641.         e%=GEMDOS(86,0,L:V:f$,L:V:e$)
  4642.         IF e%<0
  4643.           GOSUB dialog("FILE","Error "+STR$(e%)+" during renaming.","Ok",MOUSEX,MOUSEY)
  4644.         ENDIF
  4645.       ELSE IF npath_$<>npath_div$
  4646.         GOSUB dialog("RENAME","Old and new file|must be in the|same path!","Cancel",MOUSEX,MOUSEY)
  4647.       ENDIF
  4648.     ELSE
  4649.       GOSUB dialog("FILE","File not found:|"+a$,"Cancel",MOUSEX,MOUSEY)
  4650.     ENDIF
  4651.   ENDIF
  4652.   GOSUB affiche_panneau_principal
  4653. RETURN
  4654. PROCEDURE separe_nom_chemin(aaaa$)
  4655.   ' Chercher le nom et le chemin
  4656.   ' Renvoie npath_$ et nfile_$
  4657.   LOCAL iiii%,flag%
  4658.   nfile_$=""
  4659.   npath_$=""
  4660.   flag%=0
  4661.   FOR iiii%=LEN(aaaa$) DOWNTO 1
  4662.     IF MID$(aaaa$,iiii%,1)="\" AND flag%=0
  4663.       flag%=1
  4664.       npath_$=LEFT$(aaaa$,iiii%)
  4665.     ELSE IF flag%=0
  4666.       nfile_$=MID$(aaaa$,iiii%,1)+nfile_$
  4667.     ENDIF
  4668.   NEXT iiii%
  4669. RETURN
  4670. PROCEDURE selpath_module
  4671.   LOCAL a$
  4672.   CLS
  4673.   GOSUB cadre_texte("SELECT PATH FOR MODULE",0,0,PRED(scr_ncol%))
  4674.   FILESELECT npath_module$+next_module$,nfile_module$,a$
  4675.   IF a$<>""
  4676.     GOSUB separe_nom_chemin(a$)
  4677.     nfile_module$=nfile_$
  4678.     npath_module$=npath_$
  4679.   ENDIF
  4680.   GOSUB affiche_panneau_principal
  4681. RETURN
  4682. PROCEDURE selpath_sample
  4683.   LOCAL a$
  4684.   CLS
  4685.   GOSUB cadre_texte("SELECT PATH FOR SAMPLE",0,0,PRED(scr_ncol%))
  4686.   FILESELECT npath_sample$+next_sample$,nfile_sample$,a$
  4687.   IF a$<>""
  4688.     GOSUB separe_nom_chemin(a$)
  4689.     nfile_sample$=nfile_$
  4690.     npath_sample$=npath_$
  4691.   ENDIF
  4692.   GOSUB affiche_panneau_principal
  4693. RETURN
  4694. PROCEDURE selpath_prefs
  4695.   LOCAL a$
  4696.   CLS
  4697.   GOSUB cadre_texte("SELECT PATH FOR PREFERENCE FILE",0,0,PRED(scr_ncol%))
  4698.   FILESELECT npath_prefs$+"*.INF",nfile_prefs$,a$
  4699.   IF a$<>""
  4700.     GOSUB separe_nom_chemin(a$)
  4701.     nfile_prefs$=nfile_$
  4702.     npath_prefs$=npath_$
  4703.   ENDIF
  4704.   GOSUB affiche_panneau_principal
  4705. RETURN
  4706. PROCEDURE selpath_autoload
  4707.   LOCAL a$
  4708.   CLS
  4709.   GOSUB cadre_texte("SELECT PATH FOR AUTOLOAD",0,0,PRED(scr_ncol%))
  4710.   FILESELECT npath_autoload$+next_module$,nfile_autoload$,a$
  4711.   IF a$<>""
  4712.     GOSUB separe_nom_chemin(a$)
  4713.     nfile_autoload$=nfile_$
  4714.     npath_autoload$=npath_$
  4715.   ENDIF
  4716.   GOSUB affiche_panneau_principal
  4717. RETURN
  4718. '
  4719. ' Procedures diverses
  4720. ' -------------------
  4721. PROCEDURE dialog(tit$,txt$,but$,x%,y%)
  4722.   ' Boite de dialogue. txt$=texte, | pour changer de ligne, but$=boutons, | pour separer les boutons
  4723.   ' x% et y% milieu de la boite, tit$ titre
  4724.   ' Renvoie bouton% (0 - n-1)
  4725.   LOCAL a%,b%,i%,j%,ntxt%,nbut%,oldp%,ox%,ox2%,oy%,oy2%,p%,tmax1%,tmax2%,tx%,ty%
  4726.   LOCAL xm%,xm2%,ym%,km%
  4727.   LOCAL ok!
  4728.   LOCAL ptxt$,pbut$
  4729.   HIDEM
  4730.   '
  4731.   ' Recherche du nombre de lignes de texte, indices et longueurs
  4732.   '
  4733.   ptxt$=""
  4734.   p%=1
  4735.   oldp%=p%
  4736.   ntxt%=1
  4737.   tmax1%=0
  4738.   REPEAT
  4739.     IF MID$(txt$,p%,1)="|"
  4740.       ptxt$=ptxt$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  4741.       tmax1%=MAX(tmax1%,SUB(p%,oldp%))
  4742.       oldp%=SUCC(p%)
  4743.       INC ntxt%
  4744.     ENDIF
  4745.     INC p%
  4746.   UNTIL p%>LEN(txt$)
  4747.   ptxt$=ptxt$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  4748.   tmax1%=MAX(tmax1%,SUB(p%,oldp%))
  4749.   '
  4750.   ' Recherche du nombre de boutons, indices et longueurs
  4751.   '
  4752.   pbut$=""
  4753.   p%=1
  4754.   oldp%=p%
  4755.   nbut%=1
  4756.   tmax2%=6
  4757.   REPEAT
  4758.     IF MID$(but$,p%,1)="|"
  4759.       pbut$=pbut$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  4760.       tmax2%=MAX(tmax2%,SUB(p%,oldp%))
  4761.       oldp%=SUCC(p%)
  4762.       INC nbut%
  4763.     ENDIF
  4764.     INC p%
  4765.   UNTIL p%>LEN(but$)
  4766.   pbut$=pbut$+MKI$(oldp%)+MKI$(SUB(p%,oldp%))
  4767.   tmax2%=MAX(tmax2%,SUB(p%,oldp%))
  4768.   ADD tmax2%,2                                  ! 1 espace de chaque cote du bouton
  4769.   '
  4770.   ' Definition de la taille de la boite
  4771.   '
  4772.   tx%=MAX(ADD(tmax1%,4),MUL(ADD(tmax2%,2),nbut%))
  4773.   ty%=ADD(MUL(ntxt%,8),34)                      ! 1+ 12 + 1+4+(8*l-2)+4+1 + 1+1+8+1+1 +1
  4774.   ox%=MIN(MAX(SUB(SHR(x%,3),SHR(tx%,1)),0),SUB(scr_ncol%,SUCC(tx%)))
  4775.   oy%=MIN(MAX(SUB(y%,SUB(ty%,6)),0),SUB(scr_haut%,ADD(ty%,4)))
  4776.   ox2%=SUB(ADD(ox%,tx%),PRED(MUL(ADD(tmax2%,2),nbut%)))
  4777.   oy2%=ADD(oy%,SUB(ty%,12))
  4778.   '
  4779.   ' Affichage de la boite
  4780.   '
  4781.   GOSUB cadre_int(SUCC(ox%),ADD(oy%,4),PRED(tx%),PRED(ty%),0,0,0,0)
  4782.   GOSUB cadre_int(ox%,oy%,PRED(tx%),PRED(ty%),9,9,10,8)
  4783.   GOSUB cadre_ext(SUCC(ox%),ADD(oy%,14),SUB(tx%,3),ADD(SHL(ntxt%,3),5),1,9,8,10)
  4784.   IF tit$<>""
  4785.     GOSUB affchaine_trans(tit$,SHL(SUCC(ox%),1),ADD(oy%,4),8)
  4786.   ENDIF
  4787.   ' Le texte
  4788.   FOR i%=0 TO PRED(ntxt%)
  4789.     a%=CARD{ADD(V:ptxt$,SHL(i%,2))}
  4790.     b%=CARD{ADD(V:ptxt$,ADD(SHL(i%,2),2))}
  4791.     ' GOSUB affchaine_trans(MID$(txt$,a%,b%),SUB(ADD(SHL(ox%,1),tx%),b%),ADD(ADD(oy%,18),SHL(i%,3)),0)
  4792.     ' Texte centre ----^
  4793.     GOSUB affchaine_trans(MID$(txt$,a%,b%),ADD(SHL(ox%,1),4),ADD(ADD(oy%,18),SHL(i%,3)),0)
  4794.   NEXT i%
  4795.   ' Les boutons
  4796.   FOR i%=0 TO PRED(nbut%)
  4797.     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%))
  4798.   NEXT i%
  4799.   '
  4800.   ' Gestion de la souris et du clavier
  4801.   '
  4802.   SHOWM
  4803.   GOSUB wait_mouse(TRUE)
  4804.   bouton%=-1                                    ! Aucun bouton selectionne pour l'instant
  4805.   ok!=FALSE
  4806.   REPEAT
  4807.     REPEAT
  4808.       km%=MOUSEK
  4809.     UNTIL km%<>0 OR GEMDOS(11)<>0               ! Attend qu'on appuie sur le bouton de la souris ou une touche
  4810.     IF km%<>0
  4811.       ' --- Gestion souris ---
  4812.       REPEAT                                    ! Quand on appuie, la selection des boutons suit
  4813.         MOUSE xm%,ym%,km%                       ! la souris jusqu'au relachement
  4814.         xm2%=SHR(xm%,3)
  4815.         a%=DIV(SUB(xm2%,ox2%),ADD(tmax2%,2))
  4816.         b%=SUB(xm2%,ox2%) MOD ADD(tmax2%,2)
  4817.         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
  4818.           IF a%<>bouton%                    ! Si on a change de bouton depuis la derniere fois,
  4819.             IF bouton%>=0                   ! Deselectionne le precedent bouton
  4820.               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)
  4821.             ENDIF
  4822.             bouton%=a%
  4823.             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)
  4824.             ok!=TRUE
  4825.           ENDIF
  4826.         ELSE                                ! On n'est plus sur un bouton
  4827.           IF bouton%>=0                     ! Deselectionne le precedent bouton
  4828.             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)
  4829.           ENDIF
  4830.           bouton%=-1
  4831.           ok!=FALSE
  4832.         ENDIF
  4833.         SHOWM
  4834.       UNTIL km%=0
  4835.     ELSE
  4836.       ' --- Gestion clavier ---
  4837.       a%=GEMDOS(7) AND 255                      ! Caractere ASCII
  4838.       IF a%=>48 AND a%<58                       ! <1> - <0>
  4839.         a%=SUB(a%,39) MOD 10                    ! "1" > 0, ... "9" > 8, "0" > 9
  4840.         IF a%<nbut%                             ! a% numero du bouton selectionne
  4841.           IF bouton%>=0                         ! Deselectionne le precedent bouton
  4842.             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)
  4843.           ENDIF
  4844.           bouton%=a%
  4845.           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)
  4846.         ENDIF
  4847.         ok!=FALSE
  4848.       ELSE IF a%=13 AND bouton%>=0              ! <Return>
  4849.         ok!=TRUE
  4850.       ENDIF
  4851.       SHOWM
  4852.     ENDIF
  4853.   UNTIL bouton%>=0 AND ok!
  4854. RETURN
  4855. PROCEDURE wait_mouse(flag!)
  4856.   IF flag!
  4857.     REPEAT
  4858.     UNTIL MOUSEK=0
  4859.   ENDIF
  4860. RETURN
  4861. PROCEDURE bee(flag!)
  4862.   ' Souris en forme de fleche (False) ou d'abeille (True)
  4863.   HIDEM
  4864.   DEFMOUSE flag! AND 2
  4865.   SHOWM
  4866. RETURN
  4867. PROCEDURE intel_w(aaaa%)
  4868.   LOCAL bbbb%
  4869.   bbbb%=BYTE{SUCC(aaaa%)}
  4870.   BYTE{SUCC(aaaa%)}=BYTE{aaaa%}
  4871.   BYTE{aaaa%}=bbbb%
  4872. RETURN
  4873. PROCEDURE intel_l(aaaa%)
  4874.   LOCAL bbbb%
  4875.   bbbb%=BYTE{ADD(aaaa%,3)}
  4876.   BYTE{ADD(aaaa%,3)}=BYTE{aaaa%}
  4877.   BYTE{aaaa%}=bbbb%
  4878.   bbbb%=BYTE{SUCC(aaaa%)}
  4879.   BYTE{SUCC(aaaa%)}=BYTE{ADD(aaaa%,2)}
  4880.   BYTE{ADD(aaaa%,2)}=bbbb%
  4881. RETURN
  4882. PROCEDURE mem_rotation(aaaa%,llll%,dddd%)
  4883.   ' Rotation de memoire :
  4884.   ' adresse aaaa%, longueur llll%, deplacement dddd%
  4885.   LOCAL bbbb%,aaaa$
  4886.   IF llll%>0
  4887.     dddd%=dddd% MOD llll%                 ! Meilleure direction de deplacement
  4888.     IF ABS(dddd%)>SHR(llll%,2)
  4889.       SUB dddd%,MUL(llll%,SGN(dddd%))
  4890.     ENDIF
  4891.     aaaa$=STRING$(16384,0)                ! Par blocs de 16 Ko
  4892.     IF dddd%=>0
  4893.       WHILE dddd%>0                       ! Deplacement positif (vers la droite)
  4894.         bbbb%=MIN(dddd%,16384)
  4895.         ~C:g_bmove%(L:ADD(aaaa%,SUB(llll%,bbbb%)),L:V:aaaa$,L:bbbb%)
  4896.         ~C:g_bmove%(L:aaaa%,L:ADD(aaaa%,bbbb%),L:SUB(llll%,bbbb%))
  4897.         ~C:g_bmove%(L:V:aaaa$,L:aaaa%,L:bbbb%)
  4898.         SUB dddd%,bbbb%
  4899.       WEND
  4900.     ELSE
  4901.       WHILE dddd%<0                       ! Deplacement negatif (vers la gauche)
  4902.         bbbb%=MIN(-dddd%,16384)
  4903.         ~C:g_bmove%(L:aaaa%,L:V:aaaa$,L:bbbb%)
  4904.         ~C:g_bmove%(L:ADD(aaaa%,bbbb%),L:aaaa%,L:SUB(llll%,bbbb%))
  4905.         ~C:g_bmove%(L:V:aaaa$,L:ADD(aaaa%,SUB(llll%,bbbb%)),L:bbbb%)
  4906.         ADD dddd%,bbbb%
  4907.       WEND
  4908.     ENDIF
  4909.   ENDIF
  4910. RETURN
  4911. PROCEDURE clear_mem(aaaa%,llll%)
  4912.   ' Vide une partie de la memoire (methode rapide en GfA)
  4913.   ' aaaa% = adresse, llll% = longueur
  4914.   ' Ne fait rien si longueur <= 0
  4915.   LOCAL l_clr%
  4916.   ~FRE(0)
  4917.   IF llll%>0
  4918.     l_clr%=1
  4919.     BYTE{aaaa%}=0                               ! Efface le premier octet
  4920.     WHILE l_clr%<=SHR(llll%,1)                  ! Efface au moins la moitie du
  4921.       BMOVE aaaa%,ADD(aaaa%,l_clr%),l_clr%      ! buffer par doublages successifs
  4922.       ADD l_clr%,l_clr%                         ! de la surface effacee
  4923.     WEND
  4924.     BMOVE aaaa%,ADD(aaaa%,l_clr%),SUB(llll%,l_clr%)     ! Le reste
  4925.   ENDIF
  4926. RETURN
  4927. PROCEDURE decale_sample(i%,nbs%,adi%)
  4928.   ' adi$ commence au sample 1 et contient des adresses
  4929.   LOCAL a%,b%,c%,d%,j%,pt%
  4930.   a%=FN length(i%)
  4931.   d%=FN adresse(i%)
  4932.   b%=ADD(a%,d%)
  4933.   pt%=LONG{ADD(adi%,SHL(PRED(i%),2))}
  4934.   IF a%>0
  4935.     j%=i%                       ! Scanne les samples suivants
  4936.     WHILE j%<nbs%
  4937.       c%=LONG{ADD(adi%,SHL(j%,2))}
  4938.       EXIT IF c%<b% AND c%>d%
  4939.       INC j%
  4940.     WEND
  4941.     IF j%<nbs% OR flag_keep_buffer!     ! On a trouve un sample qui va se faire ecraser alors on tourne
  4942.       GOSUB mem_rotation(d%,SUB(ADD(pt%,a%),d%),a%)
  4943.       IF i%<nbs%                        ! Repositionne les samples qui etaient avant celui-la
  4944.         FOR j%=SHL(i%,2) TO SHL(PRED(nbs%),2) STEP 4
  4945.           IF LONG{ADD(adi%,j%)}<pt%
  4946.             LONG{ADD(adi%,j%)}=ADD(LONG{ADD(adi%,j%)},a%)
  4947.           ENDIF
  4948.         NEXT j%
  4949.       ENDIF
  4950.       ADD translate%,a%
  4951.     ELSE                        ! Pas de probleme, on effectue une simple copie et un deplacement du reste
  4952.       IF i%<255
  4953.         ~C:g_bmove%(L:d%,L:b%,L:SUB(FN adr_buffer,d%))
  4954.       ENDIF
  4955.       ~C:g_bmove%(L:pt%,L:d%,L:a%)
  4956.     ENDIF
  4957.     IF i%<255                   ! Reajuste les adresses des samples suivants
  4958.       FOR j%=SHL(SUCC(i%),2) TO &H3FC STEP 4
  4959.         LONG{ADD(r_adr_sample%,j%)}=ADD(LONG{ADD(r_adr_sample%,j%)},a%)
  4960.       NEXT j%
  4961.     ENDIF
  4962.   ENDIF
  4963. RETURN
  4964. PROCEDURE vide_buffer_clavier
  4965.   WHILE GEMDOS(11)<>0
  4966.     ~GEMDOS(7)
  4967.   WEND
  4968. RETURN
  4969. PROCEDURE play_pattern_bidon
  4970.   DPOKE r_mod_songrep%,1
  4971.   DPOKE r_mod_songlen%,2
  4972.   DPOKE r_mod_songpos%,0
  4973.   DPOKE r_mod_numpat%,256
  4974.   DPOKE r_mod_patrep%,0
  4975.   LPOKE r_adr_module%,V:module_bidon%(0)
  4976.   LPOKE r_adr_song%,V:song_bidon%(0)
  4977.   DPOKE r_mod_linepos%,0
  4978.   DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  4979. RETURN
  4980. PROCEDURE play_song(a%)
  4981.   GOSUB play_song2(a%)
  4982.   GOSUB aff_ps_pp_e
  4983.   GOSUB aff_message("Playing song...")
  4984. RETURN
  4985. PROCEDURE play_song2(a%)
  4986.   GOSUB stop_voices
  4987.   play%=1
  4988.   LPOKE r_adr_module%,V:module&(0)
  4989.   LPOKE r_adr_song%,V:song&(0)
  4990.   DPOKE r_mod_songrep%,module&(102)
  4991.   DPOKE r_mod_songlen%,module&(101)
  4992.   DPOKE r_mod_songpos%,songpos%
  4993.   DPOKE r_mod_numpat%,song&(songpos%)
  4994.   IF a%=0
  4995.     DPOKE r_mod_linepos%,0
  4996.   ELSE
  4997.     DPOKE r_mod_linepos%,posligne%
  4998.   ENDIF
  4999.   DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  5000.   debut_temps%=TIMER
  5001.   IF edit%=0
  5002.     SLPOKE &HFFFF983C,&HE00000  ! Vert
  5003.   ENDIF
  5004. RETURN
  5005. PROCEDURE play_pattern(a%)
  5006.   GOSUB stop_voices
  5007.   play%=2
  5008.   LPOKE r_adr_module%,V:module&(0)
  5009.   LPOKE r_adr_song%,V:song&(0)
  5010.   DPOKE r_mod_songrep%,songpos%
  5011.   DPOKE r_mod_songlen%,SUCC(songpos%)
  5012.   DPOKE r_mod_songpos%,songpos%
  5013.   DPOKE r_mod_numpat%,song&(songpos%)
  5014.   IF a%=0
  5015.     DPOKE r_mod_linepos%,0
  5016.   ELSE
  5017.     DPOKE r_mod_linepos%,posligne%
  5018.   ENDIF
  5019.   DPOKE r_mod_nbrvbl%,DPEEK(r_mod_speed%)
  5020.   debut_temps%=TIMER
  5021.   GOSUB aff_ps_pp_e
  5022.   GOSUB aff_message("Playing pattern...")
  5023.   IF edit%=0
  5024.     SLPOKE &HFFFF983C,&HFF800000  ! Jaune
  5025.   ENDIF
  5026. RETURN
  5027. PROCEDURE stop_voices
  5028.   LOCAL i%
  5029.   FOR i%=0 TO PRED(nbr_track%)
  5030.     LONG{ADD(V:pattern_bidon%(8),MUL(i%,5))}=0
  5031.   NEXT i%
  5032.   GOSUB play_pattern_bidon
  5033.   DPOKE r_flag_stop_voices%,1
  5034.   play%=0
  5035.   IF edit%=0
  5036.     SLPOKE &HFFFF983C,&HFFFF00FF  ! Blanc
  5037.   ELSE
  5038.     SLPOKE &HFFFF983C,&HFF        ! Bleu
  5039.   ENDIF
  5040.   REPEAT
  5041.   UNTIL DPEEK(r_flag_stop_voices%)=0
  5042. RETURN
  5043. PROCEDURE stop_edit
  5044.   IF play%<>0
  5045.     IF play%=1
  5046.       GOSUB aff_message("Song stopped.")
  5047.     ELSE
  5048.       GOSUB aff_message("Pattern stopped.")
  5049.     ENDIF
  5050.     GOSUB stop_voices
  5051.     edit%=0
  5052.     SLPOKE &HFFFF983C,&HFFFF00FF                ! Blanc
  5053.   ELSE
  5054.     GOSUB stop_voices
  5055.     IF edit%=0
  5056.       edit%=1
  5057.       SLPOKE &HFFFF983C,&HFF                    ! Bleu
  5058.       GOSUB aff_message("Edit mode activated.")
  5059.     ELSE
  5060.       edit%=0
  5061.       SLPOKE &HFFFF983C,&HFFFF00FF              ! Blanc
  5062.       GOSUB aff_message("Edit mode deactivated.")
  5063.     ENDIF
  5064.   ENDIF
  5065.   GOSUB aff_ps_pp_e
  5066. RETURN
  5067. PROCEDURE balance_reset
  5068.   LOCAL i%
  5069.   FOR i%=0 TO 31
  5070.     GOSUB chg_t_balance(i%,MUL(SHR(SUCC(i%),1) AND 1,&HFFF))
  5071.   NEXT i%
  5072. RETURN
  5073. PROCEDURE set_balance(a$)
  5074.   LOCAL i%
  5075.   FOR i%=0 TO 31
  5076.     GOSUB chg_t_balance(i%,CARD{ADD(V:a$,SHL(i%,1))})
  5077.   NEXT i%
  5078. RETURN
  5079. PROCEDURE all_track_on(flag!)
  5080.   LOCAL i%
  5081.   FOR i%=0 TO 31
  5082.     DPOKE ADD(ADD(r_info_track%,r_onoff_t%),MUL(r_itl%,i%)),1
  5083.     IF flag!
  5084.       GOSUB cadre_texte2(STR$(SUCC(i%)),ADD(8,SHL(i%,1)),120,1,FN track_onoff(i%) XOR 1)
  5085.     ENDIF
  5086.   NEXT i%
  5087. RETURN
  5088. PROCEDURE kill_sample(s%)
  5089.   GOSUB stop_voices
  5090.   GOSUB chg_taille_sample(s%,0)
  5091.   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)
  5092.   BMOVE V:a$,FN adrsamchk(s%),64
  5093. RETURN
  5094. PROCEDURE clear_patterns2
  5095.   ' Se contente de reduire les patterns a leur taille minimum
  5096.   LOCAL a%,b%,c%,i%,a$
  5097.   c%=1                                          ! 1 seule ligne pour tous les patterns vides
  5098.   b%=FN zone_start
  5099.   a%=ADD(MUL(MUL(c%,nbr_track%),5),32)
  5100.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(c%)+MKI$(nbr_track%)
  5101.   FOR i%=0 TO 255
  5102.     CARD{ADD(V:a$,8)}=i%
  5103.     BMOVE V:a$,b%,LEN(a$)
  5104.     GOSUB chg_pat_chunkadr(i%,b%)
  5105.     ADD b%,a%
  5106.   NEXT i%
  5107.   bl_start&=0
  5108.   bl_end&=0
  5109.   bl_pat&=0
  5110. RETURN
  5111. PROCEDURE clear_patterns
  5112.   LOCAL i%
  5113.   GOSUB clear_patterns2
  5114.   FOR i%=0 TO 255
  5115.     GOSUB clear_mem(FN adr_pat(i%),MUL(MUL(FN nbr_track(i%),FN nbr_lines(i%)),5))
  5116.   NEXT i%
  5117.   GOSUB garbage_collection
  5118. RETURN
  5119. PROCEDURE clear_song(flag!)
  5120.   ' Efface la song et les patterns
  5121.   ' Si flag! est faux, songname n'est pas efface
  5122.   LOCAL a%,b%,i%
  5123.   GOSUB stop_voices
  5124.   ARRAYFILL song&(),0
  5125.   GOSUB clear_patterns
  5126.   IF flag!
  5127.     FOR i%=2 TO 97
  5128.       module&(i%)=&H2020
  5129.     NEXT i%
  5130.   ENDIF
  5131.   module&(101)=1
  5132.   module&(102)=0
  5133.   songpos%=0
  5134. RETURN
  5135. PROCEDURE clear_samples
  5136.   ' Efface les samples
  5137.   GOSUB stop_voices
  5138.   GOSUB clear_samples2
  5139.   sample%=1
  5140. RETURN
  5141. PROCEDURE clear_samples2
  5142.   LOCAL i%,j%,a$
  5143.   j%=ADD(FN env_chunkadr(63,2),FN env_chunklen(63,2))
  5144.   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)
  5145.   FOR i%=0 TO 255
  5146.     LONG{ADD(r_adr_sample%,SHL(i%,2))}=ADD(j%,MUL(i%,64))
  5147.     BMOVE V:a$,LONG{ADD(r_adr_sample%,SHL(i%,2))},64
  5148.     CARD{ADD(LONG{ADD(r_adr_sample%,SHL(i%,2))},8)}=i%
  5149.   NEXT i%
  5150.   GOSUB garbage_collection
  5151. RETURN
  5152. PROCEDURE clear_instr
  5153.   ' Efface les instruments (seulement les instr+env, pas les samples)
  5154.   LOCAL a%,b%,i%,j%
  5155.   FOR i%=0 TO 255
  5156.     instrset%(0,i%)=&H494E5354                  ! 'INST'
  5157.     instrset%(1,i%)=316                         ! Taille du chunk
  5158.     instrset%(2,i%)=ADD(SHL(i%,16),&H2020)      ! Numero + Nom
  5159.     FOR j%=3 TO 8
  5160.       instrset%(j%,i%)=&H20202020               ! Nom
  5161.     NEXT j%
  5162.     instrset%(9,i%)=&H20200000                  ! Nom + Type (sample)
  5163.     instrset%(10,i%)=&H100FFFF                  ! Volume + Autobalance
  5164.     instrset%(11,i%)=0                          ! Enveloppe volume + tonalite
  5165.     instrset%(12,i%)=0                          ! Enveloppe panning + reserve
  5166.     instrset%(13,i%)=0                          ! Reserve
  5167.     instrset%(14,i%)=0                          ! Reserve
  5168.     instrset%(15,i%)=SHL(i%,8)
  5169.     a%=ADD(SHL(i%,24),SHL(i%,8))
  5170.     b%=V:instrset%(16,i%)
  5171.     LONG{b%}=a%
  5172.     BMOVE b%,ADD(b%,4),4                        ! Remplit 252 octets avec le meme mot
  5173.     BMOVE b%,ADD(b%,8),8
  5174.     BMOVE b%,ADD(b%,16),16
  5175.     BMOVE b%,ADD(b%,32),32
  5176.     BMOVE b%,ADD(b%,64),64
  5177.     BMOVE b%,ADD(b%,128),124
  5178.   NEXT i%
  5179.   GOSUB clear_enveloppes
  5180. RETURN
  5181. PROCEDURE clear_enveloppes
  5182.   ' Efface les enveloppes de volume, tonalite et panning
  5183.   ' Dans la mem, les env sont rangees dans cet ordre : V T P  V T P  V T P...
  5184.   LOCAL i%,a%,deb%
  5185.   deb%=ADD(FN adr_patchunk(255),FN lon_patchunk(255))
  5186.   FOR i%=0 TO 63
  5187.     a%=ADD(deb%,MUL(i%,102))
  5188.     LONG{a%}=&H56454E56         ! 'VENV'
  5189.     LONG{ADD(a%,4)}=34
  5190.     CARD{ADD(a%,8)}=i%
  5191.     LONG{ADD(a%,10)}=&H20202020
  5192.     LONG{ADD(a%,14)}=&H20202020
  5193.     LONG{ADD(a%,18)}=&H20202020
  5194.     LONG{ADD(a%,22)}=&H20202020
  5195.     LONG{ADD(a%,26)}=&H20202020
  5196.     LONG{ADD(a%,30)}=&H10000
  5197.     GOSUB chg_env_chunkadr(i%,0,a%)
  5198.     a%=ADD(ADD(deb%,34),MUL(i%,102))
  5199.     LONG{a%}=&H54454E56         ! 'TENV'
  5200.     LONG{ADD(a%,4)}=34
  5201.     CARD{ADD(a%,8)}=i%
  5202.     LONG{ADD(a%,10)}=&H20202020
  5203.     LONG{ADD(a%,14)}=&H20202020
  5204.     LONG{ADD(a%,18)}=&H20202020
  5205.     LONG{ADD(a%,22)}=&H20202020
  5206.     LONG{ADD(a%,26)}=&H20202020
  5207.     LONG{ADD(a%,30)}=&H10000
  5208.     GOSUB chg_env_chunkadr(i%,1,a%)
  5209.     a%=ADD(ADD(deb%,68),MUL(i%,102))
  5210.     LONG{a%}=&H50454E56         ! 'PENV'
  5211.     LONG{ADD(a%,4)}=34
  5212.     CARD{ADD(a%,8)}=i%
  5213.     LONG{ADD(a%,10)}=&H20202020
  5214.     LONG{ADD(a%,14)}=&H20202020
  5215.     LONG{ADD(a%,18)}=&H20202020
  5216.     LONG{ADD(a%,22)}=&H20202020
  5217.     LONG{ADD(a%,26)}=&H20202020
  5218.     LONG{ADD(a%,30)}=&H10000
  5219.     GOSUB chg_env_chunkadr(i%,2,a%)
  5220.   NEXT i%
  5221.   env_poscurs&=0
  5222.   env_posaff&=0
  5223.   GOSUB garbage_collection
  5224. RETURN
  5225. PROCEDURE garbage_collection
  5226.   ' Regroupe les patterns, enveloppes et samples
  5227.   ' dans cet ordre, en bas de la memoire.
  5228.   ' garbage% aurorise la manipulation de chaque type de chunk
  5229.   LOCAL i%,j%,na%,oa%,l%
  5230.   ' Les patterns
  5231.   IF garbage%>0
  5232.     FOR i%=0 TO 255
  5233.       oa%=FN adr_patchunk(i%)
  5234.       IF i%>0
  5235.         na%=ADD(FN adr_patchunk(PRED(i%)),FN lon_patchunk(PRED(i%)))
  5236.       ELSE
  5237.         na%=FN zone_start
  5238.       ENDIF
  5239.       IF oa%<>na%
  5240.         l%=FN lon_patchunk(i%)
  5241.         GOSUB chg_pat_chunkadr(i%,na%)
  5242.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  5243.       ENDIF
  5244.     NEXT i%
  5245.   ENDIF
  5246.   ' Les enveloppes
  5247.   IF garbage%>1
  5248.     FOR i%=0 TO 191
  5249.       oa%=FN env_chunkadr(DIV(i%,3),i% MOD 3)
  5250.       IF i%>0
  5251.         na%=ADD(FN env_chunkadr(DIV(PRED(i%),3),PRED(i%) MOD 3),FN env_chunklen(DIV(PRED(i%),3),PRED(i%) MOD 3))
  5252.       ELSE
  5253.         na%=ADD(FN adr_patchunk(255),FN lon_patchunk(255))
  5254.       ENDIF
  5255.       IF oa%<>na%
  5256.         l%=FN env_chunklen(DIV(i%,3),i% MOD 3)
  5257.         GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,na%)
  5258.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  5259.       ENDIF
  5260.     NEXT i%
  5261.   ENDIF
  5262.   ' Les samples
  5263.   IF garbage%>2
  5264.     FOR i%=0 TO 255
  5265.       oa%=FN adrsamchk(i%)
  5266.       IF i%>0
  5267.         na%=ADD(FN adrsamchk(PRED(i%)),FN lonsamchk(PRED(i%)))
  5268.       ELSE
  5269.         na%=ADD(FN env_chunkadr(63,2),FN env_chunklen(63,2))
  5270.       ENDIF
  5271.       IF oa%<>na%
  5272.         l%=FN lonsamchk(i%)
  5273.         GOSUB chg_sam_chunkadr(i%,na%)
  5274.         ~C:g_bmove%(L:oa%,L:na%,L:l%)
  5275.       ENDIF
  5276.     NEXT i%
  5277.   ENDIF
  5278. RETURN
  5279. PROCEDURE create_space_patchunk(p%,t%,l%,flag!)
  5280.   ' Demenage la memoire pour obtenir un pattern de t% tracks, l% lignes
  5281.   ' Le header du chunk est modifie mais pas les donnees du pattern
  5282.   ' Si flag! n'est pas mis, seulement les patterns seront deplaces (on devra
  5283.   ' avoir verifie que la place pour cette operation a bien ete inseree entre
  5284.   ' les patterns et les enveloppes).
  5285.   LOCAL a%,b%,c%,i%,oldlen%,newlen%,dif%
  5286.   IF p%<255
  5287.     oldlen%=SUB(FN adr_patchunk(SUCC(p%)),FN adr_patchunk(p%))
  5288.   ELSE
  5289.     oldlen%=SUB(FN env_chunkadr(0,0),FN adr_patchunk(p%))
  5290.   ENDIF
  5291.   newlen%=ADD(MUL(MUL(t%,l%),5),32)
  5292.   dif%=SUB(newlen%,oldlen%)
  5293.   IF dif%<>0
  5294.     a%=ADD(FN adr_patchunk(p%),oldlen%)
  5295.     b%=ADD(FN adr_patchunk(p%),newlen%)
  5296.     c%=SUB(FN adr_buffer,a%)
  5297.     IF p%<255
  5298.       FOR i%=SUCC(p%) TO 255                      ! Change les adresses des patterns
  5299.         GOSUB chg_pat_chunkadr(i%,ADD(FN adr_patchunk(i%),dif%))
  5300.       NEXT i%
  5301.     ENDIF
  5302.     IF flag!
  5303.       FOR i%=0 TO 191                             ! Change les adresses des enveloppes
  5304.         GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),dif%))
  5305.       NEXT i%
  5306.       FOR i%=0 TO 255                             ! Change les adresses des samples
  5307.         GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  5308.       NEXT i%
  5309.     ENDIF
  5310.     IF flag!
  5311.       ~C:g_bmove%(L:a%,L:b%,L:c%)
  5312.     ELSE IF p%<255
  5313.       ~C:g_bmove%(L:a%,L:b%,L:SUB(FN env_chunkadr(0,0),MAX(a%,b%)))
  5314.     ENDIF
  5315.   ENDIF
  5316.   GOSUB chg_pat_chunklen(p%,newlen%)
  5317.   GOSUB chg_pat_nbr_lines(p%,l%)
  5318.   GOSUB chg_pat_nbr_track(p%,t%)
  5319. RETURN
  5320. PROCEDURE create_space_multipatchunk(map$,nbp%,flag!)
  5321.   ' Comme ci-dessus mais pour plusieurs patterns (0...nbp%-1)
  5322.   ' map$ contient (NbTi.w,NbLi.w), i de 0 a nbp%-1
  5323.   ' Tous les chunks sont bien deplaces
  5324.   ' Si flag! est mis, les nouveaux patterns crees sont nettoyes
  5325.   LOCAL a%,b%,c%,d%,i%,dif%
  5326.   LOCAL a$
  5327.   ' Calcul de la place occupee par ces nouveaux patterns
  5328.   a%=0
  5329.   FOR i%=0 TO PRED(nbp%)
  5330.     ADD a%,ADD(MUL(MUL(CARD{ADD(V:map$,SHL(i%,2))},CARD{ADD(V:map$,ADD(SHL(i%,2),2))}),5),32)
  5331.   NEXT i%
  5332.   IF nbp%<256
  5333.     dif%=SUB(ADD(FN zone_start,a%),FN adr_patchunk(nbp%))
  5334.     ~C:g_bmove%(L:FN adr_patchunk(nbp%),L:ADD(FN zone_start,a%),L:SUB(FN adr_buffer,FN adr_patchunk(nbp%)))
  5335.     FOR i%=nbp% TO 255                            ! Change les adresses des patterns suivants
  5336.       GOSUB chg_pat_chunkadr(i%,ADD(FN adr_patchunk(i%),dif%))
  5337.     NEXT i%
  5338.     FOR i%=0 TO 191                               ! Change les adresses des enveloppes
  5339.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),dif%))
  5340.     NEXT i%
  5341.     FOR i%=0 TO 255                               ! Change les adresses des samples
  5342.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  5343.     NEXT i%
  5344.   ELSE
  5345.     GOSUB create_space_for_patterns(SUB(a%,SUB(FN env_chunkadr(0,0),FN zone_start)))
  5346.   ENDIF
  5347.   ' Creation des nouveaux chunks a la bonne taille
  5348.   b%=FN zone_start
  5349.   FOR i%=0 TO PRED(nbp%)
  5350.     c%=CARD{ADD(V:map$,SHL(i%,2))}
  5351.     d%=CARD{ADD(V:map$,ADD(SHL(i%,2),2))}
  5352.     a%=ADD(MUL(MUL(c%,d%),5),32)
  5353.     a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(d%)+MKI$(c%)
  5354.     CARD{ADD(V:a$,8)}=i%
  5355.     BMOVE V:a$,b%,LEN(a$)
  5356.     GOSUB chg_pat_chunkadr(i%,b%)
  5357.     IF flag!
  5358.       GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  5359.     ENDIF
  5360.     ADD b%,a%
  5361.   NEXT i%
  5362. RETURN
  5363. PROCEDURE create_space_for_patterns(l%)
  5364.   ' Deplace les chunks des enveloppes et des samples de facon a laisser
  5365.   ' l% octets en plus pour les patterns.
  5366.   LOCAL a%,b%,c%,i%
  5367.   IF l%>0
  5368.     a%=FN env_chunkadr(0,0)
  5369.     b%=ADD(a%,l%)
  5370.     c%=SUB(FN adr_buffer,a%)
  5371.     FOR i%=0 TO 191                               ! Change les adresses des enveloppes
  5372.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),l%))
  5373.     NEXT i%
  5374.     FOR i%=0 TO 255                               ! Change les adresses des samples
  5375.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),l%))
  5376.     NEXT i%
  5377.     ~C:g_bmove%(L:a%,L:b%,L:c%)
  5378.   ENDIF
  5379. RETURN
  5380. PROCEDURE change_pattern_high(p%,l%)
  5381.   LOCAL ol%
  5382.   ol%=FN nbr_lines(p%)
  5383.   GOSUB create_space_patchunk(p%,nbr_track%,l%,TRUE)
  5384.   IF l%>ol%
  5385.     GOSUB clear_mem(FN adr_line(p%,ol%),MUL(MUL(nbr_track%,SUB(l%,ol%)),5))
  5386.   ENDIF
  5387.   IF p%=bl_pat&
  5388.     bl_end&=MIN(bl_end&,PRED(l%))
  5389.     bl_start&=MIN(bl_start&,bl_end&)
  5390.   ENDIF
  5391. RETURN
  5392. PROCEDURE change_format(t%)
  5393.   LOCAL bouton%,a$,a%
  5394.   a$="DO YOU REALLY WANT TO CHANGE THE|PATTERN SIZE TO "+STR$(t%)+" TRACKS ?"
  5395.   IF t%<nbr_track%
  5396.     a$=a$+"|"+STR$(SUB(nbr_track%,t%))+" TRACK(S) WILL BE LOST"
  5397.     a$=a$+"||1. New song|2. Try to keep the song|3. Abort the operation"
  5398.   ENDIF
  5399.   GOSUB dialog("CHANGE NUMBER OF TRACKS",a$,"NEW|KEEP|CANCEL",xm%,ym%)
  5400.   IF bouton%=0
  5401.     GOSUB aff_message("WAITING : CONVERTING...")
  5402.     GOSUB bee(TRUE)
  5403.     GOSUB new_pattern_format(t%)
  5404.   ELSE IF bouton%=1
  5405.     GOSUB aff_message("WAITING : CONVERTING...")
  5406.     GOSUB bee(TRUE)
  5407.     GOSUB chg_pattern_format(t%)
  5408.   ENDIF
  5409.   GOSUB bee(FALSE)
  5410.   GOSUB affiche_panneau_principal
  5411. RETURN
  5412. PROCEDURE new_pattern_format(t%)
  5413.   ' Change le nbr de voies t%, de lignes 1 et efface la chanson
  5414.   LOCAL a%,b%,i%,j%
  5415.   LOCAL a$
  5416.   GOSUB stop_voices
  5417.   GOSUB clear_patterns2
  5418.   sample%=1
  5419.   instr%=1
  5420.   songpos%=0
  5421.   posligne%=0
  5422.   curs_col%=0
  5423.   curs_x%=0
  5424.   a%=nbr_track%
  5425.   nbr_track%=t%
  5426.   module&(100)=t%
  5427.   module&(101)=1        ! Longueur song
  5428.   module&(102)=0        ! Pt de bouclage
  5429.   FOR j%=0 TO 31
  5430.     FOR i%=0 TO 31
  5431.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  5432.     NEXT i%
  5433.   NEXT j%
  5434.   GOSUB create_space_for_patterns(MUL(MUL(MAX(SUB(nbr_track%,a%),0),5),256))
  5435.   GOSUB clear_song(FALSE)
  5436.   ARRAYFILL nbr_colonnes%(),nbr_track%
  5437.   para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  5438.   module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  5439.   module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  5440.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  5441.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  5442.   b%=V:pattern_bidon%(0)
  5443.   FOR i%=256 TO 257
  5444.     CARD{ADD(V:a$,8)}=i%
  5445.     BMOVE V:a$,b%,LEN(a$)
  5446.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  5447.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  5448.     ADD b%,a%
  5449.   NEXT i%
  5450.   DPOKE r_master_vol%,DIV(&H3000,ADD(nbr_track%,3))
  5451.   DPOKE r_mod_songpos%,songpos%
  5452.   DPOKE r_mod_numpat%,song&(songpos%)
  5453.   DPOKE r_mod_speed%,6
  5454.   DPOKE r_mod_linepos%,0
  5455.   DPOKE r_mod_nbrtrack%,nbr_track%
  5456.   bl_start&=0
  5457.   bl_end&=0
  5458.   bl_trk&=0
  5459.   bl_pat&=0
  5460.   GOSUB stop_voices
  5461.   GOSUB all_track_on(FALSE)
  5462.   GOSUB balance_reset
  5463. RETURN
  5464. PROCEDURE chg_pattern_format(t%)
  5465.   ' Change le nbr de voies t% et essaie de garder la chanson
  5466.   ' Attention au format 32 piste/256 lignes, car utilisation d'une chaine de
  5467.   ' 32768 octets. Normalement pas de bug car GfA gere les chaines au mot pres
  5468.   LOCAL a%,b%,c%,d%,i%,j%,otp%
  5469.   LOCAL a$,b$
  5470.   GOSUB stop_voices
  5471.   IF t%>nbr_track%
  5472.     a%=0
  5473.     FOR i%=0 TO 255
  5474.       ADD a%,FN nbr_lines(i%)
  5475.     NEXT i%
  5476.     MUL a%,MUL(SUB(t%,nbr_track%),5)
  5477.     GOSUB create_space_for_patterns(a%)
  5478.     FOR i%=0 TO 255
  5479.       otp%=MUL(nbr_track%,FN nbr_lines(i%))
  5480.       a$=STRING$(MUL(otp%,5),0)
  5481.       BMOVE FN adr_pat(i%),V:a$,MUL(otp%,5)
  5482.       GOSUB create_space_patchunk(i%,t%,FN nbr_lines(i%),FALSE)
  5483.       GOSUB clear_mem(FN adr_pat(i%),MUL(MUL(t%,FN nbr_lines(i%)),5))
  5484.       a%=V:a$
  5485.       b%=FN adr_pat(i%)
  5486.       c%=MUL(nbr_track%,5)
  5487.       d%=MUL(t%,5)
  5488.       FOR j%=0 TO PRED(FN nbr_lines(i%))
  5489.         BMOVE a%,b%,c%
  5490.         ADD a%,c%
  5491.         ADD b%,d%
  5492.       NEXT j%
  5493.     NEXT i%
  5494.   ELSE
  5495.     FOR i%=0 TO 255
  5496.       otp%=MUL(nbr_track%,FN nbr_lines(i%))
  5497.       a$=STRING$(MUL(otp%,5),0)
  5498.       BMOVE FN adr_pat(i%),V:a$,MUL(otp%,5)
  5499.       GOSUB create_space_patchunk(i%,t%,FN nbr_lines(i%),FALSE)
  5500.       a%=V:a$
  5501.       b%=FN adr_pat(i%)
  5502.       c%=MUL(nbr_track%,5)
  5503.       d%=MUL(t%,5)
  5504.       FOR j%=0 TO PRED(FN nbr_lines(i%))
  5505.         BMOVE a%,b%,d%
  5506.         ADD a%,c%
  5507.         ADD b%,d%
  5508.       NEXT j%
  5509.     NEXT i%
  5510.   ENDIF
  5511.   GOSUB garbage_collection
  5512.   nbr_track%=t%
  5513.   module&(100)=t%
  5514.   FOR j%=0 TO 31
  5515.     FOR i%=0 TO 31
  5516.       preset&(i%,j%)=ADD(i%,j%) MOD nbr_track%
  5517.     NEXT i%
  5518.   NEXT j%
  5519.   ARRAYFILL nbr_colonnes%(),nbr_track%
  5520.   para_affiche_pattern$=MKI$(nbr_track%)+MKI$(nbr_lines%)+MKI$(MIN(nbr_col%,nbr_track%))+MKI$(haut_lig%)+STRING$(64,0)+MKI$(type_affpiste%)
  5521.   module_bidon%(50)=ADD(&HFF0000,nbr_lines%)
  5522.   module_bidon%(51)=ADD(SHL(nbr_track%,16),2)
  5523.   a%=ADD(MUL(MUL(nbr_lines%,nbr_track%),5),32)
  5524.   a$="PATD"+MKL$(a%)+MKI$(0)+SPACE$(16)+MKI$(0)+MKI$(nbr_lines%)+MKI$(nbr_track%)
  5525.   b%=V:pattern_bidon%(0)
  5526.   FOR i%=256 TO 257
  5527.     CARD{ADD(V:a$,8)}=i%
  5528.     BMOVE V:a$,b%,LEN(a$)
  5529.     GOSUB clear_mem(ADD(b%,32),SUB(a%,32))
  5530.     LONG{ADD(r_adr_pattern%,SHL(i%,2))}=b%
  5531.     ADD b%,a%
  5532.   NEXT i%
  5533.   curs_col%=0
  5534.   curs_x%=0
  5535.   bl_trk&=0
  5536.   bl_pat&=0
  5537.   DPOKE r_master_vol%,DIV(&H3000,ADD(nbr_track%,3))
  5538.   DPOKE r_mod_linepos%,0
  5539.   DPOKE r_mod_nbrtrack%,nbr_track%
  5540.   GOSUB stop_voices
  5541.   GOSUB all_track_on(FALSE)
  5542. RETURN
  5543. PROCEDURE chg_taille_sample(ns%,ls%)
  5544.   ' Ne teste pas s'il y a assez de place pour agrandir un sample
  5545.   ' N'utilise que les adresses des samples
  5546.   ' Ne change absolument rien aux chunks
  5547.   LOCAL olda%,newa%,lon%,i%,dif%
  5548.   ls%=ls% AND -2
  5549.   IF ns%<255
  5550.     olda%=FN adrsamchk(SUCC(ns%))
  5551.     newa%=ADD(ADD(FN adrsamchk(ns%),64),ls%)
  5552.     lon%=SUB(FN adr_buffer,olda%)
  5553.     ~C:g_bmove%(L:olda%,L:newa%,L:lon%)
  5554.     dif%=SUB(newa%,olda%)
  5555.     FOR i%=SUCC(ns%) TO 255
  5556.       GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),dif%))
  5557.     NEXT i%
  5558.     GOSUB clear_mem(ADD(newa%,lon%),-dif%)    ! Vide la fin du buffer de sample si on agrandit son espace
  5559.   ENDIF
  5560. RETURN
  5561. PROCEDURE chg_type_affpiste(n%)
  5562.   IF n%=0
  5563.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),6),32)    ! Nombre de pistes affichables sans volume ni effet
  5564.   ELSE IF n%=2
  5565.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),12),32)   ! Nombre de pistes affichables avec volume
  5566.   ELSE
  5567.     nbr_col%=MIN(DIV(SUB(scr_ncol%,4),10),32)   ! Nombre de pistes affichables sans volume
  5568.   ENDIF
  5569.   type_affpiste%=n%
  5570. RETURN
  5571. PROCEDURE chg_tempo(tempo%)
  5572.   LOCAL vblpf%,spf%
  5573.   vblpf%=0
  5574.   REPEAT
  5575.     INC vblpf%
  5576.     spf%=ROUND(CARD{r_adr_replay_frequency%}*2.5/MUL(tempo%,vblpf%))    ! replfreq*60/6/4 / tempo
  5577.   UNTIL spf%<1200
  5578.   CARD{r_mod_tempo%}=tempo%
  5579.   CARD{r_vblsize%}=spf%
  5580.   CARD{r_vblnumber%}=vblpf%
  5581. RETURN
  5582. PROCEDURE chg_speed(speed%)
  5583.   CARD{r_mod_speed%}=speed%
  5584. RETURN
  5585. PROCEDURE chg_songpos
  5586.   IF d%=0
  5587.     GOSUB edite_chaine(HEX$(songpos%,2),ADD(divbi&(0,0,16),12),ADD(divbi&(1,0,16),2),2,1)
  5588.     songpos%=VAL("$"+bbbb$)
  5589.   ELSE
  5590.     ADD songpos%,MUL(d%,MAX(PRED(km%),1))
  5591.   ENDIF
  5592.   songpos%=MIN(MAX(songpos%,0),PRED(module&(101)))
  5593.   GOSUB affiche_info_song
  5594.   GOSUB affiche_c_pattern
  5595.   IF ss_menu%=2 AND ss_menut%=3
  5596.     GOSUB affiche_icones_toolsb3
  5597.   ENDIF
  5598.   IF play%>0
  5599.     posligne%=MIN(DPEEK(r_mod_linepos%),PRED(FN nbr_lines2(songpos%)))
  5600.     DPOKE r_mod_linepos%,posligne%
  5601.     DPOKE r_mod_songpos%,songpos%
  5602.     DPOKE r_mod_numpat%,song&(songpos%)
  5603.   ENDIF
  5604.   IF km%>0 AND km%<3 AND d%<>0
  5605.     PAUSE SUB(13,MUL(km%,5))
  5606.   ENDIF
  5607. RETURN
  5608. PROCEDURE chg_pattern
  5609.   LOCAL a%
  5610.   IF d%=0
  5611.     GOSUB edite_chaine(HEX$(song&(songpos%),2),ADD(divbi&(0,3,16),12),ADD(divbi&(1,3,16),2),2,1)
  5612.     a%=VAL("$"+bbbb$)
  5613.   ELSE
  5614.     a%=ADD(song&(songpos%),MUL(d%,MAX(PRED(km%),1)))
  5615.   ENDIF
  5616.   song&(songpos%)=MIN(MAX(a%,0),255)
  5617.   GOSUB affiche_info_song
  5618.   GOSUB affiche_c_pattern
  5619.   IF ss_menu%=2 AND ss_menut%=3
  5620.     GOSUB affiche_icones_toolsb3
  5621.   ENDIF
  5622.   IF play%>0
  5623.     posligne%=MIN(DPEEK(r_mod_linepos%),PRED(FN nbr_lines2(songpos%)))
  5624.     DPOKE r_mod_linepos%,posligne%
  5625.     DPOKE r_mod_numpat%,song&(songpos%)
  5626.   ENDIF
  5627.   IF km%<3 AND d%<>0
  5628.     PAUSE SUB(13,MUL(km%,5))
  5629.   ENDIF
  5630. RETURN
  5631. PROCEDURE chg_songlen
  5632.   LOCAL a%
  5633.   IF d%=0
  5634.     GOSUB edite_chaine(HEX$(module&(101),2),ADD(divbi&(0,6,16),12),ADD(divbi&(1,6,16),2),2,1)
  5635.     a%=VAL("$"+bbbb$)
  5636.   ELSE
  5637.     a%=ADD(module&(101),MUL(d%,MAX(PRED(km%),1)))
  5638.   ENDIF
  5639.   module&(101)=MIN(MAX(a%,SUCC(songpos%)),256)
  5640.   DPOKE r_mod_songlen%,module&(101)
  5641.   module&(102)=MIN(module&(102),PRED(module&(101)))
  5642.   DPOKE r_mod_songrep%,module&(102)
  5643.   GOSUB affiche_info_song
  5644.   IF ss_menu%=2 AND ss_menut%=3
  5645.     GOSUB affiche_icones_toolsb3
  5646.   ENDIF
  5647.   IF km%<3 AND d%<>0
  5648.     PAUSE SUB(13,MUL(km%,5))
  5649.   ENDIF
  5650. RETURN
  5651. PROCEDURE chg_songrep
  5652.   LOCAL a%
  5653.   IF d%=0
  5654.     GOSUB edite_chaine(HEX$(module&(102),2),ADD(divbi&(0,9,16),12),ADD(divbi&(1,9,16),2),2,1)
  5655.     a%=VAL("$"+bbbb$)
  5656.   ELSE
  5657.     a%=ADD(module&(102),MUL(d%,MAX(PRED(km%),1)))
  5658.   ENDIF
  5659.   module&(102)=MIN(MAX(a%,0),PRED(module&(101)))
  5660.   DPOKE r_mod_songrep%,module&(102)
  5661.   GOSUB affiche_info_song
  5662.   IF ss_menu%=2 AND ss_menut%=3
  5663.     GOSUB affiche_icones_toolsb3
  5664.   ENDIF
  5665.   IF km%<3 AND d%<>0
  5666.     PAUSE SUB(13,MUL(km%,5))
  5667.   ENDIF
  5668. RETURN
  5669. PROCEDURE chg_instrument
  5670.   IF d%=0
  5671.     GOSUB edite_chaine(HEX$(instr%,2),ADD(divbi&(0,12,16),12),ADD(divbi&(1,12,16),2),2,1)
  5672.     instr%=VAL("$"+bbbb$)
  5673.   ELSE
  5674.     ADD instr%,MUL(d%,MAX(PRED(km%),1))
  5675.   ENDIF
  5676.   instr%=MAX(MIN(instr%,255),1)
  5677.   GOSUB affiche_info_sample
  5678.   IF km%<3 AND d%<>0
  5679.     PAUSE SUB(13,MUL(km%,5))
  5680.   ENDIF
  5681. RETURN
  5682. PROCEDURE chg_sample
  5683.   IF d%=0
  5684.     GOSUB edite_chaine(HEX$(sample%,2),ADD(divbi&(0,15,16),12),ADD(divbi&(1,15,16),2),2,1)
  5685.     sample%=VAL("$"+bbbb$)
  5686.   ELSE
  5687.     ADD sample%,MUL(d%,MAX(PRED(km%),1))
  5688.   ENDIF
  5689.   sample%=MAX(MIN(sample%,255),1)
  5690.   GOSUB affiche_info_sample
  5691.   IF km%<3 AND d%<>0
  5692.     PAUSE SUB(13,MUL(km%,5))
  5693.   ENDIF
  5694. RETURN
  5695. PROCEDURE chg_linestep
  5696.   LOCAL a$
  5697.   IF d%=0
  5698.     IF line_step%<0
  5699.       a$="-"+HEX$(ABS(line_step%),1)
  5700.     ELSE
  5701.       a$=HEX$(line_step%,2)
  5702.     ENDIF
  5703.     GOSUB edite_chaine(a$,ADD(divbi&(0,18,16),5),ADD(divbi&(1,18,16),2),2,0)
  5704.     IF INSTR(bbbb$,"-")>0
  5705.       line_step%=-VAL("$"+RIGHT$(bbbb$))
  5706.     ELSE
  5707.       line_step%=VAL("$"+bbbb$)
  5708.     ENDIF
  5709.   ELSE
  5710.     ADD line_step%,MUL(d%,MAX(PRED(km%),1))
  5711.   ENDIF
  5712.   line_step%=MAX(MIN(line_step%,PRED(FN nbr_lines3)),-PRED(FN nbr_lines3),-15)
  5713.   GOSUB affiche_info_song
  5714.   IF km%<3 AND d%<>0
  5715.     PAUSE SUB(13,MUL(km%,5))
  5716.   ENDIF
  5717. RETURN
  5718. PROCEDURE chg_t_balance(t%,b%)
  5719.   CARD{ADD(ADD(r_info_track%,r_bal_t%),MUL(r_itl%,t%))}=b%
  5720. RETURN
  5721. PROCEDURE chg_s_sample
  5722.   IF flag_nvl_boucle_sample%<=0
  5723.     IF d%=0
  5724.       GOSUB edite_chaine(HEX$(sample%,2),ADD(divbi&(0,0,14),11),ADD(divbi&(1,0,14),2),2,1)
  5725.       sample%=VAL("$"+bbbb$)
  5726.     ELSE
  5727.       ADD sample%,MUL(d%,MAX(PRED(km%),1))
  5728.     ENDIF
  5729.     sample%=MAX(MIN(sample%,255),1)
  5730.     GOSUB affiche_icones_sampleb
  5731.     GOSUB affiche_info_sample
  5732.     IF km%<3 AND d%<>0
  5733.       PAUSE SUB(13,MUL(km%,5))
  5734.     ENDIF
  5735.   ENDIF
  5736. RETURN
  5737. PROCEDURE chg_s_volume
  5738.   LOCAL a%
  5739.   IF d%=0
  5740.     GOSUB edite_chaine(HEX$(FN volume(sample%),3),ADD(divbi&(0,13,14),8),ADD(divbi&(1,13,14),2),3,1)
  5741.     a%=VAL("$"+bbbb$)
  5742.   ELSE
  5743.     a%=ADD(FN volume(sample%),MUL(d%,MAX(PRED(km%),1)))
  5744.   ENDIF
  5745.   GOSUB chg_sam_volume(sample%,MIN(MAX(a%,0),&HFFF))
  5746.   GOSUB affiche_icones_sampleb
  5747.   IF km%<3 AND d%<>0
  5748.     PAUSE SUB(13,MUL(km%,5))
  5749.   ENDIF
  5750. RETURN
  5751. PROCEDURE chg_s_length                  !!!
  5752. RETURN
  5753. PROCEDURE chg_s_reppos
  5754.   LOCAL a%
  5755.   IF d%=0
  5756.     GOSUB edite_chaine(HEX$(FN repeat(sample%),6),ADD(divbi&(0,7,14),7),ADD(divbi&(1,7,14),2),6,1)
  5757.     a%=VAL("$"+bbbb$)
  5758.   ELSE
  5759.     a%=ADD(FN repeat(sample%),SHL(d%,SUB(MUL(km%,4),3))) AND -2
  5760.   ENDIF
  5761.   GOSUB chg_sam_repeat(sample%,MAX(MIN(a%,SUB(FN length(sample%),FN replen(sample%))),0))
  5762.   GOSUB affiche_icones_sampleb
  5763.   num_nvl_boucle_sample%=sample%
  5764.   flag_nvl_boucle_sample%=4
  5765.   IF km%<3 AND d%<>0
  5766.     PAUSE SUB(13,MUL(km%,5))
  5767.   ENDIF
  5768. RETURN
  5769. PROCEDURE chg_s_replen
  5770.   LOCAL a%
  5771.   IF d%=0
  5772.     GOSUB edite_chaine(HEX$(FN replen(sample%),6),ADD(divbi&(0,10,14),7),ADD(divbi&(1,10,14),2),6,1)
  5773.     a%=VAL("$"+bbbb$)
  5774.   ELSE
  5775.     a%=ADD(FN replen(sample%),SHL(d%,SUB(MUL(km%,4),3))) AND -2
  5776.   ENDIF
  5777.   GOSUB chg_sam_replen(sample%,MAX(MIN(a%,SUB(FN length(sample%),FN repeat(sample%))),2))
  5778.   GOSUB affiche_icones_sampleb
  5779.   flag_nvl_boucle_sample%=4
  5780.   num_nvl_boucle_sample%=sample%
  5781.   IF km%<3 AND d%<>0
  5782.     PAUSE SUB(13,MUL(km%,5))
  5783.   ENDIF
  5784. RETURN
  5785. PROCEDURE chg_s_finetune
  5786.   LOCAL a%,b%
  5787.   IF d%=0
  5788.   ELSE
  5789.     a%=ADD(FN finetune(sample%),d%)
  5790.   ENDIF
  5791.   GOSUB chg_sam_finetune(sample%,MIN(MAX(a%,-8),7))
  5792.   GOSUB affiche_icones_sampleb
  5793.   IF km%<3 AND d%<>0
  5794.     PAUSE SUB(13,MUL(km%,5))
  5795.   ENDIF
  5796. RETURN
  5797. PROCEDURE chg_s_balance
  5798.   LOCAL a%,a$
  5799.   a%=FN autobal(sample%)
  5800.   IF d%=0
  5801.     IF a%<=&HFFF
  5802.       a$=HEX$(FN autobal(sample%),3)
  5803.     ELSE
  5804.       a$="???"
  5805.     ENDIF
  5806.     GOSUB edite_chaine(a$,ADD(divbi&(0,19,14),8),ADD(divbi&(1,19,14),2),3,0)
  5807.     IF INSTR(bbbb$,"?")>0
  5808.       a%=-1
  5809.     ELSE
  5810.       a%=VAL("$"+bbbb$)
  5811.     ENDIF
  5812.   ELSE
  5813.     IF a%>&HFFF
  5814.       a%=-1
  5815.     ENDIF
  5816.     a%=ADD(a%,SHL(d%,SUB(MUL(km%,4),3))) AND -2
  5817.   ENDIF
  5818.   GOSUB chg_sam_balance(sample%,MAX(MIN(a%,&HFFF),-1) AND &HFFFF)
  5819.   GOSUB affiche_icones_sampleb
  5820.   IF km%<3 AND d%<>0
  5821.     PAUSE SUB(13,MUL(km%,5))
  5822.   ENDIF
  5823. RETURN
  5824. PROCEDURE chg_s_freqech
  5825.   LOCAL a%
  5826.   IF d%=0
  5827.     GOSUB edite_chaine(STR$(FN freqech(sample%),5),ADD(divbi&(0,22,14),10),ADD(divbi&(1,22,14),2),5,2)
  5828.     a%=VAL(bbbb$)
  5829.   ELSE
  5830.     a%=ADD(FN freqech(sample%),MUL(d%,20^PRED(km%)))
  5831.   ENDIF
  5832.   GOSUB chg_sam_freq(sample%,MAX(MIN(a%,65000),2000))
  5833.   GOSUB affiche_icones_sampleb
  5834.   IF km%<3 AND d%<>0
  5835.     PAUSE 3
  5836.   ENDIF
  5837. RETURN
  5838. PROCEDURE chg_songname(nnnn$)
  5839.   LOCAL iiii%
  5840.   FOR iiii%=2 TO 17
  5841.     module&(iiii%)=&H2020
  5842.   NEXT iiii%
  5843.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),32))
  5844.     BYTE{ADD(V:module&(2),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  5845.   NEXT iiii%
  5846. RETURN
  5847. PROCEDURE chg_songname2(aaaa%,llll%)
  5848.   LOCAL iiii%
  5849.   FOR iiii%=0 TO 31
  5850.     IF iiii%<llll%
  5851.       BYTE{ADD(V:module&(2),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  5852.     ELSE
  5853.       BYTE{ADD(V:module&(2),iiii%)}=32
  5854.     ENDIF
  5855.   NEXT iiii%
  5856. RETURN
  5857. PROCEDURE chg_songcomment(nnnn$)
  5858.   LOCAL iiii%
  5859.   FOR iiii%=18 TO 97
  5860.     module&(iiii%)=&H2020
  5861.   NEXT iiii%
  5862.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),160))
  5863.     BYTE{ADD(V:module&(18),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  5864.   NEXT iiii%
  5865. RETURN
  5866. PROCEDURE chg_songcomment2(aaaa%,llll%)
  5867.   LOCAL iiii%
  5868.   FOR iiii%=0 TO 159
  5869.     IF iiii%<llll%
  5870.       BYTE{ADD(V:module&(18),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  5871.     ELSE
  5872.       BYTE{ADD(V:module&(18),iiii%)}=32
  5873.     ENDIF
  5874.   NEXT iiii%
  5875. RETURN
  5876. PROCEDURE chg_patternname(nnnn$,pppp%)
  5877.   IF LEN(nnnn$)<16
  5878.     nnnn$=nnnn$+SPACE$(SUB(16,LEN(nnnn$)))
  5879.   ENDIF
  5880.   nnnn$=LEFT$(nnnn$,16)
  5881.   BMOVE V:nnnn$,ADD(FN adr_patchunk(pppp%),10),16
  5882. RETURN
  5883. PROCEDURE chg_patternname2(aaaa%,llll%,pppp%)
  5884.   LOCAL iiii%
  5885.   FOR iiii%=0 TO 15
  5886.     IF iiii%<llll%
  5887.       BYTE{ADD(ADD(FN adr_patchunk(pppp%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  5888.     ELSE
  5889.       BYTE{ADD(ADD(FN adr_patchunk(pppp%),10),iiii%)}=32
  5890.     ENDIF
  5891.   NEXT iiii%
  5892. RETURN
  5893. PROCEDURE chg_samplename(nnnn$,ssss%)
  5894.   LOCAL iiii%
  5895.   FOR iiii%=10 TO 34 STEP 4
  5896.     LONG{ADD(FN adrsamchk(ssss%),iiii%)}=&H20202020
  5897.   NEXT iiii%
  5898.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),28))
  5899.     BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  5900.   NEXT iiii%
  5901. RETURN
  5902. PROCEDURE chg_samplename2(aaaa%,llll%,ssss%)
  5903.   LOCAL iiii%
  5904.   FOR iiii%=0 TO 27
  5905.     IF iiii%<llll%
  5906.       BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  5907.     ELSE
  5908.       BYTE{ADD(ADD(FN adrsamchk(ssss%),10),iiii%)}=32
  5909.     ENDIF
  5910.   NEXT iiii%
  5911. RETURN
  5912. PROCEDURE chg_instrname(nnnn$,ssss%)
  5913.   LOCAL iiii%
  5914.   FOR iiii%=10 TO 34 STEP 4
  5915.     LONG{ADD(V:instrset%(0,ssss%),iiii%)}=&H20202020
  5916.   NEXT iiii%
  5917.   FOR iiii%=0 TO PRED(MIN(LEN(nnnn$),28))
  5918.     BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=MAX(BYTE{ADD(V:nnnn$,iiii%)},32)
  5919.   NEXT iiii%
  5920. RETURN
  5921. PROCEDURE chg_instrname2(aaaa%,llll%,ssss%)
  5922.   LOCAL iiii%
  5923.   FOR iiii%=0 TO 27
  5924.     IF iiii%<llll%
  5925.       BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=MAX(BYTE{ADD(aaaa%,iiii%)},32)
  5926.     ELSE
  5927.       BYTE{ADD(ADD(V:instrset%(0,ssss%),10),iiii%)}=32
  5928.     ENDIF
  5929.   NEXT iiii%
  5930. RETURN
  5931. PROCEDURE chg_envelopename(nnnn$,eeee%,tttt%)
  5932.   LOCAL a%,b%,i%
  5933.   a%=FN env_chunkadr(eeee%,tttt%)
  5934.   FOR i%=ADD(a%,10) TO ADD(a%,26) STEP 4
  5935.     LONG{i%}=&H20202020
  5936.   NEXT i%
  5937.   IF nnnn$<>""
  5938.     b%=V:nnnn$
  5939.     FOR i%=ADD(a%,10) TO ADD(a%,ADD(MIN(LEN(nnnn$),20),9))
  5940.       BYTE{i%}=MAX(BYTE{b%},32)
  5941.       INC b%
  5942.     NEXT i%
  5943.   ENDIF
  5944. RETURN
  5945. PROCEDURE chg_envelopename2(aaaa%,llll%,eeee%,tttt%)
  5946.   LOCAL a%,b%,i%
  5947.   a%=FN env_chunkadr(eeee%,tttt%)
  5948.   FOR i%=ADD(a%,10) TO ADD(a%,26) STEP 4
  5949.     LONG{i%}=&H20202020
  5950.   NEXT i%
  5951.   IF llll%>0
  5952.     FOR i%=ADD(a%,10) TO ADD(a%,ADD(MIN(LEN(nnnn$),20),9))
  5953.       BYTE{i%}=MAX(BYTE{aaaa%},32)
  5954.       INC aaaa%
  5955.     NEXT i%
  5956.   ENDIF
  5957. RETURN
  5958. PROCEDURE chg_pat_chunkadr(pppp%,aaaa%)
  5959.   LONG{ADD(r_adr_pattern%,SHL(pppp%,2))}=aaaa%
  5960. RETURN
  5961. PROCEDURE chg_pat_chunklen(pppp%,aaaa%)
  5962.   LONG{ADD(FN adr_patchunk(pppp%),4)}=aaaa%
  5963. RETURN
  5964. PROCEDURE chg_pat_nbr_track(pppp%,aaaa%)
  5965.   CARD{ADD(FN adr_patchunk(pppp%),30)}=aaaa%
  5966. RETURN
  5967. PROCEDURE chg_pat_nbr_lines(pppp%,aaaa%)
  5968.   CARD{ADD(FN adr_patchunk(pppp%),28)}=aaaa%
  5969. RETURN
  5970. PROCEDURE chg_sam_chunkadr(ssss%,ffff%)
  5971.   LONG{ADD(r_adr_sample%,SHL(ssss%,2))}=ffff%
  5972. RETURN
  5973. PROCEDURE chg_sam_freq(ssss%,ffff%)
  5974.   CARD{ADD(FN adrsamchk(ssss%),44)}=ffff%
  5975. RETURN
  5976. PROCEDURE chg_sam_balance(ssss%,ffff%)
  5977.   CARD{ADD(FN adrsamchk(ssss%),40)}=ffff%
  5978. RETURN
  5979. PROCEDURE chg_sam_volume(ssss%,ffff%)
  5980.   CARD{ADD(FN adrsamchk(ssss%),58)}=ffff%
  5981. RETURN
  5982. PROCEDURE chg_sam_nbits(ssss%,ffff%)
  5983.   CARD{ADD(FN adrsamchk(ssss%),42)}=SHL(ffff%,3)
  5984. RETURN
  5985. PROCEDURE chg_sam_length(ssss%,ffff%)
  5986.   LONG{ADD(FN adrsamchk(ssss%),46)}=ffff%
  5987.   LONG{ADD(FN adrsamchk(ssss%),4)}=ADD(ffff%,64)
  5988. RETURN
  5989. PROCEDURE chg_sam_repeat(ssss%,ffff%)
  5990.   LONG{ADD(FN adrsamchk(ssss%),50)}=ffff%
  5991. RETURN
  5992. PROCEDURE chg_sam_replen(ssss%,ffff%)
  5993.   LONG{ADD(FN adrsamchk(ssss%),54)}=MAX(ffff%,2)
  5994. RETURN
  5995. PROCEDURE chg_sam_finetune(ssss%,ffff%)
  5996.   INT{ADD(FN adrsamchk(ssss%),60)}=ffff%
  5997. RETURN
  5998. PROCEDURE chg_ins_balance(ssss%,ffff%)
  5999.   CARD{ADD(V:instrset%(0,ssss%),42)}=ffff%
  6000. RETURN
  6001. PROCEDURE chg_ins_volume(ssss%,ffff%)
  6002.   CARD{ADD(V:instrset%(0,ssss%),40)}=ffff%
  6003. RETURN
  6004. PROCEDURE chg_ins_evol(ssss%,ffff%)
  6005.   CARD{ADD(V:instrset%(0,ssss%),44)}=ffff%
  6006. RETURN
  6007. PROCEDURE chg_ins_eton(ssss%,ffff%)
  6008.   CARD{ADD(V:instrset%(0,ssss%),46)}=ffff%
  6009. RETURN
  6010. PROCEDURE chg_ins_epan(ssss%,ffff%)
  6011.   CARD{ADD(V:instrset%(0,ssss%),48)}=ffff%
  6012. RETURN
  6013. PROCEDURE chg_ins_transp(ssss%,ffff%,gggg%)
  6014.   BYTE{ADD(V:instrset%(15,ssss%),SUCC(SHL(ffff%,1)))}=gggg%
  6015. RETURN
  6016. PROCEDURE chg_ins_sample(ssss%,ffff%,gggg%)
  6017.   BYTE{ADD(V:instrset%(15,ssss%),SHL(ffff%,1))}=gggg%
  6018. RETURN
  6019. PROCEDURE chg_env_chunkadr(num%,type%,adr%)
  6020.   SELECT type%
  6021.   CASE 0
  6022.     LONG{ADD(r_adr_evol%,SHL(num%,2))}=adr%
  6023.   CASE 1
  6024.     LONG{ADD(r_adr_eton%,SHL(num%,2))}=adr%
  6025.   CASE 2
  6026.     LONG{ADD(r_adr_epan%,SHL(num%,2))}=adr%
  6027.   ENDSELECT
  6028. RETURN
  6029. PROCEDURE chg_env_length(num%,type%,sect%,lon%)
  6030.   ' Change la longueur d'une section d'enveloppe
  6031.   ' Les commandes sont effacees
  6032.   LOCAL a%
  6033.   a%=SUB(lon%,FN env_sectlen(num%,type%,sect%))
  6034.   GOSUB chg_env_rellength(num%,type%,sect%,0,a%)
  6035.   a%=FN env_sectadr(num%,type%,sect%)
  6036.   FOR a%=a% TO PRED(ADD(a%,FN env_sectlen(num%,type%,sect%)))
  6037.     BYTE{a%}=0
  6038.   NEXT a%
  6039. RETURN
  6040. PROCEDURE chg_env_rellength(num%,type%,sect%,pos%,rlon%)
  6041.   ' Insere un certain nombre d'octets dans une enveloppe
  6042.   ' Marche aussi pour la reduction de la taille de l'enveloppe (lon% negatif)
  6043.   ' Pos% est en numero de commande et non en octets
  6044.   ' Le chunk est mis a jour
  6045.   LOCAL d%,i%,j%,l%,s%
  6046.   s%=ADD(FN env_sectadr(num%,type%,sect%),FN pos_enveloppe(num%,type%,sect%,pos%))
  6047.   d%=ADD(s%,rlon%)
  6048.   l%=SUB(FN adr_buffer,s%)
  6049.   IF num%<63 OR type%<2
  6050.     FOR i%=SUCC(ADD(MUL(num%,3),type%)) TO 191
  6051.       GOSUB chg_env_chunkadr(DIV(i%,3),i% MOD 3,ADD(FN env_chunkadr(DIV(i%,3),i% MOD 3),rlon%))
  6052.     NEXT i%
  6053.   ENDIF
  6054.   FOR i%=0 TO 255
  6055.     GOSUB chg_sam_chunkadr(i%,ADD(FN adrsamchk(i%),rlon%))
  6056.   NEXT i%
  6057.   ~C:g_bmove%(L:s%,L:d%,L:l%)
  6058.   LONG{ADD(FN env_chunkadr(num%,type%),4)}=ADD(FN env_chunklen(num%,type%),rlon%)
  6059.   IF sect%=0
  6060.     CARD{ADD(FN env_chunkadr(num%,type%),30)}=ADD(CARD{ADD(FN env_chunkadr(num%,type%),30)},rlon%)
  6061.   ENDIF
  6062. RETURN
  6063. PROCEDURE chg_env_adrjump(num%,type%,sect%,pos%,lon%)
  6064.   ' Change les adresses de saut apres une insertion ou destruction de commande
  6065.   ' Pos% en octets
  6066.   LOCAL a%,b%,i%,l%
  6067.   a%=FN env_sectadr(num%,type%,sect%)
  6068.   l%=FN env_sectlen(num%,type%,sect%)
  6069.   WHILE i%<l%
  6070.     SELECT BYTE{ADD(a%,i%)}
  6071.     CASE &H1,&H4
  6072.       b%=CARD{SUCC(ADD(a%,i%))}
  6073.       IF b%>pos%
  6074.         CARD{SUCC(ADD(a%,i%))}=ADD(b%,lon%)
  6075.       ENDIF
  6076.       ADD i%,3
  6077.     CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  6078.       ADD i%,2
  6079.     CASE &H2,&H80,&H81,&HA0,&HA1,&HC0,&HC1
  6080.       ADD i%,3
  6081.     DEFAULT
  6082.       ADD i%,1
  6083.     ENDSELECT
  6084.   WEND
  6085. RETURN
  6086. '
  6087. '
  6088. '
  6089. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  6090. ' *                                                                          *
  6091. ' *                                Fonctions                                 *
  6092. ' *                                                                          *
  6093. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  6094. '
  6095. FUNCTION vire_xbra(adr%,id%,mask%,vire!)
  6096. LOCAL a%,c%
  6097. LOCAL flag!,found!
  6098. found!=FALSE
  6099. a%=LPEEK(adr%)
  6100. flag!=FALSE
  6101. WHILE LPEEK(MAX(SUB(a%,12),0))=CVL("XBRA")
  6102.   IF (LPEEK(SUB(a%,8)) AND mask%)=(id% AND mask%)
  6103.     found!=TRUE
  6104.     IF vire!
  6105.       c%=adr%
  6106.       IF flag!
  6107.         SUB c%,4
  6108.       ENDIF
  6109.       xbra_remove$=xbra_remove$+MKL$(c%)+MKL$(a%)
  6110.       SLPOKE c%,LPEEK(SUB(a%,4))
  6111.     ENDIF
  6112.   ENDIF
  6113.   adr%=a%
  6114.   a%=LPEEK(SUB(a%,4))
  6115.   flag!=TRUE
  6116. WEND
  6117. RETURN found!
  6118. ENDFUNC
  6119. FUNCTION exist(a$)
  6120. ' Cherche si le fichier a$ existe (jockers autorises)
  6121. LOCAL dta$,masque_fichier$
  6122. dta$=STRING$(44,0)
  6123. masque_fichier$=a$+CHR$(0)
  6124. ~FRE(0)
  6125. ~GEMDOS(&H1A,L:V:dta$)
  6126. IF GEMDOS(&H4E,L:V:masque_fichier$,1)=>0
  6127. RETURN TRUE
  6128. ELSE
  6129. RETURN FALSE
  6130. ENDIF
  6131. ENDFUNC
  6132. FUNCTION backup_file(a$)
  6133. LOCAL e%,a%
  6134. LOCAL b$,c$
  6135. IF FN exist(a$)
  6136. b$=RIGHT$(a$,4)
  6137. a%=ADD(INSTR(b$,"."),SUB(LEN(a$),4))
  6138. b$=LEFT$(a$,a%)                             ! On a le fichier sans l'extention (mais avec le .)
  6139. c$=b$+"BAK"+CHR$(0)
  6140. IF FN exist(c$)
  6141. e%=SHL(GEMDOS(65,L:V:c$),16)              ! Detruit l'ancien .BAK
  6142. ELSE
  6143. e%=0
  6144. ENDIF
  6145. a$=a$+CHR$(0)
  6146. ADD e%,GEMDOS(86,0,L:V:a$,L:V:c$) AND 65535 ! Renome
  6147. ENDIF
  6148. RETURN e%
  6149. ~FRE(0)
  6150. ENDFUNC
  6151. FUNCTION last_pat_util
  6152. ' Indique le dernier pattern utilise
  6153. LOCAL aaaaa%,iiiii%
  6154. aaaaa%=0
  6155. FOR iiiii%=0 TO PRED(module&(101))
  6156. aaaaa%=MAX(aaaaa%,song&(iiiii%))
  6157. NEXT iiiii%
  6158. RETURN aaaaa%
  6159. ENDFUNC
  6160. FUNCTION last_spl_util
  6161. ' Indique le dernier sample utilise (min 1)
  6162. LOCAL iiii%,aaaa%
  6163. aaaa%=1
  6164. FOR iiii%=1 TO 255
  6165. IF FN length(iiii%)>0
  6166. aaaa%=iiii%
  6167. ENDIF
  6168. NEXT iiii%
  6169. RETURN aaaa%
  6170. ENDFUNC
  6171. FUNCTION last_spl_util2
  6172. ' Indique le dernier instrument utilisant un sample non-vide en C-2 (min 1)
  6173. LOCAL iiii%,aaaa%
  6174. aaaa%=1
  6175. FOR iiii%=1 TO 255
  6176. IF FN length(FN isample(iiii%,48))>0
  6177. aaaa%=iiii%
  6178. ENDIF
  6179. NEXT iiii%
  6180. RETURN aaaa%
  6181. ENDFUNC
  6182. FUNCTION nbr_lines_maxi
  6183. LOCAL iiii%
  6184. aaaa%=1
  6185. FOR iiii%=0 TO FN last_pat_util
  6186. aaaa%=MAX(aaaa%,FN nbr_lines(iiii%))
  6187. NEXT iiii%
  6188. RETURN aaaa%
  6189. ENDFUNC
  6190. FUNCTION songcomment$
  6191. LOCAL aaaa$
  6192. aaaa$=SPACE$(160)
  6193. BMOVE V:module&(18),V:aaaa$,160
  6194. RETURN aaaa$
  6195. ENDFUNC
  6196. FUNCTION songname$
  6197. LOCAL aaaa$
  6198. aaaa$=SPACE$(32)
  6199. BMOVE V:module&(2),V:aaaa$,32
  6200. RETURN aaaa$
  6201. ENDFUNC
  6202. FUNCTION patternname$(pppp%)
  6203. LOCAL aaaa$
  6204. aaaa$=SPACE$(16)
  6205. BMOVE ADD(FN adr_patchunk(pppp%),10),V:aaaa$,16
  6206. RETURN aaaa$
  6207. ENDFUNC
  6208. FUNCTION samplename$(ssss%)
  6209. LOCAL iiii%,aaaa$
  6210. aaaa$=""
  6211. FOR iiii%=10 TO 34 STEP 4
  6212. aaaa$=aaaa$+MKL$(LONG{ADD(FN adrsamchk(ssss%),iiii%)})
  6213. NEXT iiii%
  6214. RETURN aaaa$
  6215. ENDFUNC
  6216. FUNCTION pourcent$(aaaa%,bbbb%)
  6217. ' Transforme aaaa%/bbbb% en "xxx.x" %
  6218. ' Arrondissement par exces
  6219. RETURN RIGHT$("  "+STR$(INT(aaaa%*100/bbbb%+0.0999)),3)+"."+RIGHT$(STR$(INT(aaaa%*1000/bbbb%+0.999)),1)
  6220. ENDFUNC
  6221. FUNCTION fft(aaaa%,tttt%,llll%,ffffe%,ffff0%,bbbb%)
  6222. ' aaaa% = adresse du sample, tttt %= adresse d'une table de 1.25*4096 sinus 16 bits
  6223. ' llll% = longueur en octets, ffffe% = freq d'ech, ffff0% = freq recherchee
  6224. ' bbbb% = nombre d'octets par sample
  6225. LOCAL cccc%,dddd,eeee,ffff
  6226. cccc%=C:g_trans_fourier%(L:aaaa%,L:llll%,L:ffffe%,L:ffff0%,W:bbbb%,L:tttt%)
  6227. eeee=LONG{cccc%}
  6228. ffff=LONG{ADD(cccc%,4)}
  6229. dddd=SQR((eeee*eeee+ffff*ffff))/1073741824            ! Module (variant de 0 a 1)
  6230. RETURN dddd
  6231. ENDFUNC
  6232. FUNCTION spl_cherche_volume(dddd%,llll%,bbbb%)
  6233. ' Cherche le volume du sample position dddd%, longueur llll%, resol bbbb%
  6234. LOCAL aaaa%,cccc%
  6235. cccc%=ADD(FN adr_buffer,dddd%)
  6236. aaaa%=C:g_cherche_volume_sample%(L:cccc%,L:llll%,W:bbbb%)
  6237. aaaa%=SHL(aaaa%,SHL(SUB(2,bbbb%),3))              ! Recalibre /32768
  6238. RETURN aaaa%
  6239. ENDFUNC
  6240. FUNCTION se.sm_fft_tot(fmin%,fmax%,fech%,nfreq%,adr%,lon%,bits%,flagc!,flagd!)
  6241. ' Renvoie dans fft&() les puissances (15 bits) de nfreq%
  6242. ' frequences de fmin%...fmax% puis la frequence.w du sample
  6243. LOCAL a%,i%,pc%,pctot%,pcnxt%,a,b,coef,p,pm,f1,f2,tabl$
  6244. ~FRE(0)
  6245. ARRAYFILL fft&(),0
  6246. IF flagd!
  6247. GOSUB cadre_o_int(SUB(SHR(scr_ncol%,1),11),SUB(SHR(scr_haut%,1),24),21,47,9,9,10,8)
  6248. GOSUB cadre_ext(SUB(SHR(scr_ncol%,1),10),ADD(SHR(scr_haut%,1),8),19,5,9,9,8,10)
  6249. GOSUB affchaine_trans("WAITING : FFT",SUB(scr_ncol%,13),SUB(SHR(scr_haut%,1),8),10)
  6250. GOSUB bee(TRUE)
  6251. ENDIF
  6252. tabl$=STRING$(8192,0)
  6253. a%=V:tabl$
  6254. a=PI/2048
  6255. FOR i%=0 TO 1024                      ! Calcul de la table
  6256. INT{a%}=ROUND(SIN(i%*a)*32767)
  6257. ADD a%,2
  6258. NEXT i%
  6259. FOR i%=4 TO 4092 STEP 4
  6260. INT{a%}=INT{SUB(a%,i%)}
  6261. ADD a%,2
  6262. NEXT i%
  6263. FOR i%=0 TO 2048
  6264. INT{a%}=-INT{SUB(a%,4096)}
  6265. ADD a%,2
  6266. NEXT i%
  6267. se.freq_fftmin%=fmin%
  6268. se.freq_fftmax%=fmax%
  6269. se.freq_fftech%=fech%
  6270. se.freq_fftlon%=nfreq%
  6271. ' FFT de chaque frequence
  6272. pm=0
  6273. f1=-1
  6274. f2=0
  6275. b=(fmax%-fmin%)/nfreq%
  6276. IF b>1 AND b<100 AND flagc!
  6277. pctot%=nfreq%+2*b
  6278. ELSE
  6279. pctot%=nfreq%
  6280. ENDIF
  6281. pc%=0
  6282. pcnxt%=0
  6283. FOR i%=0 TO PRED(nfreq%)
  6284. a=f1
  6285. f1=fmin%+i%*b                       ! Frequence a tester
  6286. p=FN fft(adr%,V:tabl$,lon%,SHL(fech%,4),MAX(ROUND(f1*16),0),bits%)
  6287. fft&(i%)=MAX(MIN(p*&H7FFF,&H7FFF),0)
  6288. IF f1>=30
  6289. coef=1/f1
  6290. ELSE
  6291. coef=0
  6292. ENDIF
  6293. IF p*coef>pm
  6294. pm=p*coef
  6295. f2=f1
  6296. ENDIF
  6297. IF GEMDOS(11)<>0
  6298. IF SHR(GEMDOS(7),16)=1            ! ESC = arret
  6299. i%=nfreq%
  6300. ENDIF
  6301. ENDIF
  6302. IF flagd!                           ! Affichage du pourcentage de calcul
  6303. IF DIV(MUL(100,pc%),pctot%)>=pcnxt%
  6304. GOSUB affchaine_trans(STRING$(SUCC(DIV(pcnxt%,5)),7),SUB(scr_ncol%,20),ADD(SHR(scr_haut%,1),8),8)
  6305. GOSUB bee(TRUE)
  6306. WHILE DIV(MUL(100,pc%),pctot%)>=pcnxt%
  6307. ADD pcnxt%,5
  6308. WEND
  6309. ENDIF
  6310. INC pc%
  6311. ENDIF
  6312. NEXT i%
  6313. ' 2eme recherche pour la frequence du sample, precise
  6314. IF flagc! AND b>1 AND b<=100          ! Scanning Hz par Hz
  6315. FOR i%=f2-b TO f2+b
  6316. p=FN fft(adr%,V:tabl$,lon%,fech%,MAX(i%,0),bits%)
  6317. IF i%>=30
  6318. coef=1/i%
  6319. ELSE
  6320. coef=0
  6321. ENDIF
  6322. IF p*coef>pm
  6323. pm=p*coef
  6324. f2=i%
  6325. ENDIF
  6326. IF GEMDOS(11)<>0
  6327. IF SHR(GEMDOS(7),16)=1          ! ESC = arret
  6328. i%=f2+b
  6329. ENDIF
  6330. ENDIF
  6331. IF flagd!                         ! Affichage du pourcentage de calcul
  6332. IF DIV(MUL(100,pc%),pctot%)>=pcnxt%
  6333. GOSUB affchaine_trans(STRING$(SUCC(DIV(pcnxt%,5)),7),SUB(scr_ncol%,20),ADD(SHR(scr_haut%,1),8),8)
  6334. GOSUB bee(TRUE)
  6335. WHILE DIV(MUL(100,pc%),pctot%)>=pcnxt%
  6336. ADD pcnxt%,5
  6337. WEND
  6338. ENDIF
  6339. INC pc%
  6340. ENDIF
  6341. NEXT i%
  6342. ENDIF
  6343. IF b>100 OR NOT flagc!        ! Si l'ecart est trop grand, pas de frequence pour le sample
  6344. f2=0
  6345. ENDIF
  6346. RETURN ROUND(f2)
  6347. ENDFUNC
  6348. FUNCTION se.sm_adresse_sample(i%)
  6349. IF i%=0
  6350. RETURN ADD(FN adr_buffer,mark_1%)
  6351. ELSE
  6352. RETURN FN adresse(i%)
  6353. ENDIF
  6354. ENDFUNC
  6355. FUNCTION se.sm_longueur_sample(i%)
  6356. IF i%=0
  6357. RETURN mark_len%
  6358. ELSE
  6359. RETURN FN length(i%)
  6360. ENDIF
  6361. ENDFUNC
  6362. FUNCTION se.sm_resol_sample(i%)
  6363. IF i%=0
  6364. RETURN win_bits%
  6365. ELSE
  6366. RETURN FN resol(i%)
  6367. ENDIF
  6368. ENDFUNC
  6369. FUNCTION hexasigne$(vvvv%,llll%)
  6370. ' Renvoie une chaine en hexa signe, avec llll% chiffre (+ le signe)
  6371. IF vvvv%>=0
  6372. RETURN "+"+HEX$(vvvv%,llll%)
  6373. ELSE
  6374. RETURN "-"+HEX$(ABS(vvvv%),llll%)
  6375. ENDIF
  6376. ENDFUNC
  6377. FUNCTION valhexasigne(aaaa$)
  6378. ' Renvoie la valeur d'une chaine hexa signee, avec ou sans '$'
  6379. LOCAL a%
  6380. a%=INSTR(aaaa$,"$")
  6381. IF a%>0
  6382. aaaa$=LEFT$(aaaa$,PRED(a%))+RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))
  6383. ENDIF
  6384. a%=INSTR(aaaa$,"+")
  6385. IF a%>0
  6386. RETURN VAL("$"+TRIM$(RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))))
  6387. ELSE
  6388. a%=INSTR(aaaa$,"-")
  6389. IF a%>0
  6390. RETURN -VAL("$"+TRIM$(RIGHT$(aaaa$,SUB(LEN(aaaa$),a%))))
  6391. ELSE
  6392. RETURN VAL("$"+TRIM$(aaaa$))
  6393. ENDIF
  6394. ENDIF
  6395. ENDFUNC
  6396. FUNCTION sbyte(a%)
  6397. ' Retablit la signature d'un octet et enleve les bits inutiles
  6398. a%=a% AND 255
  6399. IF a%>127
  6400. RETURN SUB(a%,256)
  6401. ELSE
  6402. RETURN a%
  6403. ENDIF
  6404. ENDFUNC
  6405. FUNCTION squartet(a%)
  6406. ' Retablit la signature d'un quartet et enleve les bits inutiles
  6407. a%=a% AND 15
  6408. IF a%>7
  6409. RETURN SUB(a%,16)
  6410. ELSE
  6411. RETURN a%
  6412. ENDIF
  6413. ENDFUNC
  6414. FUNCTION get_elt_in_list$(l$,a%)
  6415. ' Renvoie le a%ieme element (de 0 a ...) de la liste l$
  6416. ' Les elements sont separes par des virgules
  6417. LOCAL b%
  6418. LOCAL b$
  6419. IF a%<0
  6420. b$=""
  6421. ELSE
  6422. REPEAT
  6423. b%=INSTR(l$,",")
  6424. IF b%>0
  6425. b$=LEFT$(l$,PRED(b%))
  6426. l$=RIGHT$(l$,SUB(LEN(l$),b%))
  6427. ELSE
  6428. b$=l$
  6429. l$=""
  6430. ENDIF
  6431. DEC a%
  6432. UNTIL a%<0
  6433. ENDIF
  6434. RETURN b$
  6435. ENDFUNC
  6436. FUNCTION falsetrue$(a%)
  6437. IF a%<>0
  6438. RETURN "true"
  6439. ELSE
  6440. RETURN "false"
  6441. ENDIF
  6442. ENDFUNC
  6443. ' Fonctions concernant les instruments
  6444. FUNCTION instrname$(ssss%)
  6445. LOCAL iiii%,aaaa$
  6446. aaaa$=""
  6447. FOR iiii%=10 TO 34 STEP 4
  6448. aaaa$=aaaa$+MKL$(LONG{ADD(V:instrset%(0,ssss%),iiii%)})
  6449. NEXT iiii%
  6450. RETURN aaaa$
  6451. ENDFUNC
  6452. FUNCTION ins_deb_zone(nnnn%,pppp%)
  6453. ' Cherche le debut d'une zone isosample dans la table des samples d'un instrument
  6454. LOCAL aaaa%
  6455. aaaa%=FN isample(nnnn%,pppp%)
  6456. WHILE pppp%>1
  6457. EXIT IF FN isample(nnnn%,PRED(pppp%))<>aaaa%
  6458. DEC pppp%
  6459. WEND
  6460. RETURN pppp%
  6461. ENDFUNC
  6462. FUNCTION ins_fin_zone(nnnn%,pppp%)
  6463. ' Cherche la fin d'une zone isosample dans la table des samples d'un instrument
  6464. LOCAL aaaa%
  6465. aaaa%=FN isample(nnnn%,pppp%)
  6466. WHILE pppp%<127
  6467. EXIT IF FN isample(nnnn%,SUCC(pppp%))<>aaaa%
  6468. INC pppp%
  6469. WEND
  6470. RETURN pppp%
  6471. ENDFUNC
  6472. FUNCTION ins_used_samples$(nnnn%)
  6473. ' Renvoie une chaine de MOTS contenant les numeros des samples utilises dans
  6474. ' l'instrument specifie (sauf 0)
  6475. LOCAL aaaa%,iiii%,jjjj%,pppp%
  6476. LOCAL ffff!
  6477. LOCAL aaaa$
  6478. aaaa$=""
  6479. FOR iiii%=0 TO 127
  6480. aaaa%=FN isample(nnnn%,iiii%)
  6481. IF aaaa%>0
  6482. ffff!=TRUE
  6483. IF LEN(aaaa$)>0
  6484. FOR jjjj%=0 TO SUB(LEN(aaaa$),2) STEP 2
  6485. IF CARD{ADD(V:aaaa$,jjjj%)}=aaaa%
  6486. ffff!=FALSE
  6487. jjjj%=LEN(aaaa$)
  6488. ENDIF
  6489. NEXT jjjj%
  6490. ENDIF
  6491. IF ffff!
  6492. pppp%=0
  6493. WHILE pppp%<LEN(aaaa$)
  6494. EXIT IF CARD{ADD(V:aaaa$,pppp%)}>aaaa%
  6495. ADD pppp%,2
  6496. WEND
  6497. aaaa$=LEFT$(aaaa$,pppp%)+MKI$(aaaa%)+RIGHT$(aaaa$,SUB(LEN(aaaa$),pppp%))
  6498. ENDIF
  6499. ENDIF
  6500. NEXT iiii%
  6501. RETURN aaaa$
  6502. ENDFUNC
  6503. FUNCTION ins_cherche_sample(ssss%,dddd%)
  6504. ' Cherche dans quel instrument se trouve le sample ssss%
  6505. ' La recherche commence a l'instrument dddd%
  6506. LOCAL iiii%
  6507. LOCAL ffff!
  6508. ffff!=FALSE
  6509. WHILE dddd%<=255
  6510. FOR iiii%=1 TO 127
  6511. IF FN isample(dddd%,iiii%)=ssss%
  6512. ffff!=TRUE
  6513. ENDIF
  6514. NEXT iiii%
  6515. EXIT IF ffff!
  6516. INC dddd%
  6517. WEND
  6518. IF ffff!
  6519. RETURN dddd%
  6520. ELSE
  6521. RETURN 0
  6522. ENDIF
  6523. ENDFUNC
  6524. ' Fonctions concernant les enveloppes
  6525. FUNCTION env_chunkadr(num%,type%)
  6526. IF type%=0
  6527. RETURN LONG{ADD(r_adr_evol%,SHL(num%,2))}
  6528. ELSE IF type%=1
  6529. RETURN LONG{ADD(r_adr_eton%,SHL(num%,2))}
  6530. ELSE
  6531. RETURN LONG{ADD(r_adr_epan%,SHL(num%,2))}
  6532. ENDIF
  6533. ENDFUNC
  6534. FUNCTION env_chunklen(num%,type%)
  6535. RETURN LONG{ADD(FN env_chunkadr(num%,type%),4)}
  6536. ENDFUNC
  6537. FUNCTION envelopename$(num%,type%)
  6538. LOCAL i%,a$
  6539. a$=""
  6540. FOR i%=10 TO 26 STEP 4
  6541. a$=a$+MKL$(LONG{ADD(FN env_chunkadr(num%,type%),i%)})
  6542. NEXT i%
  6543. RETURN a$
  6544. ENDFUNC
  6545. FUNCTION env_sectadr(num%,type%,sect%)
  6546. IF sect%=0
  6547. RETURN ADD(FN env_chunkadr(num%,type%),32)
  6548. ELSE
  6549. RETURN ADD(FN env_chunkadr(num%,type%),ADD(32,CARD{ADD(FN env_chunkadr(num%,type%),30)}))
  6550. ENDIF
  6551. ENDFUNC
  6552. FUNCTION env_sectlen(num%,type%,sect%)
  6553. IF sect%=0
  6554. RETURN CARD{ADD(FN env_chunkadr(num%,type%),30)}
  6555. ELSE
  6556. RETURN SUB(SUB(LONG{ADD(FN env_chunkadr(num%,type%),4)},32),CARD{ADD(FN env_chunkadr(num%,type%),30)})
  6557. ENDIF
  6558. ENDFUNC
  6559. FUNCTION pos_enveloppe(num%,type%,sect%,pos%)
  6560. ' Type de l'enveloppe (0,1 ou 2), numero de l'enveloppe (0-63),
  6561. ' Attack/Key off (0 ou 1), position recherchee
  6562. ' Retourne la position en octets relativement au debut des donnees du numero
  6563. ' d'une commande
  6564. ' Retourne -1 si la position n'existe pas
  6565. LOCAL a%,b%,c%,l%,p%
  6566. a%=FN env_sectadr(num%,type%,sect%)
  6567. l%=FN env_sectlen(num%,type%,sect%)
  6568. p%=0                  ! Compteur en positions
  6569. c%=0                  ! Compteur en octets
  6570. WHILE c%<l%
  6571. EXIT IF p%>=pos%
  6572. b%=BYTE{a%}         ! Commande
  6573. SELECT b%           ! Nbr d'octets pris par commande+parametre
  6574. CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  6575. ADD a%,2
  6576. ADD c%,2
  6577. CASE &H1,&H2,&H4,&H80,&H81,&HA0,&HA1,&HC0,&HC1
  6578. ADD a%,3
  6579. ADD c%,3
  6580. DEFAULT
  6581. INC a%
  6582. INC c%
  6583. ENDSELECT
  6584. INC p%
  6585. WEND
  6586. IF c%>=l%
  6587. RETURN -1
  6588. ELSE
  6589. RETURN c%
  6590. ENDIF
  6591. ENDFUNC
  6592. FUNCTION numcom_enveloppe(num%,type%,sect%,pos%)
  6593. ' Type de l'enveloppe (0,1 ou 2), numero de l'enveloppe (0-63),
  6594. ' Attack/Key off (0 ou 1), position en octets recherchee
  6595. ' Retourne le numero de la commande correspondant a une position en octets
  6596. LOCAL a%,b%,c%,l%,p%
  6597. a%=FN env_sectadr(num%,type%,sect%)
  6598. l%=FN env_sectlen(num%,type%,sect%)
  6599. p%=0                  ! Compteur en positions
  6600. c%=0                  ! Compteur en octets
  6601. WHILE c%<l%
  6602. EXIT IF c%>=pos%
  6603. b%=BYTE{a%}         ! Commande
  6604. SELECT b%           ! Nbr d'octets pris par commande+parametre
  6605. CASE &H3,&H82,&H85,&H86,&H89,&H8A,&HA2,&HA5,&HA6,&HC2
  6606. ADD a%,2
  6607. ADD c%,2
  6608. CASE &H1,&H2,&H4,&H80,&H81,&HA0,&HA1,&HC0,&HC1
  6609. ADD a%,3
  6610. ADD c%,3
  6611. DEFAULT
  6612. INC a%
  6613. INC c%
  6614. ENDSELECT
  6615. INC p%
  6616. WEND
  6617. RETURN p%
  6618. ENDFUNC
  6619. '
  6620. '
  6621. '
  6622. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  6623. ' *                                                                          *
  6624. ' *                             Donnees diverses                             *
  6625. ' *                                                                          *
  6626. ' *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  6627. '
  6628. ' 0
  6629. icones_disk:
  6630. DATA 33,0,5
  6631. DATA 0,"LOAD MOD",21,35,9,9, 1,"SAVE MOD",31,35,9,9
  6632. DATA 2," ",66,45,1,9, 3," ",66,45,1,9
  6633. DATA 4,"LOAD PREF",21,45,9,9, 5,"SAVE PREF",31,45,9,9
  6634. DATA 6,"MODULE PATH                                       ",20,60,50,9
  6635. DATA 7,"SAMPLE PATH                                       ",20,70,50,9
  6636. DATA 8,"PREFS PATH                                        ",20,80,50,9
  6637. DATA 9,"AUTOLOAD PATH                                     ",20,90,50,9
  6638. DATA 10,"GT2",42,35,3,9, 11,"GTK",42,45,3,9, 12,"MOD",46,35,3,9, 13,"MMD",46,45,3,9
  6639. DATA 14,"669",50,35,3,9, 15,"MTM",50,45,3,9, 16,"S3M",54,35,3,9, 17,"ULT",54,45,3,9
  6640. DATA 18,"DTM",58,35,3,9, 19,"XM",58,45,3,9, 20,"*",62,35,3,9, 21,"   ",62,45,3,9
  6641. DATA 22,"   ",66,35,3,9, 23,"   ",66,45,3,9, 24,"   ",70,35,3,9, 25,"   ",70,45,3,9
  6642. DATA 26,"UNSIGNED",66,45,1,9
  6643. DATA 27,"MAKE DIR",71,60,8,9, 28,"DEL DIR",71,70,8,9
  6644. DATA 29,"DEL FILE",71,80,8,9, 30,"RENAME",71,90,8,9
  6645. DATA 31,"FORMAT",71,50,8,9
  6646. DATA 32," ",77,35,1,9
  6647. ' 1
  6648. icones_tools:
  6649. DATA 24,0,5
  6650. DATA 0,"START",21,40,9,11, 1,"PASTE",33,35,7,9, 2,"CLEAR",41,45,7,9, 3,"NOTE UP",49,45,9,9
  6651. DATA 4,"END",21,53,9,11, 5,"INSERT",33,45,7,9, 6,"DELETE",41,55,7,9, 7,"NOTE DOWN",49,55,9,9
  6652. 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
  6653. 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
  6654. DATA 16,"MASK ON               ",29,75,22,9, 17,"REPLACE BY            ",29,85,22,9
  6655. DATA 18,"EXT NOTE       ",63,77,15,9
  6656. DATA 19,"SONG",71,40,7,9, 20,"INSTR",71,50,7,9, 21,"ALL",71,60,7,9
  6657. DATA 22,".../...",72,90,7,9
  6658. DATA 23,"SONG",61,60,7,9
  6659. ' 2
  6660. icones_sample1:
  6661. DATA 16,0,0
  6662. DATA 0,"EXIT",70,70,9,9
  6663. DATA 1,"ZOOM",0,20,9,9, 2,"ZOOM OUT",10,20,9,9
  6664. DATA 3,"COPY SPL => BLOCK",0,30,19,9
  6665. DATA 4,"COPY BLOCK => SPL",0,40,19,9
  6666. DATA 5,"SWAP BLOCK AND SPL",0,50,19,9
  6667. 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
  6668. DATA 10,"GAP (BLK)",0,60,9,9, 11,"GAP (SPL)",10,60,9,9
  6669. DATA 12,"PLAY",20,30,9,29
  6670. DATA 13,"FINE POS",20,60,9,9
  6671. DATA 14,"SWAP CURS",20,70,9,9
  6672. DATA 15,"RESET CUR",20,20,9,9
  6673. ' 3
  6674. icones_sample2:
  6675. DATA 10,0,0
  6676. 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
  6677. 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
  6678. ' 4
  6679. icones_sample3:
  6680. DATA 10,0,0
  6681. DATA 0,"VOLUME",40,20,9,9, 1,"MIX",40,30,9,9, 2,"RECORD",40,40,9,9
  6682. DATA 3,"MARKS",40,50,9,9, 4,"FREQUENCY",40,60,9,9, 5,"DELAY",40,70,9,9
  6683. DATA 6,"FLANGER",50,20,9,9, 7,"REVERB",50,30,9,9, 8,"SONG2DISK",50,40,9,9
  6684. DATA 9,"COMPRESS.",50,50,9,9
  6685. ' 5
  6686. icones_sample_sm1:
  6687. DATA 17,0,0
  6688. DATA 0,"VOLUME      %",15,90,13,9
  6689. DATA 1,"VOLUME ?",1,85,12,19
  6690. 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
  6691. 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
  6692. DATA 10,"FADE !",49,90,29,9
  6693. DATA 11,"FADE START      %",49,115,17,9
  6694. DATA 12,"FADE END        %",49,125,17,9
  6695. DATA 13,"FADE IN",69,115,9,9
  6696. DATA 14,"FADE OUT",69,125,9,9
  6697. DATA 15,"NO CHANGE",1,125,13,9, 16,"BEST",15,125,13,9
  6698. ' 6
  6699. icones_sample_sm2:
  6700. DATA 46,0,0
  6701. DATA 0,"MIX !",1,85,11,9, 1,"MASTER      %",15,85,13,9
  6702. 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
  6703. 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
  6704. DATA 10," ",1,110,3,9, 11,"ⁿ",5,110,1,9, 12,"²",7,110,1,9, 13," ",9,110,29,9
  6705. 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
  6706. DATA 18," ",1,130,3,9, 19,"ⁿ",5,130,1,9, 20,"²",7,130,1,9, 21," ",9,130,29,9
  6707. 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
  6708. DATA 26," ",41,90,3,9, 27,"ⁿ",45,90,1,9, 28,"²",47,90,1,9, 29," ",49,90,29,9
  6709. 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
  6710. DATA 34," ",41,110,3,9, 35,"ⁿ",45,110,1,9, 36,"²",47,110,1,9, 37," ",49,110,29,9
  6711. 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
  6712. DATA 42," ",41,130,3,9, 43,"ⁿ",45,130,1,9, 44,"²",47,130,1,9, 45," ",49,130,29,9
  6713. ' 7
  6714. icones_samples_sm3:
  6715. DATA 18,0,0
  6716. DATA 0,"SAMPLE",1,85,9,9, 1,"PRESAMPLE",13,85,9,9
  6717. DATA 2,"ⁿ",65,105,1,9, 3,"²",67,105,1,9, 4,"ⁿ",75,105,1,9, 5,"²",77,105,1,9
  6718. DATA 6,"AUTO",69,105,5,9
  6719. DATA 7,"FREQUENCY      Hz",1,105,17,9, 8,"ⁿ",19,105,1,9, 9,"²",21,105,1,9
  6720. DATA 10,"MONITOR",25,120,11,9
  6721. DATA 11,"LEVEL      %",10,125,12,9, 12,"TRIGGER",1,125,8,9
  6722. DATA 13,"L",25,95,3,9, 14,"L+R",29,95,3,9, 15,"R",33,95,3,9
  6723. DATA 16,"FALCON 030 D.A.C.",39,95,23,9, 17,"ST REPLAY PRO CARDRIDGE",39,105,23,9
  6724. ' 8
  6725. icones_samples_sm4:
  6726. DATA 29,0,0
  6727. 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
  6728. 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
  6729. DATA 10,"ALL",65,130,3,9, 11,"RESET",74,130,5,9
  6730. DATA 12,"SET",0,130,5,9
  6731. 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
  6732. 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
  6733. DATA 23," ",4,80,20,49, 24," ",44,80,20,49
  6734. DATA 25," ",26,80,20,49, 26," ",66,80,20,49
  6735. DATA 27," ",33,80,20,49, 28," ",73,80,20,49
  6736. ' 9
  6737. icones_samples_sm5:
  6738. DATA 23,0,0
  6739. DATA 0,"CONVERT",1,90,11,9
  6740. DATA 1,"/2",1,115,3,9, 2,"/3",5,115,3,9, 3,"/4",9,115,3,9
  6741. DATA 4,"x2",1,125,3,9, 5,"x3",5,125,3,9, 6,"x4",9,125,3,9
  6742. DATA 7,"DO",50,90,13,9
  6743. DATA 8,"Hz        =>      ",15,90,18,9
  6744. DATA 9,"NOTE      =>      ",15,115,18,9
  6745. DATA 10,"Hz        =>      ",15,125,18,9
  6746. DATA 11,"NONE",36,95,11,9, 12,"LINEAR",36,105,11,9, 13,"3RD DEGREE",36,115,11,9
  6747. DATA 14,"START      Hz",50,105,13,9, 15,"END        Hz",50,115,13,9
  6748. DATA 16,"# OF PTS     ",50,125,13,9
  6749. DATA 17,"LINEAR",66,90,6,9, 18,"dB",73,90,5,9
  6750. DATA 19,"NONE",66,115,12,9, 20,"BLACKMAN",66,125,12,9
  6751. DATA 21," ",33,107,0,5, 22," ",63,82,0,5
  6752. ' 10
  6753. icones_samples_sm6:
  6754. DATA 30,0,0
  6755. DATA 0,"ON",44,85,2,9, 1,"DELAY TIME      ms",47,85,18,9, 2,"LEVEL      %",66,85,12,9
  6756. DATA 3,"ON",44,95,2,9, 4,"DELAY TIME      ms",47,95,18,9, 5,"LEVEL      %",66,95,12,9
  6757. DATA 6,"ON",44,105,2,9, 7,"DELAY TIME      ms",47,105,18,9, 8,"LEVEL      %",66,105,12,9
  6758. DATA 9,"ON",44,115,2,9, 10,"DELAY TIME      ms",47,115,18,9, 11,"LEVEL      %",66,115,12,9
  6759. DATA 12,"SAMPLE SOURCE   ",29,130,16,9, 13,"ⁿ",46,130,1,9, 14,"²",48,130,1,9, 15," ",50,130,29,9
  6760. DATA 16,"DO",30,113,9,13
  6761. DATA 17,"FEEDBACK       % ",1,85,17,9, 18,"TIME FEED      ms",1,95,17,9
  6762. DATA 19,"DRY LEVEL        %",21,85,18,9, 20,"DELAY LEVEL      %",21,95,18,9
  6763. DATA 21,"MULTI-TAP MODE",1,115,18,9
  6764. DATA 22,"MUTE IN :",1,125,9,9, 23,"      ms",11,125,8,9
  6765. DATA 24,"1",22,115,1,9, 25,"2",24,115,1,9, 26,"3",26,115,1,9
  6766. DATA 27,"4",22,125,1,9, 28,"5",24,125,1,9, 29,"6",26,125,1,9
  6767. ' 11
  6768. icones_tools2:
  6769. DATA 11,0,5
  6770. DATA 0,".../...",72,90,7,9
  6771. DATA 1,"ECHO",21,40,7,9, 2,"CONT",31,40,7,9
  6772. DATA 3,"EVERY   LINES",21,55,13,9, 4,"ⁿ",35,55,1,9, 5,"²",37,55,1,9
  6773. DATA 6," ",21,70,1,9, 7,"FEEDBACK     %",24,70,14,9
  6774. DATA 8," ",21,85,1,9, 9,"FADESTEP      ",24,85,14,9
  6775. DATA 10,"VOLUME SLIDE",41,35,15,9
  6776. ' 12
  6777. icones_instr:
  6778. DATA 42,0,5
  6779. DATA 0," ",21,34,1,7, 1," ",24,34,19,7
  6780. DATA 2," ",21,40,1,7, 3," ",24,40,19,7
  6781. DATA 4," ",21,46,1,7, 5," ",24,46,19,7
  6782. DATA 6," ",21,52,1,7, 7," ",24,52,19,7
  6783. DATA 8," ",21,58,1,7, 9," ",24,58,19,7
  6784. DATA 10," ",21,64,1,7, 11," ",24,64,19,7
  6785. DATA 12," ",21,70,1,7, 13," ",24,70,19,7
  6786. DATA 14," ",21,76,1,7, 15," ",24,76,19,7
  6787. DATA 16,"ⁿ",45,35,1,9, 17,"²",45,45,1,9
  6788. DATA 18,"FROM      ",49,60,10,9, 19,"ⁿ",60,60,1,9, 20,"²",62,60,1,9
  6789. DATA 21,"TO        ",49,70,10,9, 22,"ⁿ",60,70,1,9, 23,"²",62,70,1,9
  6790. DATA 24,"VOLUME    ",49,85,10,9, 25,"ⁿ",60,85,1,9, 26,"²",62,85,1,9
  6791. DATA 27,"VOLUME   ",65,45,9,9, 28,"ⁿ",75,45,1,9, 29,"²",77,45,1,9
  6792. DATA 30,"TON      ",65,55,9,9, 31,"ⁿ",75,55,1,9, 32,"²",77,55,1,9
  6793. DATA 33,"PAN      ",65,65,9,9, 34,"ⁿ",75,65,1,9, 35,"²",77,65,1,9
  6794. DATA 36,"ⁿ",27,85,1,9, 37,"²",29,85,1,9
  6795. DATA 38,"ⁿ",44,85,1,9, 39,"²",46,85,1,9
  6796. DATA 40,"LIST",65,80,13,14
  6797. DATA 41,"GROUP",52,35,7,19
  6798. ' 13
  6799. icones_instr_list:
  6800. DATA 17,0,5
  6801. DATA 0,"1st PAGE",69,75,9,19
  6802. DATA 1,"ⁿ",53,35,1,9, 2,"²",53,45,1,9
  6803. DATA 3,"TOP",56,35,3,9
  6804. DATA 4,"LOAD INSTRUMENT",61,35,17,9
  6805. DATA 5,"LOAD & KEEP SPL",61,45,17,9
  6806. DATA 6,"SAVE INSTRUMENT",61,55,17,9
  6807. DATA 7," ",21,35,30,5
  6808. DATA 8," ",21,41,30,5
  6809. DATA 9," ",21,47,30,5
  6810. DATA 10," ",21,53,30,5
  6811. DATA 11," ",21,59,30,5
  6812. DATA 12," ",21,65,30,5
  6813. DATA 13," ",21,71,30,5
  6814. DATA 14," ",21,77,30,5
  6815. DATA 15," ",21,83,30,5
  6816. DATA 16," ",21,89,30,5
  6817. ' 14
  6818. icones_sample:
  6819. DATA 41,0,5
  6820. DATA 0,"SAMPLE       ",21,35,13,9, 1,"ⁿ",35,35,1,9, 2,"²",37,35,1,9
  6821. DATA 3,"NAME                             ",39,35,33,9
  6822. DATA 4,"LENGTH       ",21,50,13,9, 5,"ⁿ",35,50,1,9, 6,"²",37,50,1,9
  6823. DATA 7,"REPEAT       ",21,60,13,9, 8,"ⁿ",35,60,1,9, 9,"²",37,60,1,9
  6824. DATA 10,"REPLEN       ",21,70,13,9, 11,"ⁿ",35,70,1,9, 12,"²",37,70,1,9
  6825. DATA 13,"VOLUME     ",41,50,11,9, 14,"ⁿ",53,50,1,9, 15,"²",55,50,1,9
  6826. DATA 16,"FINETUNE   ",41,60,11,9, 17,"ⁿ",53,60,1,9, 18,"²",55,60,1,9
  6827. DATA 19,"BALANCE    ",41,70,11,9, 20,"ⁿ",53,70,1,9, 21,"²",55,70,1,9
  6828. DATA 22,"FREQUENCY      ",59,50,15,9, 23,"ⁿ",75,50,1,9, 24,"²",77,50,1,9
  6829. DATA 25,"NBR OF BITS    ",59,60,15,9, 26,"ⁿ",75,60,1,9, 27,"²",77,60,1,9
  6830. DATA 28,"KILL",74,35,4,9
  6831. DATA 29,"LIST",71,75,7,19
  6832. DATA 30,"LOAD",21,85,7,9, 31,"SAVE",29,85,7,9
  6833. DATA 32,"AVR",50,85,3,9, 33,"SPL",54,85,3,9, 34,"WAV",58,85,3,9, 35,"*",62,85,3,9
  6834. DATA 36,"   ",66,85,3,9, 37,"   ",58,75,3,9, 38,"   ",62,75,3,9, 39,"   ",66,75,3,9
  6835. DATA 40,"SIGNED",39,85,8,9
  6836. ' 15
  6837. icones_sample_list:
  6838. DATA 15,0,5
  6839. DATA 0,"1st PAGE",69,75,9,19
  6840. DATA 1,"ⁿ",53,35,1,9, 2,"²",53,45,1,9
  6841. DATA 3,"TOP",56,35,3,9
  6842. DATA 4,"INSTRUMENT ?",61,35,17,9
  6843. DATA 5," ",21,35,30,5
  6844. DATA 6," ",21,41,30,5
  6845. DATA 7," ",21,47,30,5
  6846. DATA 8," ",21,53,30,5
  6847. DATA 9," ",21,59,30,5
  6848. DATA 10," ",21,65,30,5
  6849. DATA 11," ",21,71,30,5
  6850. DATA 12," ",21,77,30,5
  6851. DATA 13," ",21,83,30,5
  6852. DATA 14," ",21,89,30,5
  6853. ' 16
  6854. icones_panneau_principal:
  6855. DATA 28,0,0
  6856. DATA 0,"POSITION      ",0,0,14,9, 1,"ⁿ",15,0,1,9, 2,"²",17,0,1,9
  6857. DATA 3,"PATTERN       ",0,10,14,9, 4,"ⁿ",15,10,1,9, 5,"²",17,10,1,9
  6858. DATA 6,"LENGTH        ",0,20,14,9, 7,"ⁿ",15,20,1,9, 8,"²",17,20,1,9
  6859. DATA 9,"REPEAT        ",0,30,14,9, 10,"ⁿ",15,30,1,9, 11,"²",17,30,1,9
  6860. DATA 12,"INSTRUMENT    ",0,45,14,9, 13,"ⁿ",15,45,1,9, 14,"²",17,45,1,9
  6861. DATA 15,"SAMPLE        ",0,55,14,9, 16,"ⁿ",15,55,1,9, 17,"²",17,55,1,9
  6862. DATA 18,"STEP   ",7,65,7,9, 19,"ⁿ",15,65,1,9, 20,"²",17,65,1,9
  6863. DATA 21,"SONGNAME                                 ",0,110,41,9
  6864. DATA 22,"INSTRNAME                             ",42,110,37,9
  6865. DATA 23,"TRACKS   ",0,80,9,9, 24,"LINES    ",0,90,9,9
  6866. DATA 25," ",0,65,6,9
  6867. DATA 26,"ON/OFF",0,120,7,9, 27,"PRESET",0,130,7,9
  6868. ' 17
  6869. icones_enveloppe_volume:
  6870. DATA 49,0,5
  6871. DATA 0," ",21,35,3,5
  6872. DATA 1," ",21,41,3,5
  6873. DATA 2," ",21,47,3,5
  6874. DATA 3," ",21,53,3,5
  6875. DATA 4," ",21,59,3,5
  6876. DATA 5," ",21,65,3,5
  6877. DATA 6," ",21,71,3,5
  6878. DATA 7," ",21,77,3,5
  6879. DATA 8," ",21,83,3,5
  6880. DATA 9," ",21,89,3,5
  6881. DATA 10," ",26,35,15,5
  6882. DATA 11," ",26,41,15,5
  6883. DATA 12," ",26,47,15,5
  6884. DATA 13," ",26,53,15,5
  6885. DATA 14," ",26,59,15,5
  6886. DATA 15," ",26,65,15,5
  6887. DATA 16," ",26,71,15,5
  6888. DATA 17," ",26,77,15,5
  6889. DATA 18," ",26,83,15,5
  6890. DATA 19," ",26,89,15,5
  6891. DATA 20," ",68,35,10,5
  6892. DATA 21," ",68,41,10,5
  6893. DATA 22," ",68,47,10,5
  6894. DATA 23," ",68,53,10,5
  6895. DATA 24," ",68,59,10,5
  6896. DATA 25," ",68,65,10,5
  6897. DATA 26," ",68,71,10,5
  6898. DATA 27," ",68,77,10,5
  6899. DATA 28," ",68,83,10,5
  6900. DATA 29," ",68,89,10,5
  6901. DATA 30,"ⁿ",43,35,1,9, 31,"²",43,45,1,9
  6902. DATA 32,"ⁿ",65,35,1,9, 33,"²",65,45,1,9
  6903. DATA 34,"VOLUME",46,35,6,9, 35,"TONE",53,35,5,9, 36,"PAN",59,35,4,9
  6904. DATA 37,"ATTACK",47,45,7,9, 38,"KEY OFF",55,45,7,9
  6905. DATA 39,"ENVELOPE   ",43,60,11,9, 40,"ⁿ",55,60,1,9, 41,"²",57,60,1,9
  6906. DATA 42,"CLR ENV",59,60,7,9
  6907. DATA 43," ",44,70,21,9
  6908. DATA 44,"DEL COM",43,85,7,9
  6909. DATA 45,"COPY",52,85,6,9, 46," ",59,85,3,9, 47,"ⁿ",63,85,1,9, 48,"²",65,85,1,9
  6910. ' 18
  6911. icones_tools3:
  6912. DATA 16,0,5
  6913. DATA 0,".../...",72,90,7,9
  6914. DATA 1,"ⁿ",44,35,1,9, 2,"²",44,45,1,9
  6915. DATA 3,"TOP",47,35,3,9
  6916. DATA 4,"INSERT POS",52,35,11,9, 5,"DELETE POS",52,45,11,9
  6917. DATA 6," ",21,35,30,5
  6918. DATA 7," ",21,41,30,5
  6919. DATA 8," ",21,47,30,5
  6920. DATA 9," ",21,53,30,5
  6921. DATA 10," ",21,59,30,5
  6922. DATA 11," ",21,65,30,5
  6923. DATA 12," ",21,71,30,5
  6924. DATA 13," ",21,77,30,5
  6925. DATA 14," ",21,83,30,5
  6926. DATA 15," ",21,89,30,5
  6927. ' 19
  6928. icones_samples_sm7_1:
  6929. DATA 16,0,0
  6930. DATA 0,"2nd PAGE",61,115,17,19
  6931. DATA 1,"LEFT CHANNEL",1,95,13,9, 2,"RIGHT CHANNEL",1,105,13,9, 3,"MIX L & R CHN",1,115,13,9
  6932. DATA 4,"DRY LEVEL         %",17,95,19,9, 5,"FLANGE LEVEL      %",17,105,19,9
  6933. DATA 6,"FLANGE TIME      ms",39,95,19,9
  6934. DATA 7,"FLANGE FREQ      Hz",39,105,19,9
  6935. DATA 8,"FLANGE DEPTH     ms",39,115,19,9
  6936. DATA 9,"INIT PHASE       π ",39,125,19,9
  6937. DATA 10,"1",61,95,1,9, 11,"2",64,95,1,9, 12,"3",67,95,1,9
  6938. DATA 13,"4",70,95,1,9, 14,"5",73,95,1,9, 15,"6",76,95,1,9
  6939. ' 20
  6940. icones_samples_sm7_2:
  6941. DATA 20,0,0
  6942. DATA 0,"1st PAGE",67,115,11,19
  6943. DATA 1,"LEFT SOURCE    ",1,85,15,9, 2,"ⁿ",17,85,1,9, 3,"²",19,85,1,9, 4," ",21,85,29,9
  6944. DATA 5,"RIGHT SOURCE   ",1,115,15,9, 6,"ⁿ",17,115,1,9, 7,"²",19,115,1,9, 8," ",21,115,29,9
  6945. DATA 9,"LEFT ³ LEFT        %",10,95,20,9, 10,"LEFT ³ RIGHT      %",31,95,19,9
  6946. DATA 11,"RIGHT ³ RIGHT      %",10,125,20,9, 12,"RIGHT ³ LEFT      %",31,125,19,9
  6947. DATA 13,"MONO",67,85,11,9, 14,"STEREO",67,95,11,9
  6948. DATA 15,"SIN",53,85,11,9, 16,"SQUARE",53,95,11,9, 17,"TRIANGLE",53,105,11,9
  6949. DATA 18,"RAMP DOWN",53,115,11,9, 19,"RAMP UP",53,125,11,9
  6950. ' 21
  6951. icones_samples_sm8_1:
  6952. DATA 16,0,0
  6953. DATA 0,"EXTRA",71,120,8,19
  6954. DATA 1,"REVERBERATION",1,85,22,9
  6955. DATA 2,"DRY LEVEL            %",1,105,22,9
  6956. DATA 3,"REVERB LEVEL         %",1,115,22,9
  6957. DATA 4,"EARLY REF LEVEL      %",1,125,22,9
  6958. DATA 5,"NUMBER OF TAPS   ",26,95,17,9, 6,"ⁿ",44,95,1,9, 7,"²",46,95,1,9
  6959. DATA 8,"NUMBER OF C.F.   ",50,95,17,9, 9,"ⁿ",68,95,1,9, 10,"²",70,95,1,9
  6960. DATA 11,"OVERALL GAIN        %",50,105,21,9
  6961. DATA 12,"SOURCE   ",26,125,9,9, 13,"ⁿ",36,125,1,9, 14,"²",38,125,1,9
  6962. DATA 15," ",40,125,29,9
  6963. ' 22
  6964. icones_samples_sm8_2:
  6965. DATA 14,0,0
  6966. DATA 0,"MAIN PAGE",68,120,11,19
  6967. DATA 1," ",1,90,1,41, 2," ",4,90,4,41, 3," ",10,90,4,41
  6968. DATA 4,"ⁿ",16,90,1,9, 5,"²",16,100,1,9
  6969. DATA 6," ",20,90,1,41, 7," ",23,90,4,41, 8," ",29,90,4,41
  6970. DATA 9,"ⁿ",35,90,1,9, 10,"²",35,100,1,9
  6971. DATA 11,"DELAY      ms",39,95,13,9, 12,"GAIN       % ",53,95,13,9
  6972. DATA 13,"DELAY      ms",39,125,13,9
  6973. ' 23
  6974. icones_song2disk:
  6975. DATA 21,0,0
  6976. DATA 0," ",7,95,1,9, 1," ",12,95,1,9
  6977. DATA 2," ",7,105,1,9, 3," ",12,105,1,9
  6978. DATA 4,"8 BITS",17,85,7,9, 5,"16 BITS",25,85,7,9
  6979. DATA 6,"MONO",17,105,7,9, 7,"STEREO",25,105,7,9
  6980. DATA 8,"BLOCK",35,95,5,9, 9,"DISK",35,105,5,9
  6981. DATA 10,"MAXIMUM DURATION      s ",43,95,24,9
  6982. DATA 11,"MAXIMUM SIZE          Kb",43,105,24,9
  6983. 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
  6984. 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
  6985. DATA 20,"RECORD",1,125,9,9
  6986. ' 24
  6987. texte_icone1:
  6988. DATA 16,0,0
  6989. DATA 0,"PLAY SONG",20,0,11,9, 1,"EDIT",32,0,11,9, 2,"INSERT POS",44,0,11,9
  6990. DATA 3,"PREFS",56,0,11,9, 4,"SCORE",68,0,11,9
  6991. DATA 5,"PLAY PAT.",20,10,11,9, 6,"STOP",32,10,11,9, 7,"DELETE POS",44,10,11,9
  6992. DATA 8,"HELP",56,10,11,9, 9,"SAMPLE EDIT",68,10,11,9
  6993. DATA 10,"DISK",20,20,8,9, 11,"TOOLS",29,20,8,9, 12,"INSTRUMENTS",38,20,11,9
  6994. DATA 13,"SAMPLES",50,20,9,9, 14,"ENVELOPES",60,20,9,9, 15,"CONTROL",70,20,9,9
  6995. ' 25
  6996. icones_control:
  6997. DATA 50,0,5
  6998. DATA 0," ",20,30,0,0, 1,"RESET",44,35,5,9
  6999. DATA 2," ",21,40,2,47, 3," ",21,92,2,5
  7000. DATA 4," ",26,40,2,47, 5," ",26,92,2,5
  7001. DATA 6," ",31,40,2,47, 7," ",31,92,2,5
  7002. DATA 8,"TEMPO    ",36,75,9,9, 9,"ⁿ",46,75,1,9, 10,"²",48,75,1,9
  7003. DATA 11,"SPEED    ",36,85,9,9, 12,"ⁿ",46,85,1,9, 13,"²",48,85,1,9
  7004. DATA 14,"01-08",36,45,6,9, 15,"09-16",43,45,6,9
  7005. DATA 16,"17-24",36,55,6,9, 17,"25-32",43,55,6,9
  7006. DATA 18," ",56,32,2,5, 19,"¯",60,31,1,7, 20,"³",62,31,1,7, 21," ",52,40,11,5
  7007. DATA 22," ",56,49,2,5, 23,"¯",60,48,1,7, 24,"³",62,48,1,7, 25," ",52,57,11,5
  7008. DATA 26," ",56,66,2,5, 27,"¯",60,65,1,7, 28,"³",62,65,1,7, 29," ",52,74,11,5
  7009. DATA 30," ",56,83,2,5, 31,"¯",60,82,1,7, 32,"³",62,82,1,7, 33," ",52,91,11,5
  7010. DATA 34," ",70,32,2,5, 35,"¯",74,31,1,7, 36,"³",76,31,1,7, 37," ",66,40,11,5
  7011. DATA 38," ",70,49,2,5, 39,"¯",74,48,1,7, 40,"³",76,48,1,7, 41," ",66,57,11,5
  7012. DATA 42," ",70,66,2,5, 43,"¯",74,65,1,7, 44,"³",76,65,1,7, 45," ",66,74,11,5
  7013. DATA 46," ",70,83,2,5, 47,"¯",74,82,1,7, 48,"³",76,82,1,7, 49," ",66,91,11,5
  7014. ' 26
  7015. icones_samples_sm9:
  7016. DATA 9,0,0
  7017. DATA 0,"DO",1,85,15,49
  7018. DATA 1,"SOURCE   ",19,125,9,9, 2,"ⁿ",29,125,1,9, 3,"²",31,125,1,9
  7019. DATA 4," ",33,125,29,9
  7020. DATA 5,"LEVEL       %",19,85,13,9
  7021. DATA 6,"SPEED    ",19,105,9,9, 7,"ⁿ",29,105,1,9, 8,"²",31,105,1,9
  7022. '
  7023. touches_notes:
  7024. DATA 44,31,45,32,46,47,34,48,35,49,36,50,51,38,52,39,53
  7025. DATA 16,3,17,4,18,19,6,20,7,21,8,22,23,10,24,11,25,26,13,27,41
  7026. '
  7027. enveloppe_coms:
  7028. DATA $0,6
  7029. DATA "End",0,"Jump to ",0,"Wait ",50,"Set Counter ",1,"Loop to ",0,"Key Off",0
  7030. DATA $80,11
  7031. DATA "Volume ",$4000,"Vol Step ",0,"Vol Speed ",1
  7032. DATA "Tremolo On",0,"Tremolo Off",0,"Trem Width ",$10,"Trem Speed ",8
  7033. DATA "Tremor On",0,"Tremor Off",0,"TremorTime1 ",3,"TremorTime2 ",3
  7034. DATA $A0,7
  7035. DATA "Period ",$1000,"Tone Step ",0,"Tone Speed ",1
  7036. DATA "Vibrato On",0,"Vibrato Off",0,"Vib Width ",3,"Vib Speed ",8
  7037. DATA $C0,3
  7038. DATA "Panning ",$800,"Pan Step ",0,"Pan Speed ",1
  7039. '
  7040. rev_tap_delay_level:
  7041. 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
  7042. rev_comb_delay_lpf:
  7043. DATA 0.0547,0.448, 0.07,0.496, 0.0448,0.408, 0.0646,0.476
  7044. '
  7045. help_text:
  7046. DATA "              ******************************************"
  7047. DATA "              *                                        *"
  7048. DATA "              *     G R A O U M F   T R A C K E R      *"
  7049. DATA "              *                                        *"
  7050. DATA "              *           Version Beta-demo            *"
  7051. DATA "              *      by Laurent de SORAS - 1994/95     *"
  7052. DATA "              *                                        *"
  7053. DATA "              *     "Bidibidi Zwivvv Bidibidi Toc      *"
  7054. DATA "              *         Eki Eki Eki Ta Pang !          *"
  7055. DATA "              *      Ata Ata Oglo Hulu : Ni Ni !"      *"
  7056. DATA "              *                                        *"
  7057. DATA "              ******************************************"
  7058. DATA ""
  7059. DATA "                             ------------"
  7060. DATA "                             -   HELP   -"
  7061. DATA "                             ------------"
  7062. DATA ""
  7063. DATA "Graoumf Tracker is Shareware!!!"
  7064. DATA "You can copy me, but if you like me, you MUST send your money to my"
  7065. DATA "creator (100 FF, $25 or 30 DM):"
  7066. DATA "Laurent de Soras"
  7067. DATA "92 Avenue Albert 1er"
  7068. DATA "92500 Rueil-Malmaison"
  7069. DATA "FRANCE"
  7070. '
  7071. DATA "Les notes"
  7072. DATA "---------"
  7073. DATA ""
  7074. DATA "C  C# D  D# E     F  F# G  G# A  A# B     C  C# D  D# E    F  F# G  G#"
  7075. DATA "----------------------------------------------------------------------"
  7076. DATA "   2     3           5     6    7            9     0          -     `"
  7077. DATA "A     Z     E     R     T     Y     U     I     O     P    ^     $"
  7078. DATA "----------------------------------------------------------------------"
  7079. DATA "   S     D           G     H     J           L     M"
  7080. DATA "W     X     C     V     B     N     ,     ;     :     ="
  7081. DATA "----------------------------------------------------------------------"
  7082. DATA ""
  7083. DATA "Les touches"
  7084. DATA "-----------"
  7085. DATA ""
  7086. DATA "SHIFT + ¯ ou ³            : Position +/-"
  7087. DATA "SHIFT + ⁿ ou ²            : Saute au debut de la mesure la plus proche"
  7088. DATA "TAB                       : Place le curseur sur la colonne suivante"
  7089. DATA "SHIFT + TAB               : L'inverse de ci-dessus"
  7090. DATA "CTRL + ¯ ou ³             : Change de preset"
  7091. DATA "BACKSPACE                 : Detruit la note sous le curseur et l'instr"
  7092. DATA "SHIFT + BACKSPACE         : Detruit seulement l'effet"
  7093. DATA "CTRL + BACKSPACE          : Detruit note, numero d'instrument et effet"
  7094. DATA "ALT + BACKSPACE           : Detruit la commande de volume"
  7095. '
  7096. DATA "CTRL + DELETE             : Supprime une ligne de la voie sur laquelle"
  7097. DATA "                            est le curseur"
  7098. DATA "SHIFT gauche + DELETE     : Supprime une ligne du pattern"
  7099. DATA "SHIFT gauche + CTRL + DEL : Supprime une ligne du preset"
  7100. DATA "CTRL + INSERT             : Insere une ligne dans la voie sur laquelle"
  7101. DATA "                            est le curseur"
  7102. DATA "SHIFT gauche + INSERT     : Insere une ligne dans le pattern"
  7103. DATA "SHIFT gauche + CTRL + INS : Insere une ligne dans le preset"
  7104. DATA "Ces 6 commandes + SHIFT d : Rotation vers le haut ou le bas au lieu"
  7105. DATA "                            d'inserion/suppression"
  7106. DATA "Pave numerique (+SHIFT d) : Selection d'un instrument"
  7107. DATA "INSERT                    : Diminue le numero du sample courant"
  7108. DATA "CLR HOME                  : Augmente le numero du sample courant"
  7109. DATA "ESC                       : Change l'octave du clavier"
  7110. DATA "F5                        : Selection Numero de sample/Drumpad"
  7111. DATA "SHIFT gauche + Pave       : Enregistrer sur le drumpad la note sous le"
  7112. DATA "                            curseur"
  7113. DATA "RETURN ou 0 du pave       : Play song"
  7114. DATA "SHIFT + RET ou + 0 pave   : Play pattern"
  7115. DATA "F4                        : Cont song"
  7116. DATA "SHIFT + F4                : Cont pattern"
  7117. DATA "F6 - F10 (+ SHIFT)        : Ligne 00, 10, 20, 30 et 3F (+40)"
  7118. DATA ""
  7119. DATA ""
  7120. '
  7121. DATA "F1                        : Marque le debut du bloc"
  7122. DATA "SHIFT + F1                : Marque la fin du bloc"
  7123. DATA "F2                        : Copie le bloc sur le curseur (piste)"
  7124. DATA "SHIFT + F2                : Copie le bloc (pattern)"
  7125. DATA "CTRL + F2                 : Copie le bloc (preset)"
  7126. DATA "ALT + F2                  : Copie le bloc (la voie sous le curseur)"
  7127. DATA "CTRL + SHIFT + ⁿ          : Augmente de 2 lignes l'affichage du patt."
  7128. DATA "CTRL + SHIFT + ²          : Diminue de 2 lignes l'affichage du pattern"
  7129. DATA "CTRL + D                  : Affiche le temps machine"
  7130. DATA "CTRL + E                  : Acces a la colonne de volume"
  7131. DATA "                            Vision normale ou globale"
  7132. DATA "CTRL + I                  : Interpolation On/Off sur la voie du curseur"
  7133. DATA "CTRL + SHIFT + I          : Interpolation On/Off sur toutes les voies"
  7134. DATA "CTRL + R                  : Change la frequence de replay"
  7135. DATA "CTRL + S                  : Augmentation de 1 du pas d'edition"
  7136. DATA "  + SHIFT                 : Diminution de 1 du pas d'edition"
  7137. DATA "ALT + L                   : Load module"
  7138. DATA "ALT + S                   : Save module"
  7139. DATA ""
  7140. DATA ""
  7141. DATA ""
  7142. DATA ""
  7143. DATA ""
  7144. DATA ""
  7145. '
  7146. DATA "Les Effets"
  7147. DATA "----------"
  7148. DATA ""
  7149. DATA "01xx : Portamento up"
  7150. DATA "02xx : Portamento down"
  7151. DATA "03xx : Tone portamento"
  7152. DATA "04xy : Vibrato"
  7153. DATA "05xx : Tone portamento + Vibrato"
  7154. DATA "06xy : Vibrato + Tone portamento"
  7155. DATA "07xy : Tremolo"
  7156. DATA "08xy : Detune"
  7157. DATA "09xx : Note delay"
  7158. DATA "0Axx : Cut note"
  7159. DATA "0Bxx : Go to line"
  7160. DATA "0C?x : Set vibrato waveform"
  7161. DATA "0Dxx : Break pattern"
  7162. DATA "0E?x : Set tremolo waveform"
  7163. DATA "0Fxx : Set global speed/Tempo"
  7164. DATA "10xy : Arpeggio"
  7165. DATA "11xx : Fine portamento up"
  7166. DATA "12xx : Fine portamento down"
  7167. DATA "13xy : Roll + Volume slide"
  7168. DATA "14xx : Linear volume slide up"
  7169. DATA "15xx : Linear volume slide down"
  7170. '
  7171. DATA "16xx : Exp. volume slide up"
  7172. DATA "17xx : Exp. volume slide down"
  7173. DATA "18xx : Linear volume slide up + Tone portamento"
  7174. DATA "19xx : Linear volume slide down + Tone portamento"
  7175. DATA "1Axx : Exp. volume slide up + Tone portamento"
  7176. DATA "1Bxx : Exp. volume slide down + Tone portamento"
  7177. DATA "1Cxx : Linear volume slide up + Vibrato"
  7178. DATA "1Dxx : Linear volume slide down + Vibrato"
  7179. DATA "1Exx : Exp. volume slide up + Vibrato"
  7180. DATA "1Fxx : Exp. volume slide down + Vibrato"
  7181. DATA "A0xx : Linear master volume slide up"
  7182. DATA "A1xx : Linear master volume slide down"
  7183. DATA "A4xx : Fine linear volume up"
  7184. DATA "A5xx : Fine linear volume down"
  7185. DATA "A6xx : Fine linear master volume up"
  7186. DATA "A7xx : Fine linear master volume down"
  7187. DATA "A8xx : Set number of frames"
  7188. DATA "A9xx : Set fine speed"
  7189. DATA "AAxx : Pattern delay"
  7190. DATA "ABxx : Extra fine tone portamento"
  7191. DATA "ACxx : Extra fine portamento up"
  7192. DATA "ADxx : Extra fine portamento down"
  7193. DATA "AExx : Left balance move"
  7194. DATA "AFxx : Right balance move"
  7195. '
  7196. DATA "B0xy : Tremor"
  7197. DATA "B1xx : Pattern loop"
  7198. DATA "B2xx : Set flags... +1 : interpolation"
  7199. DATA "2xxx : Set linear volume"
  7200. DATA "3xxx : Set exp. volume"
  7201. DATA "4xxx : Set balance"
  7202. DATA "5xxx : Set master linear volume"
  7203. DATA "6xxx : Set master esp. volume"
  7204. DATA "7xyy : Roll"
  7205. DATA "8xyz : Roll + volume slide + set balance"
  7206. DATA "9xxx : Offset sample"
  7207. DATA ""
  7208. DATA ""
  7209. DATA ""
  7210. DATA ""
  7211. DATA ""
  7212. DATA ""
  7213. DATA ""
  7214. DATA ""
  7215. DATA ""
  7216. DATA ""
  7217. DATA ""
  7218. DATA ""
  7219. DATA ""
  7220. '
  7221. DATA "THE CRUCIFICTION OF SEAN PENN"
  7222. DATA ""
  7223. DATA "We're gonna kill the California girls"
  7224. DATA "We're gonna fire the exploding load"
  7225. DATA "in the milkmaid maidenhead"
  7226. DATA "We're gonna find the meaning of feeling good"
  7227. DATA "And we're gonna stay there as long as we think we should"
  7228. DATA "  Mystery train"
  7229. DATA "  Three way plane"
  7230. DATA "  Expressway to yr skull"
  7231. DATA ""
  7232. DATA "                                               (SoNiC YoUTh / E.V.O.L)"
  7233. DATA ""
  7234. DATA ""
  7235. DATA ""
  7236. DATA ""
  7237. DATA ""
  7238. DATA ""
  7239. DATA ""
  7240. DATA ""
  7241. DATA ""
  7242. DATA ""
  7243. DATA ""
  7244. DATA ""
  7245. '    "1234567890123456789012345678901234567890123456789012345678901234567890"
  7246. DATA "***"
  7247. '
  7248. textes_blagues:
  7249. DATA "Mr et Mme BRICOT ont un fils,|comment l'appelent-ils ?||R : Judas","*"
  7250. DATA "Mr et Mme POTDANLAPOCHE ont une fille,|comment l'appelent-ils ?||R : Jessica","*"
  7251. DATA "Mr et Mme PEULAFENETRE ont trois fils,|comment les appelent-ils ?||R : Geoffroy, Angele, Firmin","*"
  7252. DATA "Mr et Mme HERGEBEL ont un fils,|comment l'appelent-ils ?||R : Octave","*"
  7253. DATA "Mr et Mme PAFROI ont sept fils,|comment les appelent-ils ?||R : Eva, Aude, Anne, Marc, Sanson, Gilles et Ella","*"
  7254. DATA "Mr et Mme PROVISTSAPU ont trois fils,|comment les appelent-ils ?||R : Quentin, Gaspard, Alain","*"
  7255. DATA "Mr et Mme LIOTEKDAKAJOU ont un fils,|comment l'appelent-ils ?||R : Habib","*"
  7256. DATA "Mr et Mme REMORD ont un fils,|comment l'appelent-ils ?||R : Yves","*"
  7257. DATA "Mr et Mme POURLAVERLCARLAGE ont un fils,|comment l'appelent-ils ?||R : Vladimir","*"
  7258. DATA "Mr et Mme CREMENT ont un fils,|comment l'appelent-ils ?||R : Alex","*"
  7259. DATA "Mr et Mme TANANANANANANA ont deux fils,|comment les appelent-ils ?||R : Starsky et Hutch","*"
  7260. DATA "Mr et Mme LFRIGO ont cinq fils,|comment les appelent-ils ?||R : Steve, Eude, Hubert, Yann, Adam","*"
  7261. DATA "Mr et Mme ERVITMONSLIP ont un fils,|comment l'appelent-ils ?||R : Jean-Philippe","*"
  7262. DATA "Mr et Mme ZELPOURMONMOTEUR ont un fils,|comment l'appelent-ils ?||R : Didier","*"
  7263. DATA "Mr et Mme MAIJAVALPA ont un fils,|comment l'appelent-ils ?||R : Jesus","*"
  7264. DATA "Mr et Mme MAROLEX ont une fille,|comment l'appelent-ils ?||R : Eleonore","*"
  7265. DATA "Mr et Mme PONSABLDUMATOS ont une fille,|comment l'appelent-ils ?||R : Therese","*"
  7266. DATA "Mr et Mme LUTFINALE ont une fille,|comment l'appelent-ils ?||R : Sheila","*"
  7267. DATA "Mr et Mme CHMONFILS ont un fils,|comment l'appelent-ils ?||R : Thierry","*"
  7268. DATA "Mr et Mme BIENUNPTICASCROUTE ont un fils,|comment l'appelent-ils ?||R : Humphrey","*"
  7269. DATA "Mr et Mme BISTROJAISOIF ont un fils,|comment l'appelent-ils ?||R : Alonzo","*"
  7270. DATA "Mr et Mme CONERY ont une fille,|comment l'appelent-ils ?||R : Aretha","*"
  7271. DATA "Mr et Mme PUDBIERDANLFRIGO ont un fils,|comment l'appelent-ils ?||R : Roger","*"
  7272. DATA "Mr et Mme ITZEGOUDWAITOUZESTATION ont une fille,|comment l'appelent-ils ?||R : Eloise","*"
  7273. DATA "Mr et Mme POURIEN ont trois fils,|comment les appelent-ils ?||R : Yvon, Paul et Mickey","*"
  7274. DATA "Mr et Mme AMAR ont cinq fils,|comment les appelent-ils ?||R : Ella, Pacome, Ancel, Helene,|Nadege","*"
  7275. DATA "Mr et Mme NAIBOURREDAITA ont trois fils,|comment les appelent-ils ?||R : Derek, Tom, Jean","*"
  7276. DATA "Mr et Mme Ore ont un fils,|qui est l'ami du fils de|Mr et Mme Jeuner. Comment|s'appele le fils des Ore ?||R : Rick|Car Rick Ore, l'ami du petit des Jeuner","*"
  7277. DATA "Mr et Mme SURLELITETPASSURLECANAPE ont un chien,|comment l'appelent-ils ?||R : Medor","*"
  7278. 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!"
  7279. DATA "*","C'est deux Corses qui se promenent.|Tout d'un coup, l'un deux se retourne"
  7280. DATA "et ecrase un escargot. L'autre :|- Ben pourquoi t'as fait ca ?"
  7281. DATA "- Ca faisait un quart d'heure|que cette bestiole nous suivait!","*"
  7282. DATA "2 vieilles dames discutent|sur la terrasse d'un cafe :"
  7283. DATA "- J'ai l'impression que l'homme la-bas,|il nous regarde avec envie."
  7284. DATA "- Tu m'etonnes, c'est l'antiquaire!","*"
  7285. 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","*"
  7286. DATA "C'est un type qui veut se suicider."
  7287. DATA "Pour son dernier jour, il se lave, se coiffe,"
  7288. DATA "se relave, met du Petrol Hane, du parfum,"
  7289. DATA "enfile ses plus beaux habits."
  7290. DATA "Il monte en haut de la Tour Eiffel, et saute."
  7291. DATA "Le corps s'ecrase, suivi plusieurs secondes"
  7292. DATA "apres de ses cheveux.|Pourquoi ?|"
  7293. DATA "R : parceque Petrol Hane ralentit|la chute des cheveux...","*"
  7294. DATA "C'est un gars qui a une moumoute et|qui va chez le coiffeur"
  7295. DATA "La, rien a faire, les ciseaux|n'arrivent pas a couper les cheveux.|Pourquoi ?|"
  7296. DATA "R : parceque les faux tifs ne sont pas coupables","*"
  7297. DATA "Pourquoi les Somaliens ne prennent-|ils pas de medicament ?||R : C'est marque dessus :|"A prendre apres chaque repas","*"
  7298. DATA "Qu'est-ce qui est le plus|dur a manger dans|un legume ?||R : la chaise roulante","*"
  7299. DATA "Quel est le point commun entre|un myopathe et un spaghetti ?||R : Le spaghetti bouge quand|on le suce...","*"
  7300. DATA "Qu'est-ce qui est vert|et qui devient rouge|quand on appuie sur|un bouton ?||R : Une grenouille dans un mixer","*"
  7301. DATA "Qu'est-ce qui est vert|et qui pue au fond des bois ?||R : Un scout mort","*"
  7302. DATA "Qu'est-ce qui est rouge|et qui a plus de cervelle|que Kurt Cobain ?||R : Son plafond","*"
  7303. DATA "Qu'est-ce qui est petit, rouge,|et qui avance en faisant|beaucoup de bruit ?||R : Un bebe sucant des lames de rasoir","*"
  7304. 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.","*"
  7305. DATA "Qu'est-ce qu'une boite jaune a|l'exterieur et noire a l'interieur ?||R : Une R4 de la Poste","*"
  7306. DATA "Qu'y a-t-il de pire qu'un|bebe dans une poubelle ?||R : Un bebe dans deux poubelles","*"
  7307. DATA "Qu'est-ce qu'un combat|d'eunuques ?||R : c'est un combat sanglant","*"
  7308. DATA "C'est J.C. Vandame qui rentre|dans sa bagnole et qui|fout l'contact","*"
  7309. DATA "C'est Stallone qui va au|bal et qui se rend beau","*"
  7310. DATA "C'est un mec qui rentre|dans un cafe et PLOUF!","*"
  7311. DATA "C'est un sanglier qui|croise un cochon:|- Ca se passe bien pour|toi la chimiotherapie ?","*"
  7312. DATA "Vous connaissez l'histoire|de Paf le chien ?||C'est un chien qui traverse|l'autoroute et PAF le chien!","*"
  7313. DATA "Vous connaissez l'histoire|de Scroutch l'escargot ?||C'est un escargot qui passe|sous un rouleau compresseur|et SCROUTCH l'escargot!","*"
  7314. DATA "Vous connaissez l'histoire|de Zip le pingouin ?||C'est un pingouin qui se promene|sur la banquise et ZIP le pingouin!","*"
  7315. DATA "Vous connaissez l'histoire|de Flip-Flop la girafe ?||C'est un helicoptere qui fait du|rase-motte et FLIP-FLOP la girafe!","*"
  7316. DATA "Vous connaissez l'histoire|de Tiens la vieille ?||C'est une vieille qui se fait|frapper et TIENS la vieille!","*"
  7317. DATA "***"
  7318.