Skyduino:~#
Articles
Autre, programmation, projet

[MMbasic] Lecteur de partition musical (Epik Win)

Bonjour tout le monde !

Aujourd’hui Skywodd a encore frappé !

Hier je vous présentai mon programme en MMbasic jouant fièrement la musique du nyan cat, et bien aujourd’hui je monte d’un cran et passe au niveau supérieur (level up ! :)) !

Je viens de finir de tester mon dernier programme en MMbasic, il s’agit d’un lecteur de partition autonome entièrement écrit par mes soins. Je m’attendais à rencontrer quelques difficultés avec le langage MMbasic mais non, mon prog a marché en seulement 2 essais !

Comme d’habitude je diffuse mon code sous licence libre, libre à vous de le customizer, de l’améliorer, etc ;)

Et pour ceux qui n’aurez pas (encore) de duinomite-mega voici une petite vidéo de démonstration :

Ps: Les partitions ne sont pas de moi je l’ai est récupéré ici : http://www.siteduzero.com/forum-83-350633-p1-delire-de-geek-faites-chanter-votre-pc.html
Il faut impérativement que les fichiers .txt des partitions soit avec des retours de lignes au format unix et ne contiennent aucun espaces en fin/debut de ligne.
Si vous êtes sous windows avec notepad++ il suffit de faire édition > convertir les le format de ligne > UNIX et édition > traitements des espaces > enlever les espaces en début et en fin de ligne.

J’ai mis quelques commentaires (en anglais, c’est plus simple pour moi quand je debug le code) pour expliquer le fonctionnement général.

1 CLS ' Clear screen
2 PRINT "- 1 bit Music Player -" ' welcome msg 
3 PRINT "Coded by SkyWodd (skyduino.wordpress.com)"
4 PRINT "Enjoy !"
5 PRINT " "
6 PRINT "Choose a file to open :" ' prompt user
7 LINE INPUT fileName$ ' read user reply
8 PRINT "Loading ..."
9 DIM freqTable(12,9) ' Instanciate frequency table
10 DATA 16, 33, 65, 131, 262, 523, 1046, 2093, 4186 ' Storing frequency value
11 DATA 17, 35, 69, 139, 277, 554, 1109, 2217, 4435 ' Note: Octave 0 will not work
12 DATA 18, 37, 73, 147, 294, 587, 1175, 2349, 4699
13 DATA 19, 39, 78, 155, 311, 622, 1244, 2489, 4978
14 DATA 21, 41, 82, 165, 330, 659, 1328, 2637, 5274
15 DATA 22, 44, 87, 175, 349, 698, 1397, 2794, 5588
16 DATA 23, 46, 92, 185, 370, 740, 1480, 2960, 5920
17 DATA 24, 49, 98, 196, 392, 784, 1568, 3136, 6271
18 DATA 26, 52, 104, 208, 415, 831, 1661, 3322, 6645
19 DATA 27, 55, 110, 220, 440, 880, 1760, 3520, 7040
20 DATA 29, 58, 116, 233, 466, 932, 1865, 3729, 7459
21 DATA 31, 62, 123, 245, 494, 988, 1975, 3951, 7902
22 FOR I=1 TO 12 ' Populate freqTable
23 FOR J=1 TO 9
24 READ freqTable(I, J)
25 NEXT J
26 NEXT I
27 tempo=250 ' Set default value
28 duration=250
29 octave=0
30 frequence=0
31 argv1$="" ' Arguments table
32 argv2$=""
33 argv3$=""
34 argc=0
35 OPEN fileName$ FOR INPUT AS #1 ' Open music file
36 PRINT "Start playing ..."
37 DO WHILE NOT EOF(#1) ' Loop until EOF
38 LINE INPUT #1, line$ ' Get line from file
39 IF line$ = "" THEN GOTO 101 ' Skip empty line
40 GOSUB 106 ' Call spliting routine
41 IF argv1$ = "TEMPO" THEN ' Check for tempo
42 tempo=VAL(argv2$) ' Set tempo
43 GOTO 101
44 ENDIF
45 IF argc >= 2 THEN octave=VAL(argv2$) ' Set octave if required
46 IF argc = 3 THEN GOSUB 131 ' Set duration if required
47 IF argv1$ = "DO" THEN ' Check for DO
48 frequence=freqTable(1,octave)
49 GOTO 99 ' GOTO SOUND
50 ENDIF
51 IF argv1$ = "DO_" THEN ' Check for DO#
52 frequence=freqTable(2,octave)
53 GOTO 99 ' GOTO SOUND
54 ENDIF
55 IF argv1$ = "RE" THEN ' Check for RE
56 frequence=freqTable(3,octave)
57 GOTO 99 ' GOTO SOUND
58 ENDIF
59 IF argv1$ = "RE_" THEN ' Check for RE#
60 frequence=freqTable(4,octave)
61 GOTO 99 ' GOTO SOUND
62 ENDIF
63 IF argv1$ = "MI" THEN ' Check for MI
64 frequence=freqTable(5,octave)
65 GOTO 99 ' GOTO SOUND
66 ENDIF
67 IF argv1$ = "FA" THEN ' Check for FA
68 frequence=freqTable(6,octave)
69 GOTO 99 ' GOTO SOUND
70 ENDIF
71 IF argv1$ = "FA_" THEN ' Check for FA#
72 frequence=freqTable(7,octave)
73 GOTO 99 ' GOTO SOUND
74 ENDIF
75 IF argv1$ = "SOL" THEN ' Check for SOL
76 frequence=freqTable(8,octave)
77 GOTO 99 ' GOTO SOUND
78 ENDIF
79 IF argv1$ = "SOL_" THEN ' Check for SOL#
80 frequence=freqTable(9,octave)
81 GOTO 99 ' GOTO SOUND
82 ENDIF
83 IF argv1$ = "LA" THEN ' Check for LA
84 frequence=freqTable(10,octave)
85 GOTO 99 ' GOTO SOUND
86 ENDIF
87 IF argv1$ = "LA_" THEN ' Check for LA#
88 frequence=freqTable(11,octave)
89 GOTO 99 ' GOTO SOUND
90 ENDIF
91 IF argv1$ = "SI" THEN ' Check for SI
92 frequence=freqTable(12,octave)
93 GOTO 99 ' GOTO SOUND
94 ENDIF
95 IF argv1$ = "_" THEN ' Check for silence
96 PAUSE duration ' Pause 
97 GOTO 101 ' Next note
98 ENDIF
99 SOUND frequence, duration ' Play note
100 PAUSE duration ' pause
101 LOOP ' Next note
102 CLOSE #1 ' Close file
103 PRINT "... Finish !" 
104 END ' End of program
105 ' String spliting routine
106 PRINT line$
107 length=LEN(line$)
108 space1=INSTR(line$, " ") 
109 IF space1 <> 0 THEN ' Note: spaces at EOL MUST be deleted
110 argv1$=LEFT$(line$, space1-1)
111 argv2$=""
112 argv3$=""
113 argc=1
114 space2=INSTR(space1+1,line$, " ")
115 IF space2 <> 0 THEN
116 argv2$=MID$(line$, space1+1, space2-space1-1)
117 argv3$=RIGHT$(line$, length-space2)
118 argc=3
119 ELSE
120 argv2$=RIGHT$(line$, length-space1)
121 argc=2
122 ENDIF
123 ELSE
124 argv1$=line$
125 argv2$=""
126 argv3$=""
127 argc=1
128 ENDIF
129 RETURN
130 ' Division spliting routine
131 slash=INSTR(argv3$, "/")
132 IF slash <> 0 THEN
133 length=LEN(argv3$)
134 quotient=VAL(LEFT$(argv3$, slash - 1)) ' Get quotient
135 diviser=VAL(RIGHT$(argv3$, length-slash)) ' Get diviser
136 duration=INT(tempo*((quotient*1.0)/diviser)) ' Force float calculation
137 ELSE
138 duration=INT(tempo*VAL(argv3$))
139 ENDIF
140 RETURN

Petite astuce du chef :
Pour ajouter automatiquement les numéros de ligne à votre programme :
nl -n rz -s " " -w1 fichiersansnumero.bas > fichieravecnumero.bas
(Sous windows il faut avoir installé minGW pour avoir accées à cette commande ;))

Je trouve l’expérience « duinomite » vraiment enrichissante !
Je suis en train d’écrire l’article de test de la duinomite-mega, je verrai quand est ce que je pourrait le publier en tout cas je prend vraiment mon pied à coder en MMbasic !
Mais je n’en oubli pas pour autant mes autres projets, ainsi que les tutoriels, test, etc … déja planifié ;)

About these ads

Discussion

14 réflexions sur “[MMbasic] Lecteur de partition musical (Epik Win)

  1. Superbe boulot skywodd :)

    Cette petite carte a effectivement l’air géniale, mais elle ne m’intéresse pas pour l’instant :)

    Publié par schizophrene | 4 février 2012, 20 h 35 min
  2. Bonsoir

    En quoi la Duinomite te séduit-elle particulièrement ?

    Est-ce que MMBasic est supérieur aux autres Basic déjà dispo sur PIC/AVR/ARM/etc (genre BasicStamp ou autre Basic open-source) ?

    Est-ce plutôt l’idée de la solution autonome (clavier/écran) ?

    Comme je le disait l’autre jour, çà me rappelle les machines Basic du début des années 80 (TRS-80, Sinclair, Oric…)

    A+

    Publié par Barbudor | 6 février 2012, 0 h 48 min
    • Niveau perf si on compare la duinomite à un basic stamp ou à un cubloc c’est aussi rapide.

      Ce qui m’as séduit dans la duinomite c’est l’idée de pouvoir éditer/exécuter son code depuis la carte sd sans ordi, juste avec un clavier et un écran. Ça fait vraiment « mini ordinateur » et j’aime beaucoup.

      Publié par skywodd | 6 février 2012, 12 h 35 min
  3. Avantage au on peut utiliser mplab, penguino… pour la programmer.
    J’ai reçu la mienne hier (même fournisseur que notre hôte) bon, j’ai fait une connerie, j’ai pris une mega, mais j’ai pris aussi l’adaptateur E/S et shield arduino, inutiles avec la mega, ils serviront si j’achète une « normale » ;)

    pour la nostalgie : le TRS80 a été pour moi une rolls, j’ai commencé en 77 avec un kit motorola MKD2 :)

    En fait, j’achète plein de matos et je n’en fais pas grand chose :( (manque de courage )
    Dommage qu’il lui manque une connexion ethernet, elle aurait été parfaite (j’ai vu chez olimex un hack de carte, mais bof)
    Je crois que je vais en faire une sorte de coordinateur récoltant les infos de différents matos (nombreuses interface) et fournissant à la fois une interface humaine et la transmission d’ordres aux « esclaves ». Je vais accrocher la carte au dos d’un moniteur lcd 17″ qui traine ici et piquer l’alim sur celui-ci.

    Un truc marqué nul part ou presque : le clavier à brancher est un qwerty ;)

    Et merci pour ton blog.

    Publié par Jean-Paul Rouzé | 11 février 2012, 11 h 36 min
    • >> J’ai reçu la mienne hier (même fournisseur que notre hôte) bon, j’ai fait une connerie, j’ai pris une mega, mais
      >> j’ai pris aussi l’adaptateur E/S et shield arduino, inutiles avec la mega, ils serviront si j’achète une “normale”
      L’adaptateur shield est utilisable même avec la mega je crois.

      >> Dommage qu’il lui manque une connexion ethernet, elle aurait été parfaite (j’ai vu chez olimex un hack de carte, mais bof)
      La duinomite-Emega sortira d’ici quelques semaines, elle aura les mêmes fonctionnalités que la mega normale mais avec l’ethernet, de la mémoire flash embarqué, etc …

      http://www.olimex.com/dev/duinomite-emega.html

      >> Un truc marqué nul part ou presque : le clavier à brancher est un qwerty
      Je l’avais précisé dans ma 1er vidéo (le nyan cat musical).
      J’ai planifié un test complet de la carte pour le milieu de la semaine prochaine ;)

      Publié par skywodd | 11 février 2012, 14 h 12 min
  4. Salut ,
    j’ai intégré les claviers FR,GR et IT dans la v3.1 du MM Basic , c’est dispo sur le site du MM.
    Donc , plus besoin de chercher les touches sur le clavier ;)
    En plus tu pourra enlever les numéros de ligne !

    @++

    Fabrice.

    Publié par Fabrice | 14 février 2012, 17 h 17 min
  5. @jean-paul rouzé: Je sait pas si il veut « rentabiliser » son code, mais le passage GNU GPL vers proprio ne va pas résoudre ses problémes de fragmentation de syntaxe, et encore moins lui rapporter de l’argent.

    Publié par skywodd | 14 février 2012, 21 h 54 min
  6. Merci pour cet article.C’est tout ce que je peux dire.

    Publié par animation 76 dj | 15 février 2012, 2 h 38 min
  7. Wow, t’est sur Hackaday!

    Publié par vl_ | 1 mars 2012, 0 h 23 min

Rétroliens/Pings

  1. Pingback: Hackaday Links: Leap Day, 2012 - Hack a Day - 29 février 2012

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Archives

Wow. Dogecoin. Amaze.

Laissez un tip en Dogecoin

DMMNFk6WBVTpx2Wu1Z35GL61QXSd6r6WQx

Suivre

Recevez les nouvelles publications par mail.

Rejoignez 769 autres abonnés