Bytebeat

From Noisebridge
(Difference between revisions)
Jump to: navigation, search
(add python version)
(busybox awk)
(34 intermediate revisions by 9 users not shown)
Line 1: Line 1:
 +
=== bytebeat in x86 assembler ===
 
  <nowiki>
 
  <nowiki>
  
Line 12: Line 13:
 
  ;
 
  ;
 
  ;      ./noise | aplay
 
  ;      ./noise | aplay
 +
;
 +
; Equivalent to:
 +
;        python -c'import sys;[sys.stdout.write(chr((t>>10^t>>(t>>13)%4)%256)) for t in xrange(2**20)]' |aplay
  
 
  global _start
 
  global _start
Line 59: Line 63:
 
  </nowiki>
 
  </nowiki>
  
  python -c'import sys;[sys.stdout.write(chr((t>>10^t>>(t>>13)%4)%256)) for t in xrange(2**20)]' |aplay
+
<nowiki>
 +
 
 +
### Basic Sierpinski harmony bytebeat t & t >> 8 in as few bytes as possible:
 +
        .globl _start
 +
_start: inc %ebx            # output fd 1 in %ebx for write()
 +
        inc %edx            # byte count of 1 in %edx for write()
 +
loop:  inc %eax            # increment t each time through the loop
 +
        push %eax            # save it on the stack
 +
        and %ah, %al        # compute t & t >> 8, our output sample
 +
        push %eax            # store it on the stack for write()
 +
        lea 3(%ebx), %eax    # a three-byte way to set %eax to 4 (__NR_write)
 +
        mov %esp, %ecx      # pass sample pointer to write() (little-endian!)
 +
        int $0x80            # invoke system call
 +
        pop %eax            # discard sample
 +
        pop %eax            # restore t into %eax
 +
        jmp loop            # and repeat
 +
### Kragen Javier Sitaker
 +
### 2012-01-10
 +
 
 +
</nowiki>
 +
 
 +
Compile with gcc -m32 -nostdlib and pipe the output to aplay.  After stripping, the ELF is 240 bytes; size(1) says it has 18 bytes of code.
 +
 
 +
=== bytebeat in &lt;140-character command lines with python ===
 +
 
 +
From @wiretapped:
 +
  python -c'import sys;[sys.stdout.write(chr(( t^t>>(t>>11)%3^t>>(t>>12)%4                    )%256)) for t in xrange(2**19)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t>>(t>>11)%4^(t>>10)*(t>>15)                  )%256)) for t in xrange(2**19)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t<<3+(t>>10)%3^t>>4+(t>>12)%4^t**(2+(t>>13)%8) )%256)) for t in xrange(2**18)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t^t>>4^(t*((t>>(11+(t>>16)%3))%16))^t*3        )%256)) for t in xrange(2**20)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t+(t>>(5+(t>>10)%4)^t)                        )%256)) for t in xrange(2**21)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t+(t>>(5+(t>>10)%8))^t|t>>12                  )%256)) for t in xrange(2**21)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t|(((t>>1)%(8+(t>>14)%4))+(t>>6))              )%256)) for t in xrange(2**18)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr(( t*(3+(t>>10)%(4+(t>>11)%8))|(t>>5)            )%256)) for t in xrange(2**20)]'|aplay
 +
 
 +
From @isislovecruft (#FYB):
 +
python -c'import sys;[sys.stdout.write(chr(((~t>>2)*(2+(42&t*((7&t>>10)*2))<(24&t*((3&t>>14)+2))))%256))for t in xrange(2**19)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr((((t*5&t>>7|t*9&t>>4|t*18&t/1024)|((t|7)>>5|(t|4)>>9))) %256))for t in xrange(2**18)]'|aplay
 +
python -c'import sys;[sys.stdout.write(chr((((t*(t>>13|t>>8))|(t>>16)^t)-64)%256)) for t in xrange(2**18)]'|aplay
 +
 
 +
for OSX
 +
 
 +
  brew install sox
 +
  python -c'import sys; [sys.stdout.write(chr(((t*5&t>>7|t*9&t>>4|t*18&t/1024)|((t|7)>>5|(t|4)>>9))%256))for t in xrange(2**18)]' > out.raw;
 +
  sox -r 8000 -c 1 -t u8 out.raw out.wav;
 +
  open out.wav
 +
 
 +
=== an attempt with luajit ===
 +
 
 +
  local bit = require'bit'
 +
  local ffi = require'ffi'
 +
 
 +
  ffi.cdef[[
 +
    int putchar(int c);
 +
  ]]
 +
 
 +
  local putc = ffi.C.putchar
 +
  local rsh  = bit.rshift
 +
  local lsh  = bit.lshift
 +
  local band = bit.band
 +
  local bor  = bit.bor
 +
  local bxor = bit.bxor
 +
 
 +
  for t=0, math.huge do
 +
    putc( band(t, rsh(t, 8)) )
 +
  end
 +
 
 +
run it on osx:
 +
 
 +
  luajit 8bit.lua | sox -r 8000 -c 1 -t u8 - -d
 +
 
 +
=== busybox awk ===
 +
might work with gawk, dunno. 
 +
 
 +
throw it to /dev/dsp
 +
 
 +
    #!/usr/bin/awk -f
 +
    BEGIN{
 +
      for (t=0;;t++){
 +
          printf("%c",and(t, rshift(t, 8)));
 +
      }
 +
    }
 +
 
 +
of course awk will eat your processor alive.
 +
 
 +
alternately from your shell
 +
 
 +
    seq 11111111 | awk '{printf("%c",and($1,rshift($1,8)))}' > /dev/dsp
 +
 
 +
should also summon cthulhu
 +
 
 +
=== With Haskell! ===
 +
http://yaxu.org/haskell-hack/
 +
 
 +
=== links ===
 +
* [http://www.metafilter.com/111959/Todays-formulaic-music Today's formulaic music.] - Metafilter post about bytebeat with many links
 +
* Recordings made at Noisebridge: [http://www.youtube.com/watch?v=89Dm7yiYoXM] [http://www.youtube.com/watch?v=1tqgzMqk0jM] [http://www.youtube.com/watch?v=S14UknY8qtc] [http://www.youtube.com/watch?v=C87qr2sDu4s]
 +
* https://github.com/kragen/pytebeat - Python Bytebeat livecoding software in SDL
 +
* http://music.columbia.edu/~douglas/strange_things/?p=78 - Algorithmic beat rotation with the EchoNest API
 +
 
 +
[[Category:Python]]
 +
[[Category:Lua]]
 +
[[Category:Assembler]]

Revision as of 00:45, 28 September 2013

Contents

bytebeat in x86 assembler


 ; noise.asm -- just fooling around :-)
 ; mct and leif, ; Sun Feb 19 19:08:13 PST 2012
 ; 
 ; Build with:
 ;
 ;       nasm -felf32 noise.asm
 ;       ld -melf_i386 -o noise noise.o
 ;
 ; Run with:
 ;
 ;       ./noise | aplay
 ;
 ; Equivalent to:
 ;        python -c'import sys;[sys.stdout.write(chr((t>>10^t>>(t>>13)%4)%256)) for t in xrange(2**20)]' |aplay

 global _start

 section .data

 section .bss

         var:    resb 1  ; one bye variable

 section .text

         ; f(x) = (x >> 10 ^ x>>((x>>13)%4)) % 256

         _start: mov esi, 0

                 ;int 3

         .loop: 

                 mov edi, esi
                 shr edi, 13 ; edi := x >> 13

                 mov eax, edi
                 cwd
                 mov bx, 4
                 div bx  ; dx := (x >> 13) % 4

                 mov eax, esi
                 mov cx, dx
                 shr eax, cl   ; eax := x >> ((x >> 13) % 4)

                 mov edi, esi
                 shr edi, 10   ; edi := x >> 10

                 xor eax, edi
                 mov [var], al

                 mov eax, 4      ; sys_write
                 mov ebx, 1      ; stdout
                 mov ecx, var    ; buffer
                 mov edx, 1      ; length
                 int 80h         ; syscall

                 inc esi
                 jmp .loop
 

 ### Basic Sierpinski harmony bytebeat t & t >> 8 in as few bytes as possible:
         .globl _start
 _start: inc %ebx             # output fd 1 in %ebx for write()
         inc %edx             # byte count of 1 in %edx for write()
 loop:   inc %eax             # increment t each time through the loop
         push %eax            # save it on the stack
         and %ah, %al         # compute t & t >> 8, our output sample
         push %eax            # store it on the stack for write()
         lea 3(%ebx), %eax    # a three-byte way to set %eax to 4 (__NR_write)
         mov %esp, %ecx       # pass sample pointer to write() (little-endian!)
         int $0x80            # invoke system call
         pop %eax             # discard sample
         pop %eax             # restore t into %eax
         jmp loop             # and repeat
 ### Kragen Javier Sitaker
 ### 2012-01-10

 

Compile with gcc -m32 -nostdlib and pipe the output to aplay. After stripping, the ELF is 240 bytes; size(1) says it has 18 bytes of code.

bytebeat in <140-character command lines with python

From @wiretapped:

python -c'import sys;[sys.stdout.write(chr(( t^t>>(t>>11)%3^t>>(t>>12)%4                    )%256)) for t in xrange(2**19)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t>>(t>>11)%4^(t>>10)*(t>>15)                   )%256)) for t in xrange(2**19)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t<<3+(t>>10)%3^t>>4+(t>>12)%4^t**(2+(t>>13)%8) )%256)) for t in xrange(2**18)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t^t>>4^(t*((t>>(11+(t>>16)%3))%16))^t*3        )%256)) for t in xrange(2**20)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t+(t>>(5+(t>>10)%4)^t)                         )%256)) for t in xrange(2**21)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t+(t>>(5+(t>>10)%8))^t|t>>12                   )%256)) for t in xrange(2**21)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t|(((t>>1)%(8+(t>>14)%4))+(t>>6))              )%256)) for t in xrange(2**18)]'|aplay
python -c'import sys;[sys.stdout.write(chr(( t*(3+(t>>10)%(4+(t>>11)%8))|(t>>5)             )%256)) for t in xrange(2**20)]'|aplay

From @isislovecruft (#FYB):

python -c'import sys;[sys.stdout.write(chr(((~t>>2)*(2+(42&t*((7&t>>10)*2))<(24&t*((3&t>>14)+2))))%256))for t in xrange(2**19)]'|aplay
python -c'import sys;[sys.stdout.write(chr((((t*5&t>>7|t*9&t>>4|t*18&t/1024)|((t|7)>>5|(t|4)>>9))) %256))for t in xrange(2**18)]'|aplay
python -c'import sys;[sys.stdout.write(chr((((t*(t>>13|t>>8))|(t>>16)^t)-64)%256)) for t in xrange(2**18)]'|aplay

for OSX

 brew install sox
 python -c'import sys; [sys.stdout.write(chr(((t*5&t>>7|t*9&t>>4|t*18&t/1024)|((t|7)>>5|(t|4)>>9))%256))for t in xrange(2**18)]' > out.raw; 
 sox -r 8000 -c 1 -t u8 out.raw out.wav;
 open out.wav

an attempt with luajit

 local bit = require'bit'
 local ffi = require'ffi'
 
 ffi.cdef[[
   int putchar(int c);
 ]]
 
 local putc = ffi.C.putchar
 local rsh  = bit.rshift
 local lsh  = bit.lshift
 local band = bit.band
 local bor  = bit.bor
 local bxor = bit.bxor
 
 for t=0, math.huge do
   putc( band(t, rsh(t, 8)) )
 end

run it on osx:

 luajit 8bit.lua | sox -r 8000 -c 1 -t u8 - -d

busybox awk

might work with gawk, dunno.

throw it to /dev/dsp

   #!/usr/bin/awk -f 
   BEGIN{
      for (t=0;;t++){
         printf("%c",and(t, rshift(t, 8)));
      }
   }

of course awk will eat your processor alive.

alternately from your shell

   seq 11111111 | awk '{printf("%c",and($1,rshift($1,8)))}' > /dev/dsp

should also summon cthulhu

With Haskell!

http://yaxu.org/haskell-hack/

links

Personal tools