smf 0.15.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MANUAL +172 -0
 - data/MANUAL.en +135 -0
 - data/MANUAL.en.html +150 -0
 - data/MANUAL.en.rd +144 -0
 - data/MANUAL.html +201 -0
 - data/MANUAL.rd +179 -0
 - data/README +33 -0
 - data/README.en +33 -0
 - data/lib/smf.rb +736 -0
 - data/lib/smf/divert.rb +21 -0
 - data/lib/smf/io.rb +1278 -0
 - data/lib/smf/toy/beatmap.rb +73 -0
 - data/lib/smf/toy/gm.rb +327 -0
 - data/lib/smf/toy/groove.rb +34 -0
 - data/lib/smf/toy/macro.rb +282 -0
 - data/lib/smf/toy/macro/mml.rb +34 -0
 - data/lib/smf/toy/macro/mml/parser.rb +545 -0
 - data/lib/smf/toy/macro/mml/parser.ry +239 -0
 - data/lib/smf/toy/macro/stt.rb +33 -0
 - data/lib/smf/toy/morse.rb +126 -0
 - data/lib/smf/toy/quantize.rb +32 -0
 - data/lib/smf/toy/rmi.rb +29 -0
 - data/lib/smf/toy/searchsegment.rb +24 -0
 - data/lib/smf/toy/shuffle.rb +39 -0
 - data/lib/smf/toy/tempomap.rb +75 -0
 - data/lib/smf/toy/text.rb +369 -0
 - data/lib/smf/toy/velcomp.rb +42 -0
 - data/lib/smf/toy/virtual.rb +118 -0
 - data/lib/smf/toy/xml.rb +377 -0
 - data/sample/Makefile +58 -0
 - data/sample/bwv772.mid +0 -0
 - data/sample/bwv772.mml +94 -0
 - data/sample/bwv775.mid +0 -0
 - data/sample/bwv775.mml +157 -0
 - data/sample/bwv787.mid +0 -0
 - data/sample/bwv787.mml +129 -0
 - data/sample/groove.grv +33 -0
 - data/sample/groove.rb +45 -0
 - data/sample/ltvddpd2.mid +0 -0
 - data/sample/ltvddpd2.stt +60 -0
 - data/sample/merge.rb +38 -0
 - data/sample/mml-samp.rb +19 -0
 - data/sample/mml.rb +36 -0
 - data/sample/morse-samp.rb +11 -0
 - data/sample/morse.rb +31 -0
 - data/sample/play-oss.rb +215 -0
 - data/sample/play-oss2.rb +253 -0
 - data/sample/play-oss3.rb +150 -0
 - data/sample/play-spkr.rb +97 -0
 - data/sample/play-win.rb +195 -0
 - data/sample/quantize.rb +41 -0
 - data/sample/rand1.rb +21 -0
 - data/sample/rand2.rb +24 -0
 - data/sample/rmi2smf.rb +26 -0
 - data/sample/shuffle.rb +43 -0
 - data/sample/smf2rmi.rb +26 -0
 - data/sample/smf2smf.rb +26 -0
 - data/sample/smf2text.rb +27 -0
 - data/sample/smf2wav.rb +123 -0
 - data/sample/smf2xml.rb +27 -0
 - data/sample/split.rb +40 -0
 - data/sample/stt-samp.rb +19 -0
 - data/sample/stt.rb +36 -0
 - data/sample/text2smf.rb +28 -0
 - data/sample/velcomp.rb +45 -0
 - data/sample/virtual-samp.rb +19 -0
 - data/sample/xml2smf.rb +28 -0
 - metadata +128 -0
 
    
        data/sample/groove.rb
    ADDED
    
    | 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #! /usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # groove.rb: Written by Tadayoshi Funaba 2005,2006
         
     | 
| 
      
 4 
     | 
    
         
            +
            # $Id: groove.rb,v 1.3 2006-11-10 21:57:06+09 tadf Exp $
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'smf'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'smf/toy/groove'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'gopt'
         
     | 
| 
      
 9 
     | 
    
         
            +
            include  SMF
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            def usage
         
     | 
| 
      
 12 
     | 
    
         
            +
              warn 'usage: groove [-o output] [-a amount] groove [input]'
         
     | 
| 
      
 13 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            usage unless opt = Gopt.gopt('o:a:')
         
     | 
| 
      
 17 
     | 
    
         
            +
            usage unless $*.size >= 1 && $*.size <= 2
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            pat   = $*.shift
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ifile = $*.shift
         
     | 
| 
      
 22 
     | 
    
         
            +
            ifile = nil if ifile == '-'
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            ofile = opt[:o] if opt[:o]
         
     | 
| 
      
 25 
     | 
    
         
            +
            ofile ||= File.basename(ifile, '.mid') + '-groove.mid' if ifile
         
     | 
| 
      
 26 
     | 
    
         
            +
            ofile = nil if ofile == '-'
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            amount = (opt[:a] || '0.5').to_f
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            sq = unless ifile then Sequence.read($stdin) else Sequence.load(ifile) end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            sp = IO.read(pat).scan(/\S+/).collect{|x| x.to_f}
         
     | 
| 
      
 33 
     | 
    
         
            +
            gr = Groove.new(sq.division, sp)
         
     | 
| 
      
 34 
     | 
    
         
            +
            gr.amount = amount
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            sq.each do |tr|
         
     | 
| 
      
 37 
     | 
    
         
            +
              tr.pop
         
     | 
| 
      
 38 
     | 
    
         
            +
              tr.each do |ev|
         
     | 
| 
      
 39 
     | 
    
         
            +
                case ev
         
     | 
| 
      
 40 
     | 
    
         
            +
                when NoteOff, NoteOn
         
     | 
| 
      
 41 
     | 
    
         
            +
                  gr.groove(ev)
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
      
 45 
     | 
    
         
            +
            unless ofile then sq.write($stdout) else sq.save(ofile) end
         
     | 
    
        data/sample/ltvddpd2.mid
    ADDED
    
    | 
         Binary file 
     | 
    
        data/sample/ltvddpd2.stt
    ADDED
    
    | 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            "sq:Les trois valses distingu\351es du pr\351cieux d\351go\373t\351 \
         
     | 
| 
      
 2 
     | 
    
         
            +
            II. Son binocle"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            {
         
     | 
| 
      
 5 
     | 
    
         
            +
              ti=1,4 te=240 gm=1
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              q r
         
     | 
| 
      
 8 
     | 
    
         
            +
            }
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            {
         
     | 
| 
      
 11 
     | 
    
         
            +
              ti=1,4 te=80 pr=0 co91=96 oc=4 du=1 ve=4/10
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              ��'��'���������饷���饷���饷��'��'����'��'����'��'����
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              ����'���������饽�����ե����������ե����������ե���������������������������
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              ��'�饷����'��'��'��'�����'��
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              �åå�,�ɡ��ߡ��ɡ��ߡ��ɡ��ߡ���
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              �ååߥ쥽�ߥ쥽�ߥ졼
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              ��'��'���������饷���饷���� te*=15/16 ve*=2/3
         
     | 
| 
      
 24 
     | 
    
         
            +
                �ե���'��������& ��'��������& �ɡ�''��������& �ե���''��������
         
     | 
| 
      
 25 
     | 
    
         
            +
            }&
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            {
         
     | 
| 
      
 28 
     | 
    
         
            +
              oc=3 du=1 ve=3/10
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              ��
         
     | 
| 
      
 31 
     | 
    
         
            +
              �� ��'��& �ե���'�� ��' ��'��& ��'��
         
     | 
| 
      
 32 
     | 
    
         
            +
              �� ��'��& �ե���'�� ��' ��'��& ��'��
         
     | 
| 
      
 33 
     | 
    
         
            +
              �� ��'��& �ե���'�� ��' ��'��& ��'��
         
     | 
| 
      
 34 
     | 
    
         
            +
              �� ��'��& �ե���'�� ��' ��'��& ��'��
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              �� ����& ���'�� �� ����& ��'��
         
     | 
| 
      
 37 
     | 
    
         
            +
              �� ����& ���'�� �� ����& ��'��
         
     | 
| 
      
 38 
     | 
    
         
            +
              �� ����& ���'�� �� ����& ��'��
         
     | 
| 
      
 39 
     | 
    
         
            +
              �� ����& ���'�� �� ����& ��'��
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              �ե� ��'��& ��'�� ���� ��'��& �ե�'��
         
     | 
| 
      
 42 
     | 
    
         
            +
              �ե� ��'��& ��'�� ���� ��'��& �ե�'��
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              {ve*=8/10 ��, �ߡ�& ������ �� �ߡ�& �顼
         
     | 
| 
      
 45 
     | 
    
         
            +
                        ��, �ߡ�& ������ �� �ߡ�& �顼}
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              �ե�, �ɡ�& �ߡ� ����, �ɡ�& �ե���
         
     | 
| 
      
 48 
     | 
    
         
            +
              �ե�, �ɡ�& �ߡ� ����, �ɡ�& �ե���
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              �� ��'��& �ե���'�� ��' ��'��& ��'��
         
     | 
| 
      
 51 
     | 
    
         
            +
              �� ��'��& �ե���'�� ��' ��'��& ��'��
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              ve*=2/3 ��'��������
         
     | 
| 
      
 54 
     | 
    
         
            +
            }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            {
         
     | 
| 
      
 57 
     | 
    
         
            +
              ti=1,4 te=240
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              q r
         
     | 
| 
      
 60 
     | 
    
         
            +
            }
         
     | 
    
        data/sample/merge.rb
    ADDED
    
    | 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #! /usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # merge.rb: Written by Tadayoshi Funaba 1999-2006
         
     | 
| 
      
 4 
     | 
    
         
            +
            # $Id: merge.rb,v 1.10 2006-11-10 21:57:06+09 tadf Exp $
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'smf'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'smf/divert'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'gopt'
         
     | 
| 
      
 9 
     | 
    
         
            +
            include  SMF
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            def usage
         
     | 
| 
      
 12 
     | 
    
         
            +
              warn 'usage: merge [-o output] [input]'
         
     | 
| 
      
 13 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 14 
     | 
    
         
            +
            end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            usage unless opt = Gopt.gopt('o:')
         
     | 
| 
      
 17 
     | 
    
         
            +
            usage unless $*.size >= 0 && $*.size <= 1
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            ifile = $*.shift
         
     | 
| 
      
 20 
     | 
    
         
            +
            ifile = nil if ifile == '-'
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            ofile = opt[:o] if opt[:o]
         
     | 
| 
      
 23 
     | 
    
         
            +
            ofile ||= File.basename(ifile, '.mid') + '-merge.mid' if ifile
         
     | 
| 
      
 24 
     | 
    
         
            +
            ofile = nil if ofile == '-'
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            sq = unless ifile then Sequence.read($stdin) else Sequence.load(ifile) end
         
     | 
| 
      
 27 
     | 
    
         
            +
            nsq = Sequence.new(0, sq.division, sq.tc)
         
     | 
| 
      
 28 
     | 
    
         
            +
            eot = []
         
     | 
| 
      
 29 
     | 
    
         
            +
            sq.each do |tr|
         
     | 
| 
      
 30 
     | 
    
         
            +
              tr.divert(nsq) do |ev|
         
     | 
| 
      
 31 
     | 
    
         
            +
                case ev
         
     | 
| 
      
 32 
     | 
    
         
            +
                when EndOfTrack; eot << ev; nil
         
     | 
| 
      
 33 
     | 
    
         
            +
                else; 0
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
            end
         
     | 
| 
      
 37 
     | 
    
         
            +
            nsq[0] << eot.max unless eot.empty?
         
     | 
| 
      
 38 
     | 
    
         
            +
            unless ofile then nsq.write($stdout) else nsq.save(ofile) end
         
     | 
    
        data/sample/mml-samp.rb
    ADDED
    
    | 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #! /usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # mml-samp.rb: Written by Tadayoshi Funaba 2005
         
     | 
| 
      
 4 
     | 
    
         
            +
            # $Id: mml-samp.rb,v 1.1 2005-07-17 17:16:18+09 tadf Exp $
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'smf/toy/macro/mml'
         
     | 
| 
      
 7 
     | 
    
         
            +
            include SMF
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            sq = Sequence.new
         
     | 
| 
      
 10 
     | 
    
         
            +
            mm = MML.new(sq)
         
     | 
| 
      
 11 
     | 
    
         
            +
            mm << 'gm=1 r ch=0 pr=0'
         
     | 
| 
      
 12 
     | 
    
         
            +
            12.times do
         
     | 
| 
      
 13 
     | 
    
         
            +
              mm << "{q c# h c# q r}&"
         
     | 
| 
      
 14 
     | 
    
         
            +
              mm << "{q d# h d# q r}&"
         
     | 
| 
      
 15 
     | 
    
         
            +
              mm << "{q a  h a  q r}"
         
     | 
| 
      
 16 
     | 
    
         
            +
              mm << "oc += 1/12"
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
      
 18 
     | 
    
         
            +
            mm.generate
         
     | 
| 
      
 19 
     | 
    
         
            +
            sq.save('mml-samp.mid')
         
     | 
    
        data/sample/mml.rb
    ADDED
    
    | 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #! /usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # mml.rb: Written by Tadayoshi Funaba 1999-2006
         
     | 
| 
      
 4 
     | 
    
         
            +
            # $Id: mml.rb,v 1.4 2006-11-10 21:57:06+09 tadf Exp $
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'smf/toy/macro/mml'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'gopt'
         
     | 
| 
      
 8 
     | 
    
         
            +
            include SMF
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            def usage
         
     | 
| 
      
 11 
     | 
    
         
            +
              warn 'usage: mml [-o output] [-e command] [input]'
         
     | 
| 
      
 12 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 13 
     | 
    
         
            +
            end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            usage unless opt = Gopt.gopt('o:e:')
         
     | 
| 
      
 16 
     | 
    
         
            +
            usage unless $*.size >= 0 && $*.size <= 1
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            ifile = $*.shift
         
     | 
| 
      
 19 
     | 
    
         
            +
            ifile = nil if ifile == '-'
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ofile = opt[:o] if opt[:o]
         
     | 
| 
      
 22 
     | 
    
         
            +
            ofile ||= File.basename(ifile, '.mml') + '.mid' if ifile
         
     | 
| 
      
 23 
     | 
    
         
            +
            ofile = nil if ofile == '-'
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            so = opt[:e] if opt[:e]
         
     | 
| 
      
 26 
     | 
    
         
            +
            so ||= unless ifile then $stdin.read else IO.read(ifile) end
         
     | 
| 
      
 27 
     | 
    
         
            +
            sq = Sequence.new(1, 480)
         
     | 
| 
      
 28 
     | 
    
         
            +
            mm = MML.new(sq)
         
     | 
| 
      
 29 
     | 
    
         
            +
            mm << so
         
     | 
| 
      
 30 
     | 
    
         
            +
            begin
         
     | 
| 
      
 31 
     | 
    
         
            +
              mm.generate
         
     | 
| 
      
 32 
     | 
    
         
            +
            rescue ParseError
         
     | 
| 
      
 33 
     | 
    
         
            +
              warn format('%s: %s', (opt[:e] && '-e') || ifile || '(stdin)', $!)
         
     | 
| 
      
 34 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
      
 36 
     | 
    
         
            +
            unless ofile then sq.write($stdout) else sq.save(ofile) end
         
     | 
| 
         @@ -0,0 +1,11 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # morse-samp.rb: Written by Tadayoshi Funaba 2005
         
     | 
| 
      
 2 
     | 
    
         
            +
            # $Id: morse-samp.rb,v 1.2 2005-07-17 17:16:18+09 tadf Exp $
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require 'smf/toy/morse'
         
     | 
| 
      
 5 
     | 
    
         
            +
            include SMF
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            sq = Sequence.new
         
     | 
| 
      
 8 
     | 
    
         
            +
            mo = Morse.new(sq)
         
     | 
| 
      
 9 
     | 
    
         
            +
            mo << 'hello world'
         
     | 
| 
      
 10 
     | 
    
         
            +
            mo.generate
         
     | 
| 
      
 11 
     | 
    
         
            +
            sq.save('morse-samp.mid')
         
     | 
    
        data/sample/morse.rb
    ADDED
    
    | 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #! /usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # morse.rb: Written by Tadayoshi Funaba 2005,2006
         
     | 
| 
      
 4 
     | 
    
         
            +
            # $Id
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'smf/toy/morse'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'gopt'
         
     | 
| 
      
 8 
     | 
    
         
            +
            include SMF
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            def usage
         
     | 
| 
      
 11 
     | 
    
         
            +
              warn 'usage: morse [-o output] [-e message] [input]'
         
     | 
| 
      
 12 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 13 
     | 
    
         
            +
            end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            usage unless opt = Gopt.gopt('o:e:')
         
     | 
| 
      
 16 
     | 
    
         
            +
            usage unless $*.size >= 0 && $*.size <= 1
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            ifile = $*.shift
         
     | 
| 
      
 19 
     | 
    
         
            +
            ifile = nil if ifile == '-'
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ofile = opt[:o] if opt[:o]
         
     | 
| 
      
 22 
     | 
    
         
            +
            ofile ||= File.basename(ifile, '.txt') + '.mid' if ifile
         
     | 
| 
      
 23 
     | 
    
         
            +
            ofile = nil if ofile == '-'
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            so = opt[:e] if opt[:e]
         
     | 
| 
      
 26 
     | 
    
         
            +
            so ||= unless ifile then $stdin.read else IO.read(ifile) end
         
     | 
| 
      
 27 
     | 
    
         
            +
            sq = Sequence.new
         
     | 
| 
      
 28 
     | 
    
         
            +
            mo = Morse.new(sq)
         
     | 
| 
      
 29 
     | 
    
         
            +
            mo << so
         
     | 
| 
      
 30 
     | 
    
         
            +
            mo.generate
         
     | 
| 
      
 31 
     | 
    
         
            +
            unless ofile then sq.write($stdout) else sq.save(ofile) end
         
     | 
    
        data/sample/play-oss.rb
    ADDED
    
    | 
         @@ -0,0 +1,215 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #! /usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # play-oss.rb: Written by Tadayoshi Funaba 1999-2006
         
     | 
| 
      
 4 
     | 
    
         
            +
            # $Id: play-oss.rb,v 1.23 2006-11-10 21:57:06+09 tadf Exp $
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'smf'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'smf/toy/tempomap'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'gopt'
         
     | 
| 
      
 9 
     | 
    
         
            +
            include  SMF
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            module SMF
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              class DevSeq < File
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def putbuf(s)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @buf ||= ''
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if @buf.size > 4096
         
     | 
| 
      
 18 
     | 
    
         
            +
            	dumpbuf
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @buf << s
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def dumpbuf
         
     | 
| 
      
 24 
     | 
    
         
            +
                  syswrite(@buf)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @buf = ''
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                EV_TIMING = 0x81
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def timer_event(ev, parm)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  putbuf([EV_TIMING, ev, 0, 0, parm].pack('C4I'))
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                private :timer_event
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                TMR_START = 4
         
     | 
| 
      
 37 
     | 
    
         
            +
                TMR_STOP = 3
         
     | 
| 
      
 38 
     | 
    
         
            +
                TMR_WAIT_ABS = 2
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                def start_timer() timer_event(TMR_START, 0) end
         
     | 
| 
      
 41 
     | 
    
         
            +
                def stop_timer() timer_event(TMR_STOP, 0) end
         
     | 
| 
      
 42 
     | 
    
         
            +
                def wait_time(ticks) timer_event(TMR_WAIT_ABS, ticks) end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                SEQ_MIDIPUTC = 5
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def midiout(device, byte)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  putbuf([SEQ_MIDIPUTC, byte, device, 0].pack('C4'))
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                case RUBY_PLATFORM
         
     | 
| 
      
 51 
     | 
    
         
            +
                when /freebsd/
         
     | 
| 
      
 52 
     | 
    
         
            +
                  SNDCTL_SEQ_CTRLRATE = 0xc0045103
         
     | 
| 
      
 53 
     | 
    
         
            +
                  SNDCTL_SEQ_NRMIDIS  = 0x4004510b
         
     | 
| 
      
 54 
     | 
    
         
            +
                  SNDCTL_MIDI_INFO = 0xc074510c
         
     | 
| 
      
 55 
     | 
    
         
            +
                when /linux/
         
     | 
| 
      
 56 
     | 
    
         
            +
                  SNDCTL_SEQ_CTRLRATE = 0xc0045103
         
     | 
| 
      
 57 
     | 
    
         
            +
                  SNDCTL_SEQ_NRMIDIS  = 0x8004510b
         
     | 
| 
      
 58 
     | 
    
         
            +
                  SNDCTL_MIDI_INFO = 0xc074510c
         
     | 
| 
      
 59 
     | 
    
         
            +
                else
         
     | 
| 
      
 60 
     | 
    
         
            +
                  raise 'unknown system'
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                def ctrlrate
         
     | 
| 
      
 64 
     | 
    
         
            +
                  n = [0].pack('i')
         
     | 
| 
      
 65 
     | 
    
         
            +
                  ioctl(SNDCTL_SEQ_CTRLRATE, n)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  n.unpack('i')[0]
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                def nrmidis
         
     | 
| 
      
 70 
     | 
    
         
            +
                  n = [0].pack('i')
         
     | 
| 
      
 71 
     | 
    
         
            +
                  ioctl(SNDCTL_SEQ_NRMIDIS, n)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  n.unpack('i')[0]
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                def midi_info(dev)
         
     | 
| 
      
 76 
     | 
    
         
            +
                  templ = 'A30x2iLix72'
         
     | 
| 
      
 77 
     | 
    
         
            +
                  a = [0] * 22
         
     | 
| 
      
 78 
     | 
    
         
            +
                  a[0] = ''
         
     | 
| 
      
 79 
     | 
    
         
            +
                  a[1] = dev
         
     | 
| 
      
 80 
     | 
    
         
            +
                  n = a.pack(templ)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  ioctl(SNDCTL_MIDI_INFO, n)
         
     | 
| 
      
 82 
     | 
    
         
            +
                  n.unpack(templ)
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
              end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
              class Sequence
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                class Play < XSCallback
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                  def initialize(tm, num) @tm, @num = tm, num end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                  def header(format, ntrks, division, tc)
         
     | 
| 
      
 94 
     | 
    
         
            +
            	@sq = DevSeq.open('/dev/sequencer', 'w')
         
     | 
| 
      
 95 
     | 
    
         
            +
            	puts(@sq.midi_info(@num)[0]) if $VERBOSE
         
     | 
| 
      
 96 
     | 
    
         
            +
            	unless @num < @sq.nrmidis
         
     | 
| 
      
 97 
     | 
    
         
            +
            	  raise 'device not available'
         
     | 
| 
      
 98 
     | 
    
         
            +
            	end
         
     | 
| 
      
 99 
     | 
    
         
            +
            	@ctrlrate = @sq.ctrlrate
         
     | 
| 
      
 100 
     | 
    
         
            +
                  end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                  def track_start() @offset = 0 end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                  def delta(delta)
         
     | 
| 
      
 105 
     | 
    
         
            +
            	@start_timer ||= (@sq.start_timer; true)
         
     | 
| 
      
 106 
     | 
    
         
            +
            	if delta.nonzero?
         
     | 
| 
      
 107 
     | 
    
         
            +
            	  @offset += delta
         
     | 
| 
      
 108 
     | 
    
         
            +
            	  e = @tm.offset2elapse(@offset)
         
     | 
| 
      
 109 
     | 
    
         
            +
            	  @sq.wait_time((e * @ctrlrate).to_i)
         
     | 
| 
      
 110 
     | 
    
         
            +
            	end
         
     | 
| 
      
 111 
     | 
    
         
            +
                  end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
                  def noteoff(ch, note, vel)
         
     | 
| 
      
 114 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0x80)
         
     | 
| 
      
 115 
     | 
    
         
            +
            	@sq.midiout(@num, note)
         
     | 
| 
      
 116 
     | 
    
         
            +
            	@sq.midiout(@num, vel)
         
     | 
| 
      
 117 
     | 
    
         
            +
                  end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                  def noteon(ch, note, vel)
         
     | 
| 
      
 120 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0x90)
         
     | 
| 
      
 121 
     | 
    
         
            +
            	@sq.midiout(@num, note)
         
     | 
| 
      
 122 
     | 
    
         
            +
            	@sq.midiout(@num, vel)
         
     | 
| 
      
 123 
     | 
    
         
            +
                  end
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
                  def polyphonickeypressure(ch, note, val)
         
     | 
| 
      
 126 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0xa0)
         
     | 
| 
      
 127 
     | 
    
         
            +
            	@sq.midiout(@num, note)
         
     | 
| 
      
 128 
     | 
    
         
            +
            	@sq.midiout(@num, val)
         
     | 
| 
      
 129 
     | 
    
         
            +
                  end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                  def controlchange(ch, num, val)
         
     | 
| 
      
 132 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0xb0)
         
     | 
| 
      
 133 
     | 
    
         
            +
            	@sq.midiout(@num, num)
         
     | 
| 
      
 134 
     | 
    
         
            +
            	@sq.midiout(@num, val)
         
     | 
| 
      
 135 
     | 
    
         
            +
                  end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                  def programchange(ch, num)
         
     | 
| 
      
 138 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0xc0)
         
     | 
| 
      
 139 
     | 
    
         
            +
            	@sq.midiout(@num, num)
         
     | 
| 
      
 140 
     | 
    
         
            +
                  end
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
                  def channelpressure(ch, val)
         
     | 
| 
      
 143 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0xd0)
         
     | 
| 
      
 144 
     | 
    
         
            +
            	@sq.midiout(@num, val)
         
     | 
| 
      
 145 
     | 
    
         
            +
                  end
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                  def pitchbendchange(ch, val)
         
     | 
| 
      
 148 
     | 
    
         
            +
            	@sq.midiout(@num, ch | 0xe0)
         
     | 
| 
      
 149 
     | 
    
         
            +
            	val += 0x2000
         
     | 
| 
      
 150 
     | 
    
         
            +
            	lsb =  val       & 0x7f
         
     | 
| 
      
 151 
     | 
    
         
            +
            	msb = (val >> 7) & 0x7f
         
     | 
| 
      
 152 
     | 
    
         
            +
            	@sq.midiout(@num, lsb)
         
     | 
| 
      
 153 
     | 
    
         
            +
            	@sq.midiout(@num, msb)
         
     | 
| 
      
 154 
     | 
    
         
            +
                  end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
                  def channelmodemessage(ch, num, val) controlchange(ch, num, val) end
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                  private :channelmodemessage
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
                  def allsoundoff(ch) channelmodemessage(ch, 0x78, 0) end
         
     | 
| 
      
 161 
     | 
    
         
            +
                  def resetallcontrollers(ch) channelmodemessage(ch, 0x79, 0) end
         
     | 
| 
      
 162 
     | 
    
         
            +
                  def localcontrol(ch, val) channelmodemessage(ch, 0x7a, val) end
         
     | 
| 
      
 163 
     | 
    
         
            +
                  def allnotesoff(ch) channelmodemessage(ch, 0x7b, 0) end
         
     | 
| 
      
 164 
     | 
    
         
            +
                  def omnioff(ch) channelmodemessage(ch, 0x7c, 0) end
         
     | 
| 
      
 165 
     | 
    
         
            +
                  def omnion(ch) channelmodemessage(ch, 0x7d, 0) end
         
     | 
| 
      
 166 
     | 
    
         
            +
                  def monomode(ch, val) channelmodemessage(ch, 0x7e, val) end
         
     | 
| 
      
 167 
     | 
    
         
            +
                  def polymode(ch) channelmodemessage(ch, 0x7f, 0) end
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
                  def exclusivefx(data)
         
     | 
| 
      
 170 
     | 
    
         
            +
            	data.each_byte do |x|
         
     | 
| 
      
 171 
     | 
    
         
            +
            	  @sq.midiout(@num, x)
         
     | 
| 
      
 172 
     | 
    
         
            +
            	end
         
     | 
| 
      
 173 
     | 
    
         
            +
                  end
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
                  private :exclusivefx
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
                  def exclusivef0(data)
         
     | 
| 
      
 178 
     | 
    
         
            +
            	@sq.midiout(@num, 0xf0)
         
     | 
| 
      
 179 
     | 
    
         
            +
            	exclusivefx(data)
         
     | 
| 
      
 180 
     | 
    
         
            +
                  end
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
                  def exclusivef7(data) exclusivefx(data) end
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
                  def result
         
     | 
| 
      
 185 
     | 
    
         
            +
            	@sq.dumpbuf
         
     | 
| 
      
 186 
     | 
    
         
            +
            	@sq.stop_timer
         
     | 
| 
      
 187 
     | 
    
         
            +
            	@sq.close
         
     | 
| 
      
 188 
     | 
    
         
            +
                  end
         
     | 
| 
      
 189 
     | 
    
         
            +
             
     | 
| 
      
 190 
     | 
    
         
            +
                end
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
      
 192 
     | 
    
         
            +
                def play(num=0)
         
     | 
| 
      
 193 
     | 
    
         
            +
                  j = join
         
     | 
| 
      
 194 
     | 
    
         
            +
                  tm = TempoMap.new(j)
         
     | 
| 
      
 195 
     | 
    
         
            +
                  WS.new(j, Play.new(tm, num)).read
         
     | 
| 
      
 196 
     | 
    
         
            +
                end
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
              end
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
            end
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
      
 202 
     | 
    
         
            +
            def usage
         
     | 
| 
      
 203 
     | 
    
         
            +
              warn 'usage: play-oss [-d num] [input]'
         
     | 
| 
      
 204 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 205 
     | 
    
         
            +
            end
         
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
            usage unless opt = Gopt.gopt('d:')
         
     | 
| 
      
 208 
     | 
    
         
            +
            usage unless $*.size >= 0 && $*.size <= 1
         
     | 
| 
      
 209 
     | 
    
         
            +
            file = $*.shift
         
     | 
| 
      
 210 
     | 
    
         
            +
            file = nil if file == '-'
         
     | 
| 
      
 211 
     | 
    
         
            +
             
     | 
| 
      
 212 
     | 
    
         
            +
            num = (opt[:d] || '0').to_i
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
            sq = unless file then Sequence.read($stdin) else Sequence.load(file) end
         
     | 
| 
      
 215 
     | 
    
         
            +
            sq.play(num)
         
     |