vieweditattachhistoryswikistopchangessearchhelp

遊び場13

このページの最後

僕もNHKのテレビを見てから Squeak にハマリ、最近 swiki にも手を出しています。早く使いこなせるようになりたいです。 - tak
あ、日付は自分で入れるんですね。 - tak - 2002-12-05, 11:00:00

日付は + の後に @ を追記しておきます。昔は自動で入れるようにしていたのですが、Swiki のバージョンアップでこのオプションが用意されたので、昔、作られたページで + のみのところは、日付が入らなくなってしまっています。--sumim - 2002-12-05, 12:07:21

最近は、ネット上の Squeak のチュートリアルもいろいろなレベルで充実しつつありますので、いろいろなアプローチでトライしてみると楽しいと思います。もし、気に入った切り口のチュートリアルが見つからなければおっしゃってください。--sumim - 2002-12-05, 12:10:12

お返事有難うございます! 僕もこのサイトはすみからすみまで参考にさせて頂いているのですが、利用するばっかりじゃ申し訳ないので、自分の調べて分かったことも書きたいと思います。 --tak - 2002-12-05, 13:30:35

ええ。是非、お願いします。--sumim - 2002-12-05, 14:08:18

どこにでも書き連ねてください。まとまった内容をすでにお持ちでしたら、新しいページを作ってそこにどうぞ。--sumim - 2002-12-05, 14:10:37

最近やっと新しいモルフが作れるようになったので、それについて書きたいです。とりあえずメモ書きから初めて増えたら別ページにします。でも仕事中に密かに書いてるのでゆっくり行きます。-- tak- 2002-12-05, 14:43:38

了解です。--sumim - 2002-12-05, 15:24:57

目標: MIDI を鳴らすモルフを作る。

SqueakToysで遊んでいると、アニメと同時に色々な音を出したくなる事が良くあります。けど蛙や自動車以外にも楽器の音が欲しい時があります。シーケンサーのモルフもあるみたいだけど、もっと気軽に単純な楽器音が欲しい時に便利なモルフを作りたい! --tak - 2002-12-05, 16:20:55
クラスやメソッドの作り方が一通りわかってからの説明です。
最初にクラス定義から、
EllipseMorph subclass: #MidiMorph
	instanceVariableNames: 'key '
	classVariableNames: ''
	poolDictionaries: ''
	category: 'MyMidi'

形は何でも良いのですが、丸い形にしてみます。インスタンス変数としてとりあえず key (音の高さ) を使えるようにします。
初期化のインスタンスメソッドはこんな感じ
initialize
	super initialize.
	key _ 64.
	self on: #click send: #playOnce to: self.

self on: #click send: #playOnce to: self は、#click されたとき #playOnce メソッドを self に送りますという意味で、クリック時に playOnce メソッドを呼びたいときに使います。
playOnce
	| note player |
	note _ NoteEvent new
		key: key
		velocity: 100
		channel: 0;
		 duration: 100;
		 time: 0.
	player _ ScorePlayer
			onScore: (MIDIScore new initialize
				tracks: (Array with: (Array with: note))).
	player play.

最後に音を出す部分です。
一生懸命調べたのですが、これより簡単に書く方法が思い浮かびませんでした。
MidiMorph の字の上で、右クリック - more .. - sample instance でモルフを出してクリックすると音が鳴ります。これを SqueakToys で制御できるようにしたいと思います。

SqueakToys で動かす

まず、外から key を読み書きできるようなインスタンスメソッドを追加します。
key
	^ key

key: aNumber
	key _ aNumber \\ 128.

この \\ 128 は、なくとも動くのですが、変な値を入れるとぶっつぶれた感じになるので念のためいれておきます。
(128を入れると0になります。)
次に、クラスメソッドとして、次のメソッドを作ります。
additionsToViewerCategories
	^ #((midi (
		(command play 'play sound')
		(slot key  'set key' Number  readWrite Player getKey  Player  setKey:)
		)))

このおまじないの本当の意味は僕もよくわからないのですが、ほかのクラスの真似をしてこういう風にすると動くらしいということがわかってきました。
最後にこれが大事なのですが、Playerクラスのインスタンスメソッドとして、次を追加します。
getKey
	^ self costume key

setKey: key
	^ self costume key: key

これで、青いハロをクリックすると新しいカテゴリ midi の中に、play と key が出来ています。 -- tak - 2002-12-06, 00:52:01
おお!いつのまにかページがすっきりしています! sumim さんありがとうございました。--tak - 2002-12-06, 00:59:08

いえいえ。おやすい御用で。MIDI は私の鬼門なので勉強になります。--sumim - 2002-12-06, 01:47:04

サンプルプロジェクトを MidiMorph.pr においておきます。ランダム音楽です。Squeak 3.2 で動くはずですが、大丈夫かな?
今後やりたいこと。
ネイティブMIDI音源を鳴らす。
外部につないだMIDI音源を鳴らす。
音色を変えられるようにする。-- tak - 2002-12-06, 02:04:09

3.2 オフィシャル版で動きました。クリックするとちゃんと音がなりました。すごいですね。--sumim - 2002-12-06, 02:10:57

自分のモルフをパーツ瓶に入れる方法

クラスメソッドとして下のようなメソッドを作ると自動的にオブジェクトカテゴリ内に入ります。
descriptionForPartsBin
	^ self partName:	'Midi'  "モルフの名前"
		categories:	#('Multimedia') "カテゴリの名前(複数可)
		documentation:	'Simple midi trigger' "バルーンに出るコメント"
--tak - 2002-12-08, 15:50:04

デバッガを早送りする

脱線しますが、デバッガの面白い使い方です。SystemWindow のインスタンスメソッドに
fire
	(model respondsTo: #send)
		ifTrue: [model send]

というメソッドを追加します。デバッグするときデバッグ窓の水色のハロを出すと、miscellaneous カテゴリの中に fire タイルが現れます。これを引っ張り出して時計のボタンを押すと、デバッグを早送りのように見ることが出来ます。-- tak - 2002-12-08, 17:23:14

takさん、こんにちわ。私もMIDI周りを使って遊んでいます。外部音源は(こちらの方法では内部音源は使えない)、SimpleMIDIPortを使うと便利かと思います。
SimpleMIDIPort midiIsSupported

で、MIDIが使える環境かどうか調べて(私はいつも調べませんが。。。)、
"midiPortはどこか都合のいい所で定義"
	| portNo |
	portNo _ SimpleMIDIPort outputPortNumFromUser.
	portNo ifNil:[ ^nil ].
	midiPort ifNotNil:[ midiPort close ].
	midiPort _ SimpleMIDIPort new.
	midiPort openOnPortNumber:portNo.

で、ユーザに外部のMIDIを選択させて、
	midiPort midiCmd:16r90 channel:ch byte:tone byte:velocity.
	midiPort midiCmd:16r80 channel:ch byte:tone byte:0.

で音を鳴らし(消し)ます。同じ方法でプログラムNo(鳴らす楽器)も変更できます。使い終わったらcloseが必要です。--Toshi - 2003-01-27, 09:57:04

こんにちは!tak です。なるほど、こうやったらいいんですね。midiCmd: のうしろの部分は
どういう意味ですか?MIDI の勉強をしたら分かるようになるのかな。
こうやって実験してると直接機械を触ってる感じがして良いですね。音が全然とまらなくなったりするし。。。
みでぃんこはまだ試してませんが、サンプルは聞きました。けっこうそれっぽく聞こえ
ますねー。かっちょいい!
それにしても Squeak の外部 MIDI と内臓 MIDI ってモルフ経由だと同じように使える
けど、中は全然別々に動かしているんですね。苦労して作ってる感じがします。 -- tak - 2003-01-27, 21:38:33

MIDIデータの詳細はサーチエンジンなどでいっぱい見つかると思いますよ。
SimpleMIDIPortでは、
ノートオン
chチャネル番号(0〜15)
tone 音の高さ(0〜255)
velocity 音の強さ(1〜255)
ノートオフはノートオンでvelocityを0にするか、上記のようにmidiCmdで16r80で指定します。
ほとんどMIDIに出すコマンドそのものなのでMIDIの仕様を知ればできると思います。実際にMIDIで出る信号はmidiCmdとchを論理ORを取った値と、後はそのままです。
でもSqueakは機能テンコ盛りなので楽しいですね。--Toshi - 2003-01-27, 23:32:17

なるほど、16r90 や 16r80 はコマンドの番号ですか、マシン語みたいですね。
出力だけじゃなくて入力は出来ないのかな? キーボードやギターでモルフを動かす事が出来たらイベントでウケそう!-- tak - 2003-01-27, 23:43:57

SimpleMIDIPortや同じカテゴリの中に入力用らしきメソッドがあるのでできると思います。まだ、試したことはないですけど。--Toshi - 2003-01-30, 09:19:31

ありましたありました。面白そうですね。これを使いこなすにはやっぱりちゃんとMIDIの勉強が必要そうです。
関係ないですけど、昨日 sumim さんのレクチャーで初めてゼスチャーが動いている所を見て、かなり使えそうなのでびっくりしました(自分で試した時はさっぱり分からなかった)。ゼスチャーと内部音源を利用して、図形によって音色と音高が変わるような物を作ったら面白いかなと思っている所です。 -- tak- 2003-02-02, 08:39:58

ジェスチャー(Genie)について詳しくは http://swiki.no-ip.com:8080/hmug/squeaking/ を覗いてみてください。 --sumim - 2003-02-02, 09:47:29



旧遊び場13
MidiMorph.pr

このページを編集 (9064 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 5071 times.