Elektro

Mit den Nerds Musik machen ist in etwa genau das, was ich mir darunter vorgestellt hatte: Keine Instrumente, keine Melodie, kein Ton, kein Bullshit.
Stattdessen ein Terminal, lautes Rauschen und Knattern und Pieptöne die den schlimmsten Mono-Klingeltönen an Markerschütterung in nichts nachstehen. Welch ein Spaß!

Ich hatte ja schon im letzten Artikel erwähnt, dass bei Linux alles eine Datei ist, was es so schön hackbar macht. Nicht nur meine schlampig geschriebene To-Do-Listen und Uninotizen sind in Dateiform gespeichert, sondern sogar die Hardware ist als Datei darstellbar. So auch die Tastaturbelegung und meine Grafikkarte sind offene Gefäße in die ich etwas reinpacken kann.

Und was macht ein Nerd, wenn er einen offenen Topf bei sich in der Wohnung findet? Er bestellt etwas beim Asiaten nebenan!

Naja, unabhängig davon versuchten wir also verschiedene Dateien wiederum in die Hardwaredateien zu schreiben. Als erstes schickte ich eine mp3-Datei in den Frame Buffer. Heraus kam folgende Pixelkotze:

Was ich aber nicht wusste war, dass das wahre erbrochene Pixelchaos erst dann entsteht, wenn ich eine random-byte-Datei dafür verwende! Das sieht dann nämlich so aus:

Das yougrow-Lied war also tatsächlich als das Lied das es ist dargestellt und gewissermaßen nicht verfremdet. Interessant ist daran, dass ich also die yougrow-Datei wirklich sehen und ihr Muster erkennen konnte. Oder theoretisch könnte. Was interessante Gedanken zur Perzeption von Musik zulässt.

Der Haupteil des Abends war aber dem Schreiben eines eigenen Musikprogramms gewidmet. Hier, “Musik” heißt das Programm:

.globl _start
#.lcomm buffer, 100
buffer:
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
.byte 0,255,0,255,0,255,0,255,0,255
_start:
pushl $buffer
pushl $100
loop:
call play
 jmp loop
movl $1, %eax
movl $0, %ebx
int $128

Das Programm schreibt die Bytes in einen Speicherbereich und dessen Inhalt wird an das Soundkartendevice ( /dev/dsp ) geschickt. Die Funktion “play” die in der loop aufgerufen wird sieht so aus:

datei:
 .ascii "/dev/dsp"

.globl play
play:
movl $5, %eax
movl $datei, %ebx
movl $1, %ecx
int $0x80
pushl %eax
movl %eax, %ebx
movl $4, %eax
movl 12(%esp), %ecx
movl 8(%esp), %edx
int $0x80

Bei den Bytes gibt es drei Komponenten, die bestimmen, was für ein Geräusch (aka Musik) ausgegeben wird. Dafür ist wichtig zu verstehen, dass die Bytes in Wellen geordnet sind. Das heißt eine Welle geht in diesem Falle von 0 über 255 und dann wieder zur 0.

Der Abstand zwischen den einzelnen Wellen ist bestimmend für die Höhe des Tons. Die Menge der Bytes, die ich insgesamt hineinschreibe in den Framebuffer bestimmt die Länge.
Und die Lautstärke des Tons wird durch die Amplitude der Welle bestimmt. In diesem Falle 255 (von null bis 255). Das ist also lauter als 0-10-20-10-0…etc.

Nachdem wir über 9000 Bytes in den Buffer geschrieben haben konnten wir das Programm assemblern, mit der zugehörigen Funktion linken und dann ausführen. Es schreibt die Bytes nach /dev/dsp und zu hören ist der 0,5-Sekunden lange Ton von ein paar Bytes. Innerlich weinten wir alle ein bisschen, gerührt vom süßlichen, herzerwärmenden Klang wenn der Avatar in diese scheiß Falle mit den Spitzen fällt, stirbt und dann schlecht animiert aus dem Bild springt.

Nach dieser Deromantisierung von Allem was ich in 10 Jahren Geigenunterricht gelernt habe (als ob) ging ich mich betrinken und erzählte meinen mittlerweile sehr rar gewordenen Nicht-Nerd-Freunden davon, wie ich gerade Musik machte. Und stellte fest, dass der Ansatz, Wellen mit Bytes zu erzeugen und an den Speaker zu schicken ne verflucht spannende Geschichte ist. Oder sein kann. Also wenn ich erstmal das mit den Sys-Calls verstanden habe. Und eine vernünftige Funktionenbibliothek hab. Wenn ich wieder Zeit hab!

Also wenn ich erstmal wieder nüchtern bin und Assembler beherrsche, dann…!

About these ads
Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.

Schließe dich 104 Followern an

%d Bloggern gefällt das: