[QUIZ#12] Perkussionist

Quiz #12
Der Perkussionist

Regeln
Die Regeln und der Ablauf der Quizrunde können in der entsprechenden Ankündigung eingesehen werden. Bitte lest sie euch aufmerksam durch, da sie alle wichtigen Informationen enthält. Lösungsansätze können und dürfen auch schon vorab untereinander ausgetauscht und diskutiert werden, allerdings nicht öffentlich im Forum. Verwendet stattdessen bitte private Nachrichten oder schaut im Chat vorbei.

Abgabe
Die Abgabe erfolgt wie immer im Abgabeforum. Abgabefrist ist Samstag, der 14. November 2009 um ca. 23 Uhr.

Die Aufgabe
Eure Aufgabe besteht diesmal darin, einen simplen digitalen Drumcomputer zu programmieren. Aus einigen Audiosamples von Instrumenten und einem vorgegebenen Ablauf soll eine Audiodatei erstellt werden.

Eingabeformat
Die Eingabe erfolgt durch eine Textdatei, die wie folgt aufgebaut ist:
Code:
<Beats pro Minute>
<Ticks pro Beat>
<Pfad zum Audiosample von Instrument 1>
<Pfad zum Audiosample von Instrument 2>
...
<Pfad zum Audiosample von Instrument n>

<Ablauf Instrument 1>
<Ablauf Instrument 2>
...
<Ablauf Instrument n>
Über die Parameter <Beats pro Minute> und <Ticks pro Beat> soll die Abspielgeschwindigkeit steuerbar sein. Ein Tick stellt die kleinste Zeiteinheit dar (wenn man einen Beat z.B. als Viertelnote interpretiert und <Ticks pro Beat> auf 4 gesetzt ist, entspricht ein Tick also einer Sechzehntel-Note).

Jede Ablauf-Zeile besteht aus einer Sequenz von Leerzeichen oder Nicht-Leerzeichen. Das i-te Zeichen gibt an, ob das jeweilige Instrument im i-ten Tick gespielt werden soll (Nicht-Leerzeichen) oder nicht (Leerzeichen). Beispiel:
Code:
  X X   XX
Das Instrument hat erst zwei Ticks Pause, dann wird es gespielt. Vor dem nächsten Einsatz pausiert das Instrument einen Tick. Nach weiteren drei Ticks Pause wird es in den zwei darauf folgenden Ticks gespielt.

Die Audiosamples liegen im WAVE-Format vor. Die Daten sind stets PCM-codiert, bei einer Auflösung von 16 Bit pro Sample, einer Abtastrate von 44.100 Hz und einem Kanal (mono). Ihr könnt davon ausgehen, dass die Abtastwerte ab dem Offset 44 bis zum Ende der Datei vorliegen (als Folge von 16-Bit signed Integers in Little Endian). Ihr müsst den RIFF-Header also nicht auswerten.

Ausgabeformat
Als Ausgabe soll wiederum eine WAVE-PCM-Datei erzeugt werden, mit demselben Format wie die Audiosamples (16 Bit, 44.100 Hz, Mono). Die Samples der einzelnen Instrumente sollen darin entsprechend ihrer Ablauf-Zeile erklingen. Als Header für die Datei könnt ihr folgenden String verwenden:
Code:
"\x52\x49\x46\x46$size\x57\x41\x56\x45\x66\x6d\x74\x20\x10\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88\x58\x01\x00\x02\x00\x10\x00\x64\x61\x74\x61"
Unmittelbar darauf muss die Größe der Audiodaten in Bytes folgen, kodiert als 32-Bit unsigned Integer in Little Endian. Im Anschluss schreibt ihr einfach die Abtastwerte in die Datei (wieder als Folge von 16-Bit signed Integers in Little Endian). Der Platzhalter $size muss außerdem durch einen 32-Bit unsigned Integer in Little Endian ersetzt werden, der die Dateigröße - 8 angibt.

Stufe 1
In der einfachsten Stufe reicht es, wenn ihr genau ein Instrument unterstützt. Ihr müsst also im wesentlichen nur das Audiosample einlesen und die Abtastwerte in der Ausgabe passend platzieren.

Stufe 2
Die zweite Stufe erfordet, dass beliebig viele Instrumente verwendet werden können. Außerdem soll die Stärke jedes Anschlags (also die Lautstärke) festgelegt werden können. Dies geschieht durch die Zeichen 1 (10%), 2 (20%), ..., 9 (90%) und X (100%).

Erweiterungen
Ideen für mögliche Erweiterungen:
  • Stereo-Ausgabe mit der Möglichkeit, jedes Instrument zu platzieren (z.B. -100 für ganz links, 0 für mittig, 100 für ganz rechts)
  • Zufällige Variationen in Anschlagstärke und Rhythmus (um einen menschlichen Spieler nachzuahmen)
  • Ausbau zu einem Pattern-Sequenzer
  • GUI zur leichteren Eingabe
  • Direkte Ausgabe des Ergebnisses über die Soundkarte

Beispiele
Die Ausgaben wurden nachträglich von einer externen Software in das speicherschonendere OGG-Format konvertiert. Die verwendeten Audiosamples wurden schamlos von Hydrogen übernommen, befinden sich aber auch im Anhang. Weitere Drumkits für eigene Experimente findet ihr auf Sourceforge (in *.tar.gz umbenennen und extrahieren). Ich habe allerdings nicht überprüft, ob diese alle im richtigen Format vorliegen.

Stufe 1:
Code:
80
4
stick_Woody.wav

X X XXX XXXX XX
Ausgabe: Anhang anzeigen simple.ogg.zip

Code:
80
4
sn_Wet_b.wav

X  XX  X X XX
Ausgabe: Anhang anzeigen simple2.ogg.zip

Stufe 2:
Code:
90
8
cra_Rock_a.wav
tom_Rock_mid.wav
hhc_Dry_a.wav
sn_Wet_b.wav
kick_Dry_b.wav

X                               X                               
                                                          X X   
X X X X X X X X X X X X X X X X X X X X X X X X X X X X         
        X               X               X             XXX       
X             X X               X           X X
Ausgabe: Anhang anzeigen advanced.ogg.zip

Code:
90
8
cra_Rock_a.wav
tom_Rock_mid.wav
hhc_Dry_a.wav
sn_Wet_b.wav
kick_Dry_b.wav

X                               X                               
                                                          3 3   
X 5 5 5 X 5 5 5 X 5 5 5 X 5 5 5 X 5 5 5 X 5 5 5 X 5 5 5         
        X               X               X             36X       
X             X X               X           X X
Ausgabe: Anhang anzeigen dynamic.ogg.zip

Weitere Beispiele (automatisch konvertierte Demofiles von Hydrogen, ohne Anspruch auf absolute Übereinstimmung): Anhang anzeigen demos.zip


Und jetzt ran an die Tasten und viel Spaß beim Programmieren!
 

Anhänge

  • drumkit.zip
    445,1 KB · Aufrufe: 101
Zuletzt bearbeitet:
Hallo zeja,

ich hab eine Quick&Dirty-Lösung an einem Abend zusammengeschustert. Das Ergebnis waren 60 Zeilen Ruby-Code. Sollte also denk ich schon machbar sein. Wenn nicht, hängen wir einfach noch eine Woche dran, ist ja kein Problem.

Grüße,
Matthias
 
Hi,
kann man mit BrainFuck Dateien speichern? Wenn ja, wäre es überlegenswert, sich wieder damit zu beschäftigen. :)

Ciao
DosCoder
 
Zuletzt bearbeitet:
Zurück