É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.



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));}


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;
}

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))));}

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.


2
main(){for(;;)putchar(rand());}

Sonne comme l'océan ;-)


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.