「サクラ」質問掲示板

サクラの質問掲示板です。
[一覧へ] > (@61) [低] [解決]
@61■ (#182) 関数で拍子を取得する方法は? - 迷子の雄猫 (2012-09-27 21:08) /低 未処理
【バージョン】2.373
関数を作ろうとしています。曲で指定された拍子を取得する方法が知りたいです。
変数に何分の何拍子というのをセットしたいのです。

Int Hs = 50
Int Hb = 50
//TimeSignature
TimeSignature=3,4; // 3/4拍子
//ここまで

//何かの命令
Hs = .....
Hb = .....
//ここまで
Print(Hs)  //3
Print(Hb)  //4
//
..となればうれしいなと。よろしくお願いいたします。

(#185) 正攻法ではありませんが... - 通りがかりです (2012-09-28 00:18) /中 確認待ち
通りがかりです。

書き込んだ拍子を読みだすのは、難しいようです、
なので裏技です。

//↓------↓
//先に、配列で4分の3拍子を指定します。
Array TS=(3,4);

Int Hs = 50
Int Hb = 50

//その後、拍子を書き込む
TimeSignature=TS; //4分の3拍子を指定

l4 ccc

//何かの命令
//Hs = .....
//Hb = .....
//ここまで

Hs= TS(0); //指定を読みだす部分
Hb= TS(1); //

Print({Hs:}+Hs)  //3
Print({Hb:}+Hb)  //4
//↑------↑

なお、TimeSignatureは、途中変更は向いていないみたいです。
主に譜面出力対応のため、という気がなんとなくしないでもない。

(#186) 関数で拍子を取得する方法はなさそう? - 迷子の雄猫 (2012-09-28 03:08) /低 アイデア
#185>通りがかりです、さん

難しいようでしたらあきらめて、
先に変数に代入するなり、改めて同じ値をセットするなり、
方法をとることにします。

解答ありがとうございました。

(#187) 遅ればせながら正攻法での解です。、 - 凪 (2012-10-04 00:33) /中 確認待ち
凪といいます。遅ればせながら正攻法での解です。、

//-------
Function GetTime{
 Int CT=Time;

 Array TT=();
 TT(0) = (Time(3:1:0)-Time(2:1:0)) / (Time(2:2:0)-Time(2:1:0));
 TT(1) = TimeBase*4 / ((Time(3:1:0)-Time(2:1:0)) / TT(0));

 RESULT=TT;
 Time(CT);  //Time書きもどし

} //Func

System.MeasureShift=0
TimeBase=98

TimeSignature=(15,7)
l7 ccccc ccccc ccccc

//TimeSignature=(15,8)
//l8 ccccc ccccc ccccc

Print(GetTime());

PrintTime;
//------

Twitter / sparkkamakiri様 10月1日より、この解へ至る方法論を提示されていたので、
これを元に一部改編しました。、本職のひとは一味ちがうな、、と思います。

変更点...
System.MeasureShiftへ対応しました。
分母数を出力してます。

Twitterアカウントの持ちあわせはなく連絡不可のため、またメールの要件ほどでもないと判断しまして、こちらに直接記入する運びとなりましたが、sparkkamakiri様に於いては、事後承諾ということでよろしいでしょうか?、、
問題があれば、修正するなり、取り下げるなど迅速にいたします。


それと確認していて、気になった点がありました、出力値と表示が一致しない点です。
[4,8,16]などの通常の数字では、演奏モニターへの出力と、PrintTimeの出力は一致しますが、、
それ以外の[12]などの分母数字は、何故か切り上げているみたいです。

つまり、5/12のような拍子であれば、演奏モニターは、5/16での時間表示になってずれます。
ただし、PrintTime側ではあってます、、表示がうまくいっていない気がします。
参考として、15/7は、15/8での時間表示になっていました。


それと、これは蛇足かもしれませんが...過去の質問掲示板でも変拍子の件で話題に上がっていたようなので、、
TimeSignature命令の、扱いの難しさの仕組みを解いてみました。

http://oto.chu.jp/cgi/sakura-q/cbbs.cgi?mode=al2&namber=13232&rev=&no=0
http://oto.chu.jp/cgi/sakura-q/srch.cgi?no=0&word=%95%CF%94%8F%8Eq&andor=and&logs=all&KYO=1&PAGE=20

TimeSignature命令によって変更される時間表示は、単純に現在のタイム値から、割り出しているようなので、
もしTimeSignatureが上書きされると、記述されたポイントから合算するのではなく、
最初から全て計算し直しするので、見慣れない数値が表示され、混乱に陥るのではないかと考えています。


TimeBase=96として、3/4拍子の場合、Track(0);Time(2:1:0);//=288(PrintTime)
拍子を、12/8拍子で書き換えた瞬間、Track(0);Time(1:7:0);//=288(PrintTime)

//-------
TimeBase=96;
TimeSignature=(3,4)
l4 ccc

PrintTime;  //Time値 288 -> Time(2:1:0);

TimeSignature=(12,8);
PrintTime;  //Time値は同じ 288 ->Time(1:7:0);

l8 cccc cccc cccc

//-------

タイム値を加算しない状態として、このポイントで拍子だけを変更すると、
単純に現在の小節表示が変更され、l4ccc -> l8ccc ccc 分移動したTime(1:7:0);という表示に変化します。

(#260) 解決:ようやく思い通りに拍子を取得 - 迷子の雄猫 (2014-01-10 15:06) /低 解決
お返事とお礼が大変遅くなりまして申し訳ありません。
ようやく思い通りに拍子を取得出来ました。おくればせながらお礼申し上げます。


#組み込むと動作がおかしくなるという現象に遭遇しまして、しばらく投げ出していた次第・・・。#1文字書き間違えたせいでした^^;

(#182)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を平仮名で記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能