Écrivez la plus belle composition d'octets

24

Bytebeat est un style de musique que l'on peut composer en écrivant un simple programme C dont la sortie est canalisée vers aplayou /dev/dsp.

main(t){for(;;t++)putchar(((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7);}

Il y a beaucoup d'informations sur le site bytebeat , une implémentation javascript et plus de démos et d'exemples de compositions dans ce fil .

Règles très simples: essayez d'écrire une jolie composition sonore. La plupart des votes positifs l'emportent car c'est évidemment subjectif, bien que pas subjectif compte tenu des résultats habituels.

Jeff Burdges
la source
Tenez-vous cela à un octet strict (c.-à-d. Pas de tampons)?
Peter Taylor
4
Pourquoi est-il limité à C?
utilisateur inconnu
Il n'y a aucune raison intrinsèque de restreindre l'utilisation de tampons ou d'autres langages, mais généralement bytebeat signifie que cette boucle C particulière avec la sortie définie par une formule. J'ai voté pour la réponse de Joey Adams, même si je pensais que ce n'était rand()pas standard.
Jeff Burdges
Bien que j'aime cette idée, la FAQ appelle à un critère de gain objectif (il est trop facile de se laisser piéger dans les calculs ou l'art ASCII). Pouvons-nous chercher quelque chose de mieux défini que «joli»?
dmckee

Réponses:

16

(Petit endian 16 bits signé, 8000 Hz mono ( --format=S16_LE))

La musique

Beaucoup mieux qu'avant! (même si c'est assez long)

main(t){for(;;t++)putchar(((7&(((t>>17)+1)>>2)+((t>>10)&1+2*(t>>18&1))*(("23468643"[7&t>>12]-48)+(3&t>>11))+((3&t>>17)>0)*(3&t>>9)*!(1&t>>10)*(((2+t>>10&3)^(2+t>>11&3))))*t*"@06+"[3&t>>15]/32));}

(Vous pouvez écouter ceci ici )

J'ai écrit cela, mais même je ne sais pas comment certaines parties fonctionnent, comme >0et (surtout) la première 7&.

Changez pour la boucle en for(;!(t>>22);t++)... pour l'écouter 'une fois'. Cependant, je ne sais pas s'il "boucle" exactement de la même manière.

Mélodie (base de la musique ci-dessus)

J'adore cette mélodie que j'ai faite (CGAF ftw), mais elle est trop 'simple' ...

main(t){for(;;t++)putchar(((t>>10)&1)*(t*("23468643"[7&t>>12]-48)+t*(3&t>>11))*"@06+"[3&t>>15]/32);}

Musique simple (que j'ai faite auparavant)

main(t){for(;;t++)putchar(t*(3&t>>11)+(t&t>>11)*4*!((t>>11)%3));}

JiminP
la source
Si vous cliquez sur le lien octet ci-dessus, vous verrez une ligne de commande sox pour le convertir en un fichier .wav et une ligne de commande de compresseur étrange.
Jeff Burdges
3
+1 Incroyable! Quelques morceaux (par exemple 1:30 - 1:40) sonnent un peu comme du "bégaiement", mais là encore, une grande partie du charme même du bytebeat réside dans ces rythmes et mélodies étranges et non conventionnels, et l'effet global est excellent. (Ps. J'ai accidentellement joué cela à 8 bits par échantillon, et je sonne aussi étonnamment bien de cette façon. Un peu comme jouer un vinyle 45 tours à 33,3 tours.)
Ilmari Karonen
3

La fonction règle en ut mineur:

#include <math.h>
#include <stdio.h>

#define PI 3.14159265358979323846

#define step(freq, n) ((freq) * pow(2, (n) / 12.0))
#define note(n)       step(440, n)
#define MIDDLE_C      note(-9)

int count_zeros(unsigned int n)
{
    int count = 0;
    for (; (n & 1) == 0; n >>= 1)
        count++;
    return count;
}

int minor_note(int note)
{
    int octave = note / 7;
    int scale[] = {0, 2, 3, 5, 7, 8, 10};

    note %= 7;
    if (note < 0) {
        note += 7;
        octave--;
    }

    return scale[note] + octave*12;
}

int main(void) {
    double t = 0.0;
    double freq = MIDDLE_C * 2;
    double step = PI * 2 / 8192;
    int n = 0;
    int i = 0;

    for (i = 1;; t += step, i++) {
        if (i == 1024) {
            i = 0;
            n++;
            freq = step(MIDDLE_C, minor_note(count_zeros(n)));
        }

        putchar(sin(t * freq) * 50.0 + 128.0);
    }

    return 0;
}
Joey Adams
la source
Belle mélodie, mais pour être une "composition", cette OMI a besoin de quelque chose de plus ...
Ilmari Karonen
3
main(t){for(;;t+=(t%6)?1:2)putchar((((t<<t^(t>>8))|(t<<7))*((t<<t&(t>>12))|(t<<10))));}
Pubby
la source
Octet très classique, si ce n'est pas un oxymore. +1 de moi.
Ilmari Karonen du
3

Mettre l'accent sur "battre" sur "octet":

#include<math.h>

double s(double,double);double r(double,double);double d(double);double f(double);

char bytebeat(int t){return (d(f(t/4000.)/3) + 1) * 63;}
double f(double t){
  double sn=s(1./2,t-1); sn*=(sn*sn);
  return 3*s(1./4,1/s(1,t))+3*s(4,1/sn)/2+s(4,1/(sn*sn*sn*sn*sn))/4
       +2*s(55+18.3*r(1./2,t),t)+s(110+s(5,t)/4000,t)*s(1,t)+s(220+110*r(1,t)+55*r(3,t),t)/5
       +s(880+440*r(1./2,t)-220*r(1,t)+110*r(2,t)+s(5,t)/4000,t)
       *(2+s(1760+438*r(3./2,t)-1234*r(2,t)+423*r(5,t),t))/9
       +s(s(1,t)+s(1./2,t)+s(1./4,t)+s(1./8,t),t)*s(s(1,t)+s(1./2,t)+s(1./4,t)+s(1./8,t)+1,t)
       +r(264+11*r(1./20,t),t)*s(1./20,t);
}
double s(double f,double t){return d(sin(f*3.14159265*(t+999)));}
double r(double f,double t){return s(f,t)<0;}
double d(double a){return tanh(a+a*a/4);}

main(t){for(;;++t)putchar(bytebeat(t));}

À utiliser à 8 kHz, uint8 mono. Sonne mieux que des haut-parleurs décemment capables de basses.

a cessé de tourner dans le sens antihoraire
la source
2
main(){for(;;)putchar(rand());}

Sonne comme l'océan ;-)

Joey Adams
la source
1
Plus comme un passage à niveau vraiment occupé pour moi. :)
Ilmari Karonen
5
Protip: si cela ressemble à une tonalité continue, votre RNG est cassé.
M. Llama
3
façon la plus simple:$ cat /dev/urandom | aplay
Braden Best
2
@ B1KMusic beaucoup plus simple:aplay /dev/urandom
minmaxavg
0

Mélodie et harmonie combinées:

r=3,
r=3,
m=(t*(t>>12|t>>13|t>>14|t>>15|t>>16|t>>17|t>>18))&63,

h= ((t&t>>7&t>>6)|t*5&t>>8-c^t*6&t>>9-c|t*7&t>>12-c^t*9&t>>11-c^t*11&t>>22^t*19&t>>20^t*14&t>>20|t*23&t>>15-c|t*12&t>>9|t*30&t>>30|t>>5|t>>4)-31, m|h
Kenn Downey
la source