summaryrefslogtreecommitdiff
path: root/jni/ruby/sample/trick2013/mame/remarks.markdown
blob: 8c1988c8099e951382aa0e248f6494334016dac6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
### Remarks

Run the program under a platform that `/dev/dsp` is available.
For example, if you are using pulseaudio, use `padsp`:

    padsp ruby entry.rb

Please see Limitation if you want to run this program on os x.

I confirmed the following platforms.

* ruby 2.0.0p0 (2013-02-24 revision 39474) [x86\_64-linux]
* ruby 1.9.3p194 (2012-04-20 revision 35410) [x86\_64-linux]
* ruby 1.9.3p327 (2012-11-10 revision 37606) [x86\_64-darwin10.8.0]

For those who are lazy, I'm attaching a screencast.

### Description

This program is a music-box quine.
It prints itself with playing "Jesu, Joy of Man's Desiring".

### Internal

Like a real music box, this program consists of a mechanical part (code) and a piano roll.
In the piano roll, `#` represents a pin that hits a note, and `|` represents a slur.
The leftmost column corresponds 110Hz (low A).
Every column corresponds a semitone higher than the left one.

This program uses [the frequency modulation synthesis](http://en.wikipedia.org/wiki/Frequency_modulation_synthesis) to play the sound like a music-box.
You can create a different-sounding tone by changing the parameter.
For example, the following will play the sound like a harpsichord.

    padsp ruby entry.rb 2.0

Note that this program does *not* use an idiom to remove whitespace, such as `.split.join`.  All newlines and spaces do not violate any of the Ruby syntax rules.

### Limitation

On os x, `/dev/dsp` is not available.
You have to use sox by replacing the following part:

    open("/dev/dsp","wb")

with:

    IO.popen("./pl","wb")