Jouer de la musique sur 1 bit

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Carl, Papy.G, fneck

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Jouer de la musique sur 1 bit

Message par Daniel » 21 mars 2013 15:25

Beaucoup d'ordinateurs du début des années 80 n'ont qu'un buzzer pour la sortie son, comme le PC, l'Alice, le VG5000, le MO5 et bien d'autres.

On peut toutefois jouer sur 1 bit des sons complexes, grâce à la technique PWM (Pulse Width Modulation). Le principe est très simple :
- Une porteuse rectangulaire de fréquence inaudible (supérieure à 19000 Hz)
- Modification du rapport cyclique (rapport entre la période des créneaux positifs et des créneaux négatifs) proportionnelle à l'échantillon à jouer.

J'ai voulu tester ce concept, voici un premier jet du programme pour MO5 : http://dcmoto.free.fr/sons/son1bit.zip
Le code n'est peut-être pas très clair car optimisé pour être rapide et court, mais si vous l'étudiez attentivement vous verrez que c'est très simple à programmer. Avec ces optimisations, on arrive à jouer des échantillons 3 bits à 22050 Hz. Il doit être difficile de faire beaucoup mieux. Peut-être 24000 Hz en rusant un peu...

Pour lancer l'application, chargez la cassette dans le MO5 et tapez RUN"
Ce n'est pas un produit fini, juste un test pour montrer la faisabilité. On ne peut même pas arrêter le programme quand il a commencé à jouer.

Image Image

Code : Tout sélectionner

                      /**************************************************\
                      *                 S O N 1 B I T                    * 
                      *           (c) 2013 - Daniel Coulom               *  
                      *           http://dcmoto.free.fr/                 *
                      *           http://forum.system-cfg.com/           *
                      *--------------------------------------------------*
                      * Ce code est distribue gratuitement dans l'espoir *
                      * qu'il sera utile, mais sans aucune  garantie  et *
                      * sans  engager  la  responsabilité  de  l'auteur. *
                      * Vous  pouvez  l' utiliser,  le  modifier  et  le *
                      * diffuser librement, en conservant cette  licence *
                      * et les références de l'auteur dans   toutes  les *
                      * copies. L'exploitation commerciale est interdite.*
                      \**************************************************/
 
                      * Ce programme joue des echantillons 3 bits 22050 Hz
                      * en les convertissant en signal tout ou rien 1 bit
                      * par modulation de largeur d'impulsion (PWM).
                      * Le fichier audio contient un echantillon par octet
                      * L'echantillon est place dans les bits b3, b2 et b1  
 
                      /**************************************************\
                      *                Version 2013.03.20                *
                      \**************************************************/
                      * Historique
                      * 2013.03.20 premiere version operationnelle
 
                            ORG   $9F00 
                            
                      *------------------------------------------------------
                      * INITIALISATIONS
                      *------------------------------------------------------
                      INIT       
 9F00 347E                  PSHS  U,Y,X,DP,B,A  empile les registres utilises
 9F02 1AD0                  ORCC  #$D0          desactive les interruptions
 9F04 86A7                  LDA   #$A7          valeur pour DP
 9F06 1F8B                  TFR   A,DP          initialisation DP
 9F08 D6C1                  LDB   <$C1          valeur port B du PIA systeme
 9F0A CA01                  ORB   #$01          set buzzer bit
 9F0C 108E9F90              LDY   #PLAYX        adresse des generateurs PWM
 
                      *------------------------------------------------------
                      * BOUCLE DE LECTURE DU SON
                      *------------------------------------------------------
                      PLAYA
 9F10 8E6000                LDX   #$6000        adresse du buffer son
 9F13 7E9FA0                JMP   PLAYZ         acquisition d'un echantillon
                      PLAY0
 9F16 D7C1                  STB   <$C1          set buzzer bit
 9F18 0AC1                  DEC   <$C1          clear buzzer bit
 9F1A 8D72                  BSR   PLAY8         temporisation 14 cycles
 9F1C 8C9000                CMPX  #$9000        test de fin
 9F1F 267F                  BNE   PLAYZ         echantillon suivant
 9F21 20ED                  BRA   PLAYA         recommencer
                      PLAY1
 9F23 D7C1                  STB   <$C1          set buzzer bit
 9F25 12                    NOP                 temporisation 2 cycles
 9F26 0AC1                  DEC   <$C1          clear buzzer bit
 9F28 8D65                  BSR   PLAY9         temporisation 12 cycles
 9F2A 8C9000                CMPX  #$9000        test de fin
 9F2D 2671                  BNE   PLAYZ         echantillon suivant
 9F2F 20DF                  BRA   PLAYA         recommencer
                      PLAY2
 9F31 D7C1                  STB   <$C1          set buzzer bit
 9F33 D100                  CMPB  <$00          temporisation 4 cycles
 9F35 0AC1                  DEC   <$C1          clear buzzer bit
 9F37 9C00                  CMPX  <$00          temporisation 6 cycles
 9F39 D100                  CMPB  <$00          temporisation 4 cycles
 9F3B 8C9000                CMPX  #$9000        test de fin
 9F3E 2660                  BNE   PLAYZ         echantillon suivant
 9F40 20CE                  BRA   PLAYA         recommencer
                      PLAY3
 9F42 D7C1                  STB   <$C1          set buzzer bit
 9F44 9C00                  CMPX  <$00          temporisation 6 cycles
 9F46 0AC1                  DEC   <$C1          clear buzzer bit
 9F48 9C00                  CMPX  <$00          temporisation 6 cycles
 9F4A 12                    NOP                 temporisation 2 cycles
 9F4B 8C9000                CMPX  #$9000        test de fin
 9F4E 2650                  BNE   PLAYZ         echantillon suivant
 9F50 20BE                  BRA   PLAYA         recommencer
                      PLAY4
 9F52 D7C1                  STB   <$C1          set buzzer bit
 9F54 9C00                  CMPX  <$00          temporisation 6 cycles
 9F56 12                    NOP                 temporisation 2 cycles
 9F57 0AC1                  DEC   <$C1          clear buzzer bit
 9F59 9C00                  CMPX  <$00          temporisation 6 cycles
 9F5B 8C9000                CMPX  #$9000        test de fin
 9F5E 2640                  BNE   PLAYZ         echantillon suivant
 9F60 20AE                  BRA   PLAYA         recommencer
                      PLAY5
 9F62 D7C1                  STB   <$C1          set buzzer bit
 9F64 9C00                  CMPX  <$00          temporisation 6 cycles
 9F66 D100                  CMPB  <$00          temporisation 4 cycles
 9F68 0AC1                  DEC   <$C1          clear buzzer bit
 9F6A D100                  CMPB  <$00          temporisation 4 cycles
 9F6C 8C9000                CMPX  #$9000        test de fin
 9F6F 262F                  BNE   PLAYZ         echantillon suivant
 9F71 209D                  BRA   PLAYA         recommencer
                      PLAY6
 9F73 D7C1                  STB   <$C1          set buzzer bit
 9F75 8D18                  BSR   PLAY9         temporisation 12 cycles
 9F77 0AC1                  DEC   <$C1          clear buzzer bit
 9F79 12                    NOP                 temporisation 2 cycles
 9F7A 8C9000                CMPX  #$9000        test de fin
 9F7D 2621                  BNE   PLAYZ         echantillon suivant
 9F7F 208F                  BRA   PLAYA         recommencer
                      PLAY7
 9F81 D7C1                  STB   <$C1          set buzzer bit
 9F83 8D09                  BSR   PLAY8         temporisation 14 cycles
 9F85 0AC1                  DEC   <$C1          clear buzzer bit
 9F87 8C9000                CMPX  #$9000        test de fin
 9F8A 2614                  BNE   PLAYZ         echantillon suivant
 9F8C 2082                  BRA   PLAYA         recommencer
                      PLAY8
 9F8E 12                    NOP                 temporisation 2 cycles
                      PLAY9
 9F8F 39                    RTS                 temporisation 5 cycles
                      PLAYX
 9F90 2084                  BRA   PLAY0         jouer echantillon 0
 9F92 208F                  BRA   PLAY1         jouer echantillon 1
 9F94 209B                  BRA   PLAY2         jouer echantillon 2
 9F96 20AA                  BRA   PLAY3         jouer echantillon 3
 9F98 20B8                  BRA   PLAY4         jouer echantillon 4
 9F9A 20C6                  BRA   PLAY5         jouer echantillon 5
 9F9C 20D5                  BRA   PLAY6         jouer echantillon 6
 9F9E 20E1                  BRA   PLAY7         jouer echantillon 7
                      PLAYZ
 9FA0 A680                  LDA   ,X+           nouvel echantillon
 9FA2 840E                  ANDA  #$0E          raz bit 0 non significatif
 9FA4 6EA6                  JMP   A,Y           jouer l'echantillon
                          
                      *------------------------------------------------------
                      * RETOUR AU BASIC
                      *------------------------------------------------------
                      RETOUR
 9FA6 35FE                  PULS  A,B,DP,X,Y,U,PC retour au Basic
                                   
                            END

SYMBOL TABLE
      INIT 02 9F00     PLAY0 02 9F16     PLAY1 02 9F23     PLAY2 02 9F31
     PLAY3 02 9F42     PLAY4 02 9F52     PLAY5 02 9F62     PLAY6 02 9F73
     PLAY7 02 9F81     PLAY8 02 9F8E     PLAY9 02 9F8F     PLAYA 02 9F10
     PLAYX 02 9F90     PLAYZ 02 9FA0    RETOUR 02 9FA6
15 SYMBOLS

0 error(s), 0 warning(s)
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
gilles
Messages : 1632
Enregistré le : 07 août 2008 13:44
Localisation : Nantes
Contact :

Re: Jouer de la musique sur 1 bit

Message par gilles » 21 mars 2013 20:18

le ANDA #$0E
n'est pas nécessaire si le sample est déjà dans le bon format, à la limite convertir le buffer avant de le jouer.

sinon le CMPX #$9000 me parait coûteux, en mettant le sample en sens inverse il est peut être possible de faire directement un BZ après le décrément mais dans ce cas l'adressage indexé (quelquechose comme LDA $6000,X- ?) risque de faire perdre ce qui a été gagné là...

Sur TO8/9+ il est possible de mettre le sample en ram en espace de rom (et en sens inverse) pour le faire aller de 0x3FFF à 0x0000, dans ce cas l'adressage indexé reste LDA ,X- et on a gagné le CMPX. Sur MO5 il faut mettre en VRAM pour faire de même mais le sample sera plus petit.

mais je ne sais pas si ca nous amène à 24KHz.

je me demande s'il n'est pas aussi possible de venir intercaler la lecture du sample suivant dans les différentes tempos, peut être juste l'increment de X.

petitjd
Messages : 1817
Enregistré le : 23 oct. 2007 11:50

Re: Jouer de la musique sur 1 bit

Message par petitjd » 21 mars 2013 20:41

Ca fait penser à un son de Super Mario :)
PetitJD
Tortue Jeulin: www.tortue-jeulin.com
Nanoreseau: www.nanoreseau.net
Proteus III: www.proteus-international.fr

Avatar du membre
fabrice93fr
Messages : 1691
Enregistré le : 11 août 2008 09:34

Re: Jouer de la musique sur 1 bit

Message par fabrice93fr » 21 mars 2013 21:33

Pfff déjà fait et tout un album :

http://www.dailymotion.com/video/x8u830 ... Utua1fotTw

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Jouer de la musique sur 1 bit

Message par Daniel » 21 mars 2013 21:42

C'est effectivement un son de super mario :lol:

Erreur 60 = Périphérique absent ou indisponible (le magnétophone n'est pas connecté).

Le ANDA #$0E est inutile en théorie, mais dans ce test le buffer est lu après la fin de fichier. S'il traine n'importe quoi en ram le programme se branche à une mauvaise adresse. C'est pourquoi j'ai mis provisoirement cette instruction. On pourra gagner 2 cycles dans la version définitive.

Pour le CMPX j'ai une autre idée, qui résoudrait aussi le problème précédent : mettre un échantillon spécial indiquant la fin de fichier, par exemple $FF, et le test pourrait alors être un BMI après le LDA ,X+

On peut aussi gagner des cycles en supprimant la batterie de BRA 0, 1, 2, 3, 4, 5, 6 ,7
Il faut mettre l'échantillon dans les bits 6, 5, 4 de l'octet pour que le JMP A,X se branche à des adresses espacées de 16 octets, les routines de traitement de chaque valeur de l'échantillon étant elles aussi espacées de 16 octets, ou dans les bits 7, 6, 5 avec des adresses espacées de 32 octets. On perd de la place mais on gagne 3 cycles. Il faut quand même vérifier que le code plus long ne nécessitera pas des branchements longs, auquel cas le gain risque de se transformer en perte.

Je n'ai pas fait le calcul, mais toutes ces optimisations doivent permettre d'approcher 24000 Hz. Actuellement j'ai 46 cycles, soit 21739 Hz. Avec 43 cycles c'est 23256 Hz, avec 42 cycles 23809 Hz. Reste à savoir si la différence sera audible.

Question qualité, j'ai l'impression d'entendre un sifflement parasite. Je me suis peut-être trompé quelque part dans le comptage des cycles, mais il est plus probable que la cause du problème soit dans la conversion de 16 bits / 44100 Hz vers 3 bits / 22050 Hz. Je sais qu'il y a des méthodes sophistiquées pour atténuer les effets secondaires indésirables de la transformation, mais d'une part elles ne sont pas parfaites, d'autre part je ne les connais pas. L'original dont je suis parti n'était pas irréprochable non plus, je pense qu'il a été enregistré avec des moyens analogiques.
Daniel
L'obstacle augmente mon ardeur.

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Jouer de la musique sur 1 bit

Message par Daniel » 21 mars 2013 22:17

Il existe certainement de très bons convertisseurs pour créer de la musique sur 1 bit dans Windows.

Je m'amuse beaucoup à le faire sur MO5 parce que c'est une sorte de sport où il faut gagner un par un quelques cycles de processeur et ruser en permanence pour contourner les difficultés. Le but n'est pas de produire de la musique, mais de relever un défi. Faire la même chose dans Windows est trivial et ne m'attire pas, je laisse ça aux spécialistes.

Les sons des démos de musique SDMOTO sont en 6 bits 5512 Hz. La plupart des logiciels audio permettent de faire la transformation à partir d'un original en 16 bits 44100 Hz, il n'est pas nécessaire d'écrire un programme. Là encore, l'intérêt n'est pas de produire de la musique en 6 bits 5512 Hz (entre nous, c'est franchement mauvais). Le défi est d'arriver à lire 5512 octets par seconde sur la carte SD, sans changer de rythme pendant le changement de buffer. Avec un MO5, croyez-moi, c'est sportif. Avec Windows, aucun intérêt.

Dans tous ces domaines, le plaisir est de créer le programme beaucoup plus que de l'utiliser. Si je pouvais susciter des vocations de demo-makers j'aurais atteint mon objectif.
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Jouer de la musique sur 1 bit

Message par __sam__ » 22 mars 2013 01:15

Daniel a écrit : Question qualité, j'ai l'impression d'entendre un sifflement parasite
Oui en effet. Avec audacity j'ai tracé le spectre.
ImageImage
Il y a bien un pic continu assez fort à 413Hz. Quand j'examine les créneaux, je compte 9 créneaux pendant 0.022s, soit 410hz. C'est vraiment proche! Ca ne peut pas être le simple hasard. On est loin des 22Khz théoriques que promettent les 46cycles/échantillons. De toute façon les 22khz sont illusoires car le spectre est clairement coupé autour de 10-11khz. Les échantillons à 22khz devraient être méchamment filtrés et on ne devrait pas obtenir des créneaux aussi nets mais des courbes bien lisses.

Je me demande si ces 410hz non filtrés ne seraient pas issu du repliement du spectre autour de la fréquence d’échantillonnage de DCMOTO. Cela vient du fait que les échantillons ont une fréquence (21.7Khz) trop proche de la période d’échantillonnage de DCMoto (22.1khz?). En effet : 21.7khz échantillonnés à 22.1khz produisent un repliement à 22.1-21.7 = 400hz. Difficile de croire que c'est encore le hasard.

Solution(s):
  • modifier (ralentir ou accélérer) la vitesse restitution des échantillons pour l'éloigner de la fréq d'échantillonage de DCMoto (on a de la marge: la fréquence de coupure du filtre de dc-moto est à 10-11khz. Jouer à 15khz devrait produire un son à 6khz. Trop aiguë pour être audible).
  • modifier la période d'échantillonnage audio de DCMoto (22khz-->24 ou 44khz) pour l'éloigner des 22khz de la porteuse.
  • faire tourner sur un vrai MO5 où, à ma connaissance, il n'y a pas d’échantillonnage entre la sortie du buzzer et notre oreille.
Est-ce que le sifflement continu s’entend à la même fréquence sur un vrai MO5 ? (Une de mes théorie favorite est que le repliement de spectre audio est un truc qui permet de distinguer un émul d'un vrai ordi).
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Jouer de la musique sur 1 bit

Message par Daniel » 22 mars 2013 09:48

Oui sam, tu as raison, le sifflement est généré par l'émulateur. La fréquence du sifflement devrait être la différence entre la période d'échantillonnage de dcmoto et celle du son 1 bit : 22050 - 21739 = 311 Hz. Pourquoi trouves-tu 413, je ne sais pas, mais ce n'est pas trop surprenant. Je viens d'essayer sur MO5, le son est parfait.

Il est normal de couper à 11000 Hz avec une fréquence d'échantillonnage de 22000 Hz, je crois qu'on ne restitue pas les fréquences au-delà de la moitié de la fréquence d'échantillonnage.

En plus, le fichier audio utilisé est assez particulier : c'est un enregistrement analogique d'un son numérique, avec renumérisation à 44100 Hz. Avec le son numérique original de super mario on doit pouvoir faire beaucoup mieux.

Je croyais difficile d'arriver à 24000 Hz. Ce matin, après une bonne nuit de repos l'esprit est plus clair, je viens d'atteindre 25000 Hz :D
40 cycles par échantillon. Qui dit mieux :?:

Code : Tout sélectionner

                      /**************************************************\
                      *                 S O N 1 B I T                    * 
                      *           (c) 2013 - Daniel Coulom               *  
                      *           http://dcmoto.free.fr/                 *
                      *           http://forum.system-cfg.com/           *
                      *--------------------------------------------------*
                      * Ce code est distribue gratuitement dans l'espoir *
                      * qu'il sera utile, mais sans aucune  garantie  et *
                      * sans  engager  la  responsabilité  de  l'auteur. *
                      * Vous  pouvez  l' utiliser,  le  modifier  et  le *
                      * diffuser librement, en conservant cette  licence *
                      * et les références de l'auteur dans   toutes  les *
                      * copies. L'exploitation commerciale est interdite.*
                      \**************************************************/
 
                      * Ce programme joue des echantillons 3 bits 25000 Hz
                      * en les convertissant en signal tout ou rien 1 bit
                      * par Modulation de Largeur d'Impulsion (PWM).
 
                      /**************************************************\
                      *                Version 2013.03.22                *
                      \**************************************************/
                      * Historique
                      * 2013.03.22 optimisation du code pour 25000 Hz
                      * 2013.03.20 premiere version operationnelle 21739 Hz
 
                            ORG   $9F00 
                            
                      *------------------------------------------------------
                      * INITIALISATIONS
                      *------------------------------------------------------
                      INIT       
 9F00 347E                  PSHS  U,Y,X,DP,B,A  empile les registres utilises
 9F02 1AD0                  ORCC  #$D0          desactive les interruptions
 9F04 86A7                  LDA   #$A7          valeur pour DP
 9F06 1F8B                  TFR   A,DP          initialisation DP
 9F08 D6C1                  LDB   <$C1          valeur port B du PIA systeme
 9F0A CA01                  ORB   #$01          set buzzer bit
 9F0C 108E9F20              LDY   #PLAY0        adresse des generateurs PWM
 
                      *------------------------------------------------------
                      * BOUCLE DE LECTURE DU SON
                      *------------------------------------------------------
                      PLAYA
 9F10 8E6000                LDX   #$6000        adresse du buffer son
 9F13 2013                  BRA   PLAYB
                            
                            ORG   $9F20
                      PLAY0
 9F20 D7C1                  STB   <$C1          set buzzer bit
 9F22 0AC1                  DEC   <$C1          clear buzzer bit
 9F24 8D72                  BSR   TEMPO7        temporisation 14 cycles
 9F26 2000                  BRA   PLAYB         nouvel echantillon
                      PLAYB
 9F28 A680                  LDA   ,X+           nouvel echantillon
 9F2A 2BE4                  BMI   PLAYA         recommencer
 9F2C 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F30
                      PLAY1
 9F30 D7C1                  STB   <$C1          set buzzer bit
 9F32 12                    NOP                 temporisation 2 cycles
 9F33 0AC1                  DEC   <$C1          clear buzzer bit
 9F35 8D62                  BSR   TEMPO5        temporisation 12 cycles
 9F37 20EF                  BRA   PLAYB         nouvel echantillon
 
                            ORG   $9F40
                      PLAY2
 9F40 D7C1                  STB   <$C1          set buzzer bit
 9F42 D100                  CMPB  <$00          temporisation 4 cycles
 9F44 0AC1                  DEC   <$C1          clear buzzer bit
 9F46 9C00                  CMPX  <$00          temporisation 6 cycles
 9F48 D100                  CMPB  <$00          temporisation 4 cycles
 9F4A 20DC                  BRA   PLAYB         nouvel echantillon
 
                            ORG   $9F50
                      PLAY3
 9F50 D7C1                  STB   <$C1          set buzzer bit
 9F52 9C00                  CMPX  <$00          temporisation 6 cycles
 9F54 0AC1                  DEC   <$C1          clear buzzer bit
 9F56 9C00                  CMPX  <$00          temporisation 6 cycles
 9F58 12                    NOP                 temporisation 2 cycles
 9F59 20CD                  BRA   PLAYB         nouvel echantillon
 
                            ORG   $9F60
                      PLAY4
 9F60 D7C1                  STB   <$C1          set buzzer bit
 9F62 9C00                  CMPX  <$00          temporisation 6 cycles
 9F64 12                    NOP                 temporisation 2 cycles
 9F65 0AC1                  DEC   <$C1          clear buzzer bit
 9F67 9C00                  CMPX  <$00          temporisation 6 cycles
 9F69 20BD                  BRA   PLAYB         nouvel echantillon
 
                            ORG   $9F70
                      PLAY5
 9F70 D7C1                  STB   <$C1          set buzzer bit
 9F72 9C00                  CMPX  <$00          temporisation 6 cycles
 9F74 D100                  CMPB  <$00          temporisation 4 cycles
 9F76 0AC1                  DEC   <$C1          clear buzzer bit
 9F78 D100                  CMPB  <$00          temporisation 4 cycles
 9F7A 20AC                  BRA   PLAYB         nouvel echantillon
 
                            ORG   $9F80
                      PLAY6
 9F80 D7C1                  STB   <$C1          set buzzer bit
 9F82 8D15                  BSR   TEMPO5        temporisation 12 cycles
 9F84 0AC1                  DEC   <$C1          clear buzzer bit
 9F86 12                    NOP                 temporisation 2 cycles
 9F87 209F                  BRA   PLAYB         nouvel echantillon
 
                            ORG   $9F90
                      PLAY7
 9F90 D7C1                  STB   <$C1          set buzzer bit
 9F92 8D04                  BSR   TEMPO7        temporisation 14 cycles
 9F94 0AC1                  DEC   <$C1          clear buzzer bit
 9F96 2090                  BRA   PLAYB         nouvel echantillon
 
                      TEMPO7
 9F98 12                    NOP                 temporisation 2 cycles
                      TEMPO5
 9F99 39                    RTS                 temporisation 5 cycles
                          
                      *------------------------------------------------------
                      * RETOUR AU BASIC
                      *------------------------------------------------------
                      RETOUR
 9F9A 35FE                  PULS  A,B,DP,X,Y,U,PC retour au Basic
                                   
                            END

SYMBOL TABLE
      INIT 02 9F00     PLAY0 02 9F20     PLAY1 02 9F30     PLAY2 02 9F40
     PLAY3 02 9F50     PLAY4 02 9F60     PLAY5 02 9F70     PLAY6 02 9F80
     PLAY7 02 9F90     PLAYA 02 9F10     PLAYB 02 9F28    RETOUR 02 9F9A
    TEMPO5 02 9F99    TEMPO7 02 9F98
14 SYMBOLS

0 error(s), 0 warning(s)
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
Carl
Modérateur
Messages : 10261
Enregistré le : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: Jouer de la musique sur 1 bit

Message par Carl » 22 mars 2013 11:19

Bravo Daniel pour cet exploit !

Carl

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Jouer de la musique sur 1 bit

Message par __sam__ » 22 mars 2013 14:09

Daniel a écrit :Pourquoi trouves-tu 413, je ne sais pas, mais ce n'est pas trop surprenant.
Le pic est trouvé sur assez peu d'échantillons. Si j'avais enregistré plus longtemps, l'estimation du spectre aurait été plus précise. Avec les 25khz que tu as atteint ce matin, le repli devrait faire apparaitre une composante continue autour de 3khz. Ca devrait être moins audible sur l'emul que les 300 et quelques hz d'origine.
Je viens d'essayer sur MO5, le son est parfait.
Je m'en doutais: Le repliement de spectre permet de différencier un émul d'une vraie machine.
sam/néo (qui a donc un moyen de savoir s'il est DEHORS ou DEDANS la matrice :) )
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Jouer de la musique sur 1 bit

Message par Daniel » 22 mars 2013 14:34

J'ai une nouvelle idée permettant de dépasser 27 kHz (37 cycles). A suivre...
Daniel
L'obstacle augmente mon ardeur.

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Jouer de la musique sur 1 bit

Message par Daniel » 22 mars 2013 19:08

Nouvelle version 27027 Hz : http://dcmoto.free.fr/sons/son1bit-v2.zip

A écouter de préférence sur MO5 ou MO6 pour éviter le sifflement des émulateurs.
Franchement, le résultat dépasse mes espérances. A l'oreille je ne crois pas qu'on puisse distinguer ce son 1 bit d'un son 3 bits à la même fréquence d'échantillonnage. Pour les curieux, c'est l'enregistrement analogique d'un coup de feu en plein air. Je suis parti d'un wav 44100 Hz 16 bits stéréo.

Voici le code à 37 cycles. Cette fois je ne pense plus pouvoir l'améliorer.

Code : Tout sélectionner

                      /**************************************************\
                      *                 S O N 1 B I T                    * 
                      *           (c) 2013 - Daniel Coulom               *  
                      *           http://dcmoto.free.fr/                 *
                      *           http://forum.system-cfg.com/           *
                      *--------------------------------------------------*
                      * Ce code est distribue gratuitement dans l'espoir *
                      * qu'il sera utile, mais sans aucune  garantie  et *
                      * sans  engager  la  responsabilité  de  l'auteur. *
                      * Vous  pouvez  l' utiliser,  le  modifier  et  le *
                      * diffuser librement, en conservant cette  licence *
                      * et les références de l'auteur dans   toutes  les *
                      * copies. L'exploitation commerciale est interdite.*
                      \**************************************************/
 
                      * Ce programme joue des echantillons 3 bits 27027 Hz
                      * en les convertissant en signal tout ou rien 1 bit
                      * par Modulation de Largeur d'Impulsion (PWM).
 
                      /**************************************************\
                      *                Version 2013.03.22                *
                      \**************************************************/
                      * Historique
                      * 2013.03.22 optimisation du code pour 27027 Hz
                      * 2013.03.22 optimisation du code pour 25000 Hz
                      * 2013.03.20 premiere version operationnelle 21739 Hz
 
                            ORG   $9F00 
                            
                      *------------------------------------------------------
                      * INITIALISATIONS
                      *------------------------------------------------------
                      INIT       
 9F00 347E                  PSHS  U,Y,X,DP,B,A  empile les registres utilises
 9F02 1AD0                  ORCC  #$D0          desactive les interruptions
 9F04 86A7                  LDA   #$A7          valeur pour DP
 9F06 1F8B                  TFR   A,DP          initialisation DP
 9F08 D6C1                  LDB   <$C1          valeur port B du PIA systeme
 9F0A CA01                  ORB   #$01          set buzzer bit
 9F0C 108E9F20              LDY   #PLAY0        adresse des generateurs PWM
 
                      *------------------------------------------------------
                      * BOUCLE DE LECTURE DU SON
                      *------------------------------------------------------
                      PLAY
 9F10 8E6000                LDX   #$6000        adresse du buffer son
 9F13 2011                  BRA   PLAYB
                            
                            ORG   $9F20
                      PLAY0
 9F20 D7C1                  STB   <$C1          set buzzer bit
 9F22 0AC1                  DEC   <$C1          clear buzzer bit
 9F24 8D76                  BSR   TEMPO7        temporisation 14 cycles
                      PLAYB
 9F26 A680                  LDA   ,X+           nouvel echantillon
 9F28 2B02                  BMI   PLAYA         recommencer
 9F2A 6EA6                  JMP   A,Y           jouer l'echantillon
                      PLAYA
 9F2C 20E2                  BRA   PLAY
 
                            ORG   $9F30
                      PLAY1
 9F30 D7C1                  STB   <$C1          set buzzer bit
 9F32 12                    NOP                 temporisation 2 cycles
 9F33 0AC1                  DEC   <$C1          clear buzzer bit
 9F35 8D66                  BSR   TEMPO5        temporisation 12 cycles
 9F37 A680                  LDA   ,X+           nouvel echantillon
 9F39 2BF1                  BMI   PLAYA         recommencer
 9F3B 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F40
                      PLAY2
 9F40 D7C1                  STB   <$C1          set buzzer bit
 9F42 D100                  CMPB  <$00          temporisation 4 cycles
 9F44 0AC1                  DEC   <$C1          clear buzzer bit
 9F46 9C00                  CMPX  <$00          temporisation 6 cycles
 9F48 D100                  CMPB  <$00          temporisation 4 cycles
 9F4A A680                  LDA   ,X+           nouvel echantillon
 9F4C 2BDE                  BMI   PLAYA         recommencer
 9F4E 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F50
                      PLAY3
 9F50 D7C1                  STB   <$C1          set buzzer bit
 9F52 9C00                  CMPX  <$00          temporisation 6 cycles
 9F54 0AC1                  DEC   <$C1          clear buzzer bit
 9F56 9C00                  CMPX  <$00          temporisation 6 cycles
 9F58 12                    NOP                 temporisation 2 cycles
 9F59 A680                  LDA   ,X+           nouvel echantillon
 9F5B 2BCF                  BMI   PLAYA         recommencer
 9F5D 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F60
                      PLAY4
 9F60 D7C1                  STB   <$C1          set buzzer bit
 9F62 9C00                  CMPX  <$00          temporisation 6 cycles
 9F64 12                    NOP                 temporisation 2 cycles
 9F65 0AC1                  DEC   <$C1          clear buzzer bit
 9F67 9C00                  CMPX  <$00          temporisation 6 cycles
 9F69 A680                  LDA   ,X+           nouvel echantillon
 9F6B 2BBF                  BMI   PLAYA         recommencer
 9F6D 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F70
                      PLAY5
 9F70 D7C1                  STB   <$C1          set buzzer bit
 9F72 9C00                  CMPX  <$00          temporisation 6 cycles
 9F74 D100                  CMPB  <$00          temporisation 4 cycles
 9F76 0AC1                  DEC   <$C1          clear buzzer bit
 9F78 D100                  CMPB  <$00          temporisation 4 cycles
 9F7A A680                  LDA   ,X+           nouvel echantillon
 9F7C 2BAE                  BMI   PLAYA         recommencer
 9F7E 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F80
                      PLAY6
 9F80 D7C1                  STB   <$C1          set buzzer bit
 9F82 8D19                  BSR   TEMPO5        temporisation 12 cycles
 9F84 0AC1                  DEC   <$C1          clear buzzer bit
 9F86 12                    NOP                 temporisation 2 cycles
 9F87 A680                  LDA   ,X+           nouvel echantillon
 9F89 2BA1                  BMI   PLAYA         recommencer
 9F8B 6EA6                  JMP   A,Y           jouer l'echantillon
 
                            ORG   $9F90
                      PLAY7
 9F90 D7C1                  STB   <$C1          set buzzer bit
 9F92 8D08                  BSR   TEMPO7        temporisation 14 cycles
 9F94 0AC1                  DEC   <$C1          clear buzzer bit
 9F96 A680                  LDA   ,X+           nouvel echantillon
 9F98 2B92                  BMI   PLAYA         recommencer
 9F9A 6EA6                  JMP   A,Y           jouer l'echantillon
 
                      TEMPO7
 9F9C 12                    NOP                 temporisation 2 cycles
                      TEMPO5
 9F9D 39                    RTS                 temporisation 5 cycles
                          
                      *------------------------------------------------------
                      * RETOUR AU BASIC
                      *------------------------------------------------------
                      RETOUR
 9F9E 35FE                  PULS  A,B,DP,X,Y,U,PC retour au Basic
                                   
                            END

SYMBOL TABLE
      INIT 02 9F00      PLAY 02 9F10     PLAY0 02 9F20     PLAY1 02 9F30
     PLAY2 02 9F40     PLAY3 02 9F50     PLAY4 02 9F60     PLAY5 02 9F70
     PLAY6 02 9F80     PLAY7 02 9F90     PLAYA 02 9F2C     PLAYB 02 9F26
    RETOUR 02 9F9E    TEMPO5 02 9F9D    TEMPO7 02 9F9C
15 SYMBOLS

0 error(s), 0 warning(s)
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Jouer de la musique sur 1 bit

Message par __sam__ » 22 mars 2013 20:23

Daniel a écrit :A écouter de préférence sur MO5 ou MO6 pour éviter le sifflement des émulateurs.
En effet! Sous emul on entend pratiquement que le sifflement très aigu. Et pour cause:
Image
Il y a un super pic à 4763hz (dans 8ème octave).
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Jouer de la musique sur 1 bit

Message par Daniel » 22 mars 2013 20:49

27027 - 22050 = 4977
cqfd

A défaut de vrai Thomson essayez cet émulateur : http://dcmoto.free.fr/sons/dcmoto_20130322.zip
27027 - 27027 = 0
c'est l'évidence même.
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Jouer de la musique sur 1 bit

Message par __sam__ » 22 mars 2013 21:09

En effet
Image
On retrouve le spectre d'avant mais sans le vilain pic dans les 4.7-4.9khz.
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Répondre