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é
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 minBonsoir
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 minNiveau 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 minAvantage 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 minQue des bonnes nouvelles
)
et je ne regarde pas trop les vidéos (le wimax ‘est parfois merdique
Publié par jean-paul rouzé | 11 février 2012, 19 h 10 minSalut ,
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 minCool, mais probléme … le firmware MMbasic 3.1 actuel n’est pas 100% compatible Duinomite-mega (?)
cf: http://www.olimex.com/dev/duinomite-mm-firmware.html
Les 3 nouvelles fonctionnalités: EDIT, n° de ligne optionnel, routines nommées, keymap modifiable du clavier, etc … c’est vraiment trés intéréssant … mais voila pour le moment il semble ne pas y avoir de support complet pour les GPIO, le SPI software, etc …
Publié par skywodd | 14 février 2012, 20 h 15 minMille fois d’accord avec toi !
. La tentation devant le succès ne serait-il pas de se faire de l’argent ?
De plus il y a un truc que je ne comprends pas, la licence était GNU GPL 3, revenir en arrière me semble difficile si je lis : http://www.gnu.org/licenses/quick-guide-gplv3.fr.html n’importe qui peut donc reprendre le projet au point ou en est et en faire un fork. Ça ressemble en effet beaucoup à se tirer une balle dans le pied
Publié par jean-paul rouzé | 14 février 2012, 21 h 28 min@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 minMerci pour cet article.C’est tout ce que je peux dire.
Publié par animation 76 dj | 15 février 2012, 2 h 38 minWow, t’est sur Hackaday!
Publié par vl_ | 1 mars 2012, 0 h 23 minOuai j’ai vu, mais c’est pas la 1er fois
Publié par skywodd | 1 mars 2012, 8 h 03 min