merci à comtois

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

merci à comtois

Message par hackotedelaplaque »

salut comtois, juste un message pour te remercier pour tes explications d'il y a quelques temps sur les datasections.
J'aurai pu faire un message privé mais je lance un post car j'aurai d'autres questions sur ce thème.

En fait voilà, j'ai eu l'idée de créer un "style" en PureBasic (toute modestie à part s'entend !) : le "no ressources" ou le "PureCode" (pas décidé le nom encore :wink: ).

je vous explique le principe : crée de A à Z des jeux sans ressources mais uniquement avec du code.
Et dans cette optique vive les Datasections !!!! (et merci COmtois).
En fait je dessine mes Sprites avec des DataSections ou une donnée représente une couleur de Pixel.
J'ai débutté un remake du premier Mario, je vous fournirai le code ici même quand il sera un peu plus jouable (il est animé mais c'est tout pour l'instant). Mario était simple à réaliser car les sprites font 16*16 pixels de 4 couleurs seulement.

ma question vient du son : jusque là j'utilisais la fonction Beep de la winApi (pratique au bureau où je n'ai pas de carte son !!!) mais c'est assez moche comme son et fastidieux à coder (et tant qu'à faire je voudrais une vraie mélodie).
Peut on programmer du son sans ressources ?
Le format midi par exemple n'est il pas du code ascii ???

Je sais que vous devez trouver l'idée très bête mais ce qui m'interesse dans la programmation c'est uniquement le code, le traitement graphique m'a tjs gonflé.
Et pis j'adore les tout petits exe, et je pourrai publier mon code directement compilable ici sur le forum !!!!

Si quelqu'un veut adhérer à la" wave No_ressources" (là je deviens mégalo :lol: ) on pourrait bosser sur un projet en commun ?
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour le code midi en fait c'est assez simple

d'abord le canal (entre 0 et 15)
il y a des "trains" de 3 codes qui se suivent
dans chaque train (de trois wagon) tu as le code Prg change (qui donne le numero de l'instrument (il y en a 125 en general midi)
puis le code representant la note proprement dite puis en dernier
la force avec laquelle la touche a ete apuiyée (ce qui revient au volume
de la note ..) (pas de l'instrument car par dessus ses 3 codes de base
(qui peuvent suffire pour ecrire une melodie ) se rajoute des code de control
(volume general , effet midi (reverbe,ect ...)

il y a eu un post sur le forum a ce sujet avec exemple en pure
mais je sai plus qui l'avait ecrit !!! fait une recherche .. (regarde aussi dans le musee..) :D

si ça y est c'est ERIX14 voici son exemple !!

Code : Tout sélectionner

;*******************************************************************************************
;                   Numéro Instrument entre 0 et 127
;                   Numéro du canal entre 0 et 15
;                   Note de musique entre 0 et 127
;
;                             Do        Do#       Ré        Ré#       Mi        Fa        Fa#       Sol       Sol#      La        La#       Si
;     Octave -2         0           1            2          3            4          5          6            7         8           9           10       11
;     Octave -1         12         13          14        15          16        17        18          19       20         21         22       23
;     Octave  0         24          25          26        27          28        29        30          31       32        33         34        35
;     Octave  1         36          37          38        39          40        41        42          43       44        45         46        47
;     Octave  2         48          49          50        51          52        53        54          55       56        57         58        59
;     Octave  3         60          61          62        63          64        65        66          67       68        69         70        71
;     Octave  4         72          73          74        75          76        77        78          79       80        81         82         83
;     Octave  5         84          85          86        87          88        89        90          91        92       93         94         95 
;     Octave  6         96          97          98        99          100      101      102        103      104     105       106       107
;     Octave  7         108        109       110      111         112      113      114        115      116      117      118       119
;     Octave  8         120        121       122      123         124       125     126        127
;
;                   Vélocité avec laquelle la touche ( Note )  a été enfoncée ( entre 0 et 127 ) ou  relâchée
;
;***********************************************************************************************
Global m_hMidiOut.l                   ; handle du périphérique de sortie MIDI
Global m_MIDIOpen.b               ; 1 = périphérique de sortie MIDI ouvert      0 = non ouvert
Dim NomInstrument.s(127)
NomInstrument(0) = "Piano à queue"
NomInstrument(1) = "Piano"
NomInstrument(2) = "Electric grand piano"
NomInstrument(3) = "Honky-Tonk"
NomInstrument(4) = "Electric Piano 1"
NomInstrument(5) = "Electric Piano 2"
NomInstrument(6) = "Harpsichord"
NomInstrument(7) = "Clavinet"
NomInstrument(8) = "Celesta"
NomInstrument(9) = "Glockenspiel"
NomInstrument(10) = "Music Box"
NomInstrument(11) = "Vibraphone"
NomInstrument(12) = "Marimba"
NomInstrument(13) = "Xylophone"
NomInstrument(14) = "Tubular Bells"
NomInstrument(15) = "Dulcimer"
NomInstrument(16) = "Drawbar Organ"
NomInstrument(17) = "Percussive Organ"
NomInstrument(18) = "Rock Organ"
NomInstrument(19) = "Chuch Organ"
NomInstrument(20) = "Reed Organ"
NomInstrument(21) = "Accordion"
NomInstrument(22) = "Harmonica"
NomInstrument(23) = "Tango Accordion"
NomInstrument(24) = "Acoustic Guitar (Nylon)"
NomInstrument(25) = "Acoustic Guitar (Acier)"
NomInstrument(26) = "Electric Guitar"
NomInstrument(27) = "Electric Guitar (Clean)"
NomInstrument(28) = "Electric Guitar (Muted)"
NomInstrument(29) = "Overdriven Guitar"
NomInstrument(30) = "Distortion Guitar"
NomInstrument(31) = "Guitar harmonics"
NomInstrument(32) = "Acoustic Bass"
NomInstrument(33) = "Electric Bass"
NomInstrument(34) = "Electric Bass (Finger)"
NomInstrument(35) = "Fretless Bass"
NomInstrument(36) = "Slap Bass 1"
NomInstrument(37) = "Slap Bass 2"
NomInstrument(38) = "Synth Bass 1"
NomInstrument(39) = "Synth Bass 2"
NomInstrument(40) = "Violon"
NomInstrument(41) = "Viola"
NomInstrument(42) = "Cello"
NomInstrument(43) = "Contrebass"
NomInstrument(44) = "Tremolo Strings"
NomInstrument(45) = "Pizzicato Strings"
NomInstrument(46) = "Orchestral Harp"
NomInstrument(47) = "Timpani"
NomInstrument(48) = "String Ensemble 1"
NomInstrument(49) = "String Ensemble 2"
NomInstrument(50) = "SynthString 1"
NomInstrument(51) = "SynthString 2"
NomInstrument(52) = "Choir Aahs"
NomInstrument(53) = "Voice Oohs"
NomInstrument(54) = "Synth Voice"
NomInstrument(55) = "Orchestra Hit"
NomInstrument(56) = "Trumpet"
NomInstrument(57) = "Trombone"
NomInstrument(58) = "Tuba"
NomInstrument(59) = "Muted Trumpet"
NomInstrument(60) = "French Horn"
NomInstrument(61) = "Brass Section"
NomInstrument(62) = "SynthBass 1"
NomInstrument(63) = "SynthBass 2"
NomInstrument(64) = "Soprano Sax"
NomInstrument(65) = "Alto Sax"
NomInstrument(66) = "Tenor Sax"
NomInstrument(67) = "Bartone Sax"
NomInstrument(68) = "Oboe"
NomInstrument(69) = "English Horn"
NomInstrument(70) = "Bassoon"
NomInstrument(71) = "Clarinet"
NomInstrument(72) = "Piccolo"
NomInstrument(73) = "Flute"
NomInstrument(74) = "Recorder"
NomInstrument(75) = "Pan Flute"
NomInstrument(76) = "Blown Bottle"
NomInstrument(77) = "Shakuhachi"
NomInstrument(78) = "Whistle"
NomInstrument(79) = "Ocarina"
NomInstrument(80) = "Square"
NomInstrument(81) = "Sawtooth"
NomInstrument(82) = "Calliop"
NomInstrument(83) = "Chiff"
NomInstrument(84) = "Charang"
NomInstrument(85) = "Voice"
NomInstrument(86) = "Fifths"
NomInstrument(87) = "Bass + Lead"
NomInstrument(88) = "New Age"
NomInstrument(89) = "Warm"
NomInstrument(90) = "Polysynth"
NomInstrument(91) = "Choir"
NomInstrument(92) = "Bowed"
NomInstrument(93) = "Metallic"
NomInstrument(94) = "Halo"
NomInstrument(95) = "Sweep"
NomInstrument(96) = "Rain"
NomInstrument(97) = "Soundtrack"
NomInstrument(98) = "Crystal"
NomInstrument(99) = "Atmosphere"
NomInstrument(100) = "Brightness"
NomInstrument(101) = "Goblins"
NomInstrument(102) = "Echoes"
NomInstrument(103) = "Sci-Fi"
NomInstrument(104) = "Sitar Ethnik"
NomInstrument(105) = "Banjo"
NomInstrument(106) = "Shamisen"
NomInstrument(107) = "Koto"
NomInstrument(108) = "Kalimba"
NomInstrument(109) = "Bag Pipe"
NomInstrument(110) = "Fiddle"
NomInstrument(111) = "Shanai"
NomInstrument(112) = "Tinkle Bell"
NomInstrument(113) = "Agogo"
NomInstrument(114) = "Steel Drums"
NomInstrument(115) = "Woodblock"
NomInstrument(116) = "Taiko Drum"
NomInstrument(117) = "Melodic Tom"
NomInstrument(118) = "Synth Drum"
NomInstrument(119) = "Reverse Cymbal"
NomInstrument(120) = "Guitar Fret. Noise"
NomInstrument(121) = "Breath Noise"
NomInstrument(122) = "Seashore"
NomInstrument(123) = "Bird Tweet"
NomInstrument(124) = "Telephone Ring"
NomInstrument(125) = "Helicopter"
NomInstrument(126) = "Applause"
NomInstrument(127) = "Gun Shot"
;-----------------------------------------------------------------------------------------------------------
Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
        dwFlags.l = nStatus | nCanal | (nData1 << 8) | (nData2 << 16)
        temp.l = midiOutShortMsg_(m_hMidiOut,dwFlags);
        If temp<>0
                     MessageRequester("Problème", "Erreur dans l'envoi du message MIDI",0)
          EndIf
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure MIDIOpen()
          If m_MIDIOpen = 0
                    If midiOutOpen_(@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0
                               MessageRequester("Problème", "Impossible d'ouvrir le périphérique MIDI",0)
                    Else
                              SendMIDIMessage($c0,0,0,0)
                              m_MIDIOpen = 1
                    EndIf
          EndIf
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
          If m_MIDIOpen = 0
                    MIDIOpen()
          EndIf
          If m_MIDIOpen = 1
                    SendMIDIMessage($80 | Canal,0,Note,VelociteDown)
                    SendMIDIMessage($90 | Canal,0,Note,VelociteUp)
          EndIf         
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure ChargeInstrument(Canal.b,Instrument.b)
          If m_MIDIOpen = 0
                    MIDIOpen()
          EndIf
          If m_MIDIOpen = 1
                    SendMIDIMessage($c0 | Canal,0,Instrument,0)
          EndIf         
EndProcedure
;-----------------------------------------------------------------------------------------------------------

;         Et voici un exemple

ChargeInstrument(0,0)
ChargeInstrument(1,55)
For t.l = 1 To 100
          PlayNoteMIDI(0,Random(60)+50,127,127)
          PlayNoteMIDI(1,Random(60)+50,127,127)
          Delay(300)
Next
ZapMan
Messages : 393
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Si quelqu'un veut adhérer à la" wave No_ressources" (là je deviens mégalo) on pourrait bosser sur un projet en commun ?
Ecrire une petite routine qui code sous forme de datas n'importe quel fichier (et donc n'importe quelle ressource) est assez simple à réaliser et permet (il me semble) de répondre à ton soucis. C'est vrai que c'est sympa d'avoir l'intégralité du programme (y compris, donc, les ressources) dans un fichier texte facile à trimballer. C'est juste embétant si tu veux par la suite modifier tes ressources. Il faudrait donc aussi écrire un petit programme qui permet de récupérer sous forme de fichier ce qui a été codé en datas. Pour faciliter cet aller-retour, le programme qui met les fichiers sous forme de datas devrait aussi enregistrer dans le code généré les infos concernant :
- le nom et le type du fichier original
- la date du codage (au cas ou) ?
- l'emplacement du fichier original ?
- peut-être autre chose (à réfléchir) ?
Rien de bien compliqué là-dedans, non ? Ton idée est sympa, en tout cas.
Dernière modification par ZapMan le jeu. 13/mai/2004 10:52, modifié 1 fois.
Tout obstacle est un point d'appui potentiel.
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Merci dobro pour l'explication du fonctionnement du format midi et le source donné en exemple. Je vais me pencher dessus, mais je me demande si la gestion du son par le speaker n'est pas plus sympa.
En effet, pas besoin de carte son donc compatibilité accrue et un côté kitchissime pas désagréable.

Mais peut-on vraiment coder une musique entièrement avec la fonction Beep ?
Existe t il une autre façon plus pratique de gérer le speaker interne de la carte mère ?
Ca me rappelle le long listing que tous les utilisateurs d' amstrad cpc 6128 avaient tapé et qui jouait du jean michel jarre !!!

Pour les graphismes tu m'as pas compris zapman, je ne "traduis" pas une image en code, je le tape directemment . En fait j'ai zoomé à bloc un sprite, appliqué une grille par dessus et entré toutes les valeurs dans des datasections.

Une question à ce sujet : comme mes sprites sont petits (16*16) je voudrais utilisé la fonction zoomsprite3d().
Or je crée d'abord un sprite vide, je dessine dessus mais quand je crée ensuite mon sprite 3d à partir du sprité original le sprite3d est blanc.
D'où vient le problème ? une idée ?

Et merci pour vos conseils et encouragements ! :D
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Répondre