diff options
Diffstat (limited to 'jni/ruby/sample/trick2013/mame')
-rw-r--r-- | jni/ruby/sample/trick2013/mame/authors.markdown | 3 | ||||
-rw-r--r-- | jni/ruby/sample/trick2013/mame/entry.rb | 97 | ||||
-rw-r--r-- | jni/ruby/sample/trick2013/mame/music-box.mp4 | bin | 0 -> 580724 bytes | |||
-rw-r--r-- | jni/ruby/sample/trick2013/mame/remarks.markdown | 47 |
4 files changed, 147 insertions, 0 deletions
diff --git a/jni/ruby/sample/trick2013/mame/authors.markdown b/jni/ruby/sample/trick2013/mame/authors.markdown new file mode 100644 index 0000000..e99cd71 --- /dev/null +++ b/jni/ruby/sample/trick2013/mame/authors.markdown @@ -0,0 +1,3 @@ +* Yusuke Endoh + * mame@tsg.ne.jp + * cctld: jp diff --git a/jni/ruby/sample/trick2013/mame/entry.rb b/jni/ruby/sample/trick2013/mame/entry.rb new file mode 100644 index 0000000..8abfc2b --- /dev/null +++ b/jni/ruby/sample/trick2013/mame/entry.rb @@ -0,0 +1,97 @@ + eval$C=%q(at_exit{ + open("/dev/dsp","wb"){|g|h=[0]*80 + $><<"\s"*18+"eval$C=%q(#$C);S=%:" + (S<<m=58).lines{|l|s=[128]*n=20E2 + t=0; h.map!{|v|d=?!==l[ + t]?1 :(l[ + t]== ?#)? + 0*v= 6:03 + (v<1 ?[]: + 0..n -1). + each {|z| + s[z] +=2* + M.sin(($*[0] ||1) + .to_f*M.sin(y= 40*(z+m)*2** + (t/12E0)/463)+ y)*(v-z*d/n)}; + t+=1;v-d};m+= n;g.flush<<(s. + pack"C*"); puts(l)}}};M= + Math);S=%: + + Jesu, Joy of Man's Desiring + Johann Sebastian Bach + + # + | # + | # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # + # # # # + | | | # + | #| # + # # | # + | | | # + | | # # + # # # # + | | # | + | | # # + # # # # + | | | # + | | # + # # # # + | | # | + | # # | + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | | # # + # # # # + | | | # + | # # + # # # + | | | # + | # | # + # # # # + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + | | | : diff --git a/jni/ruby/sample/trick2013/mame/music-box.mp4 b/jni/ruby/sample/trick2013/mame/music-box.mp4 Binary files differnew file mode 100644 index 0000000..6d1e87c --- /dev/null +++ b/jni/ruby/sample/trick2013/mame/music-box.mp4 diff --git a/jni/ruby/sample/trick2013/mame/remarks.markdown b/jni/ruby/sample/trick2013/mame/remarks.markdown new file mode 100644 index 0000000..8c1988c --- /dev/null +++ b/jni/ruby/sample/trick2013/mame/remarks.markdown @@ -0,0 +1,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")
\ No newline at end of file |