on mouseUp
answer file ""
put "" into fld "tBinary"
set itemdel to "/"
put the last item of it into fld "tMusicName"
set cursor to watch
lock screen
-- ファイル名「Illusion of the Statue_5s.mp3」
set the filename of player 1 to it
put "" into fld "tBinary"
-- fld "tBinary"にバイナリの文字列を入れる
put url("binfile:"& the filename of player "tPlayer") into fld "tBinary"
-- バイナリ文字列の総キャラクター数 97472
put the length of fld "tBinary" into fld "tNumCharsBinary"
end mouseUp
これで音楽ファイル「Illusion of the Statue_5s.mp3」が、左にあるフィールドに入りました。これはわざわざ見せる必要はありませんが、この段階で理解しやすいようにフィールドに入れました。私が作った曲「Illusion of the Statue」の5秒間をサンプルに使っています。元々はMIDIで作った曲でしたが、変換アプリを使ってMP3としたものです。
始めの文字列はMP3ファイルのヘッダーのようですが、どこまでがそれか私には現在判断できません。
on mouseUp
ask file "Please name the mp3 file:"
if char -1 to -4 of it <> ".mp3" then
put ".mp3" after it
end if
put fld "tBinary" into url("binfile:"& it )
end mouseUp
on mouseUp
put fld "tBinary" into tData
-- 作った3Dポイントのリストをカードの
-- カスタム・プロパティ「cMusicPoints」として格納しておく
set the cMusicPoints of this card to makePoints(tData)
-- 「cMusicPoints」の行数が3Dポイントの数 32491
put num of lines of the cMusicPoints of this card \
into fld "numOf3DPoints"
end mouseUp
-- 3D座標に変換するファンクション
private function makePoints @pData
set the cursor to watch
repeat with i=1 to the num of chars of pData step 3
if char i of pData is empty then exit repeat
put charToNum(char i of pData) into X1
put charToNum(char i + 1 of pData) into Y2
put charToNum(char i + 2 of pData) into Z3
put X1 & comma & Y2 & comma & Z3 & cr after zahyo
end repeat
return zahyo
end makePoints
このスクリプトも特にこう言う形にする必要はないのですが、スタディでの視覚上の確認です。
ボタン「Line 1 to 1100 of 3D Points」
on mouseUp
put fld "numOf3DPoints" & " div 1100 = " & fld "numOf3DPoints" div 1100 \
into fld "howManyTimes"
put "mod " & fld "numOf3DPoints" mod 1100 into fld "tMod"
put line 1 to 1100 of the cMusicPoints of this card into fld "1100Lines"
set the c3DPoints of grc "threeD" of grp "3D" to line 1 to 1100 of \
the cMusicPoints of this card
end mouseUp
-- グローバル
global gMovePointOptionID, gAngleY
-- アングルYを変えながら3Dドローイングを描いてゆく
command move3D gAngleY
lock screen
-- 60ミリセコンド条件が満たすまでこの「コマンド move3D」を繰り返す
send move3D to me in 60 milliseconds
-- 60ミリセコンドのループをキャンセルするID
put the result into gMovePointOptionID
-- 現在カスタム・プロパティc3DPointsに書き込まれているポイント・データ
put the c3DPoints of grc "threeD" of grp "3D" &cr into t3dPoints
put 0 into tAngleX
-- 現在のスクロール・バー「angleY」のアングルYの数値
put the thumbPos of sb "angleY" of grp "3D" into gAngleY
put 0 into tAngleZ
-- ドローイングを描く「threeD」の下にあるカラーのグラフィック「base3D」
set the loc of grc "base3D" of grp "3D" to \
item 1 of the loc of sb "angleY" of grp "3D", \
item 2 of the loc of grc "threeD" of grp "3D"
-- カスタム・プロパティc3DPointsに書き込まれているポイント・データを描く
-- 「Moving 3D View」からは、Yアングルが変化するごとにポイント数が増える
repeat for each line tLine in t3dPoints
if tLine = "" then
put return after output
next repeat
end if
-- animationEngineのスクリプト
put rotateIsoPoint(item 1 of tLine,item 2 of tLine,\
item 3 of tLine,tAngleX,gAngleY,tAngleZ) into theLine2
put ae3dconverttoscreen(theLine2,the loc of grc "base3D" of \
grp "3D",3000 ) & return after output
end repeat
set the points of grc "threeD" of grp "3D" to char 1 to -2 of output
set the loc of grc "threeD" of grp "3D" \
to the loc of grc "base3D" of grp "3D"
set the rect of grc "base3D" to the rect of grc "threeD"
unlock screen
end move3D
-- コマンド「move3D」を終了させる
command cancelID
cancel gMovePointOptionID
repeat for each line tLine in the pendingMessages
if "gMovePointOptionID" is among the items of the pendingMessages then
cancel (item 1 of the pendingMessages)
end if
end repeat
end cancelID
global gGrpName
on mouseUp
if the cMusicPoints of this cd is "" then
-- 音楽ファイルがセットされていない
beep
exit to top
end if
-- 空白のドローイングから始める
set the c3DPoints of grc "threeD" to ""
-- ドローイングする3Dポイント
put fld "1100Lines" into t1100Lines
put number of lines of t1100Lines into tAllLines
-- アングルYを0から始める
put 0 into tAngleY
repeat with i= 1 to tAllLines
put i into fld "lineCounter"
-- 作業を中止をしなくてはいけない時のためマウス・ダウンしたらスクリプトから拔ける
if the mouse is down then exit to top
set the c3DPoints of grc "threeD" to the c3DPoints of grc "threeD" & line i of t1100Lines &cr
set the thumbpos of sb "angleY" to tAngleY
put the short name of the owner of grc "threeD" into gGrpName
-- 描画するコマンド
move3D
cancelID
-- Yアングルを1度変える
add 1 to tAngleY
if tAngleY >= 360 then put 0 into tAngleY
end repeat
put tAllLines into fld "lineCounter"
end mouseUp