a hard day's night

http://wiredvision.jp/news/200811/2008110622.html
ということでこれの譜面どおりMIDIファイル作ってみた。


無題 ハデナ
楽器が違うからなんとも。


あわせて
http://wiredvision.jp/blog/takamori/200811/200811061200.html
こんな説も。
俺的には科学で音楽を解析と言うのはとてもとても夢があって好きなんだけど今回はこっち支持かな。
ジョン・レノンのパートが不自然と言うくだりはとても納得。


もとの曲を耳で聞く感じ、ピアノっぽい下のDの音が
4分あと位に聞こえる気がするのだけどどうなんだろう。F、Dって。

続Ruby 1.9.1 preview 1

make installしてからもう一度make test-allしてみた。

  1) Failure:
test_systemcallerror_eq(TestDelegateClass) [/home/*/src/ruby-1.9.1-preview1/test/test_delegate.rb:18]:
[ruby-dev:34808]

  2) Failure:
test_handle_special_CROSSREF_no_underscore(TestRDocMarkupToHtmlCrossref) [/home/*/src/ruby-1.9.1-preview1/test/rdoc/test_rdoc_markup_to_html_crossref.rb:87]:
Expected "<p> <a href=\"../files/home/*/src/ruby-1_9_1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference_rb.html\">/home/*/src/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb</a> </p> ", not "<p> /home/*/src/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb </p> ".

  3) Failure:
test_priority(TestThread) [/home/*/src/ruby-1.9.1-preview1/test/ruby/test_thread.rb:129]:
[ruby-dev:33124]

5641 tests, 2466641 assertions, 3 failures, 0 errors, 0 skips

Ruby 1.9.1 preview 1

[ruby-dev:36972] [ANN] Ruby 1.9.1 preview 1リリース
Ruby 1.9.1 preview 1出たのでtest-allしてみた。VMware上。

Linux * 2.6.24-19-generic #1 SMP Wed Aug 20 22:56:21 UTC 2008 i686 GNU/Linux
Distributor ID: Ubuntu
Description:    Ubuntu 8.04.1
Release:        8.04
Codename:       hardy
  1) Failure:
test_systemcallerror_eq(TestDelegateClass) [/home/*/src/ruby-1.9.1-preview1/test/test_delegate.rb:18]:
[ruby-dev:34808]

  2) Error:
test_class_build(TestGemExtExtConfBuilder):
Gem::InstallError: extconf failed:

/usr/local/bin/ruby extconf.rb
/home/*/src/ruby-1.9.1-preview1/rbconfig.rb:7: ruby lib version (1.9.1) doesn't match executable version (1.8.7) (RuntimeError)
        from /home/*/src/ruby-1.9.1-preview1/lib/mkmf.rb:4:in `require'
        from /home/*/src/ruby-1.9.1-preview1/lib/mkmf.rb:4
        from extconf.rb:1:in `require'
        from extconf.rb:1

    /home/*/src/ruby-1.9.1-preview1/test/rubygems/test_gem_ext_ext_conf_builder.rb:24:in `block in test_class_build'
    /home/*/src/ruby-1.9.1-preview1/test/rubygems/test_gem_ext_ext_conf_builder.rb:23:in `chdir'
    /home/*/src/ruby-1.9.1-preview1/test/rubygems/test_gem_ext_ext_conf_builder.rb:23:in `test_class_build'

  3) Failure:
test_class_build_extconf_fail(TestGemExtExtConfBuilder) [/home/*/src/ruby-1.9.1-preview1/test/rubygems/test_gem_ext_ext_conf_builder.rb:66]:
Expected "extconf failed:\n\n/usr/local/bin/ruby extconf.rb\n/home/*/src/ruby-1.9.1-preview1/rbconfig.rb:7: ruby lib version (1.9.1) doesn't match executable version (1.8.7) (RuntimeError)\n\tfrom /home/*/src/ruby-1.9.1-preview1/lib/mkmf.rb:4:in `require'\n\tfrom /home/*/src/ruby-1.9.1-preview1/lib/mkmf.rb:4\n\tfrom extconf.rb:1:in `require'\n\tfrom extconf.rb:1\n" to match /\Aextconf failed:

\/usr\/local\/bin\/ruby extconf.rb.*
checking for main\(\) in .*?nonexistent/m.

  4) Failure:
test_execopts_env(TestProcess) [/home/*/src/ruby-1.9.1-preview1/test/ruby/test_process.rb:209]:
<"PATH\n"> expected but was
<"">.

  5) Failure:
test_execopts_unsetenv_others(TestProcess) [/home/*/src/ruby-1.9.1-preview1/test/ruby/test_process.rb:227]:
<"A=B\n"> expected but was
<"">.

  6) Failure:
test_handle_special_CROSSREF_no_underscore(TestRDocMarkupToHtmlCrossref) [/home/*/src/ruby-1.9.1-preview1/test/rdoc/test_rdoc_markup_to_html_crossref.rb:87]:
Expected "<p> <a href=\"../files/home/*/src/ruby-1_9_1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference_rb.html\">/home/*/src/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb</a> </p> ", not "<p> /home/*/src/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb </p> ".

  7) Failure:
test_exit_action(TestSignal) [/home/*/src/ruby-1.9.1-preview1/test/ruby/test_signal.rb:52]:
[ruby-dev:26128].
Exception raised:
<#<Timeout::Error: execution expired>>.

  8) Failure:
test_priority(TestThread) [/home/*/src/ruby-1.9.1-preview1/test/ruby/test_thread.rb:129]:
[ruby-dev:33124]

5641 tests, 2466630 assertions, 7 failures, 1 errors, 0 skips
make: *** [test-all] エラー 1

プログラミング言語Cyan

Cyan, Yet Another New language - takuto_hの日記

新しい言語らしいのだけど。作者のプログラム暦約1年とかすごすぎね?
俺がプログラム暦1年の頃なんてたぶん予約語の書き取りとかしてたよ。
でもCyanなら予約語ないみたいなんで書き取りしないでいいですね。

fib = ^(n):
  if(n < 2):
    n
   else:
    fib(n-2)+fib(n-1)

say fib(15)

みんな大好きフィボナッチ。
インデントの感じが独特な印象かなあ。if>else>中身の順を守る必要あり。


特徴であるところのマクロとか試すべきなんだろうけどすみません(lisp的な)マクロ良く分かってないです勉強します。


ソースはC#書かれててRakefileがあるので試してみたらrake一発で普通にコンパイルできた。
せっかくなんでVC#でコンパイルしてみるに

CSC = "csc"
def options
  ["-out:#{DESTDIR}/Cyan.exe", *SRC_FILES.map{|e|e.gsub('/', '\\\\')}]
end

こんな感じに書き換え。Cygwin上でrakeでコンパイル通ってtest.cyも普通にOKだった。


あと関係ないけど

task "countline" do
  count =
    SRC_FILES.inject(0) do |count, name|
      print "#{name}: "
      puts c = IO.readlines(name).size
      count + c
    end
  puts "Total: #{count}"
end

行数数えるのはこんな感じのが好み。

Waveデータを作って再生する

あい今度はオンメモリーのデータを作ってすぐ再生。
今度は矩形波にしてみたよスクウェアウェイブ。
(i>>7&1)*255ここね。128サンプルごとに0と255を繰り返すデータになります。
関係ないけど矩形波倶楽部のCDにT-SQUAREのメンバーが参加してるのは
やっぱり矩形とSQUARE掛けてるのか。


メモとしてPythonの配列はinsertメソッドで拡張と設定ができるのね。
慣れねえ。

import clr

clr.AddReference('System')
clr.AddReference('System.Windows.Forms')
clr.AddReference('Microsoft.DirectX.DirectSound')

from System import *
from System.Windows.Forms import *
from Microsoft.DirectX.DirectSound import *

class PlaySound2(Form):
    def format(self):
        fmt = WaveFormat()
        fmt.SamplesPerSecond = 44100
        fmt.BitsPerSample = Int16(8)
        fmt.Channels = Int16(1)

        fmt.FormatTag = Int16(WaveFormatTag.Pcm)
        fmt.BlockAlign = Int16(fmt.Channels * fmt.BitsPerSample / 8)
        fmt.AverageBytesPerSecond = fmt.BlockAlign * fmt.SamplesPerSecond
        return fmt

    def description(self, length):
        desc = BufferDescription(self.format())
        desc.BufferBytes = length
        desc.ControlPositionNotify = True
        desc.GlobalFocus = True
        return desc

    def __init__(self):
        wave = []
        for i in range(44100 * 2):
            wave.insert(i, (i>>7&1)*255)

        self.device = Device()
        self.device.SetCooperativeLevel(self, CooperativeLevel.Normal)

        self.buffer = SecondaryBuffer(self.description(len(wave)), self.device)
        self.buffer.Write(0, Array[Byte](wave), LockFlag.EntireBuffer)
        self.buffer.Play(0, BufferPlayFlags.Default)

    def Dispose(self, disposing):
        if(disposing):
            if(self.buffer):
                self.buffer.Stop()
                self.buffer.Dispose()

            if(self.device):
                self.device.Dispose()

        Form.Dispose(self, disposing)

Application.Run(PlaySound2())

Waveファイルを作る

44100Hz、8bit、モノラルで2秒間、ノコギリウェーブを鳴らします。
ノコギリウェーブって言葉の響きが面白い。

音程は適当。えーと周期が256サンプルだから(44100/256)Hzになるのかな。
しかしWaveファイルって結構簡単に作れるのね。

open("b.wav", 'w'){|f|
  rate = 44100 #Hz
  sample = 8   #bit
  ch = 1
  sec = 2

  speed = rate*sample*ch/8 #bytes per sec
  size = speed * sec
  fileSize = size + 36
  fmtSize = 16

  f.print("RIFF",
          [fileSize].pack('V'),
          "WAVE",
          "fmt ",
          [fmtSize].pack('V'),

          [1].pack('v'),          #pcm
          [ch].pack('v'),
          [rate].pack('V'),
          [speed].pack('V'),
          [sample*ch/8].pack('v'),#block(byte)
          [sample].pack('v'),     #sample(bit)
          "data");

  wave = []
  size.to_i.times{|i|
    wave[i] = i % 256
  }

  f.print([wave.size].pack('V'),
          wave.pack("C*"));
}