みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております。
FM12:Win
父の要望でギターのカポによるコード変更を自動で行なうソフトを作っています。
歌詞のフィールドをレイアウト上にでかでかと置き、歌詞フィールドの上にコードが重なるようにコードフィールドを配置しました(要望としてコードの位置を半角スペースなどで細かな位置の調整ができるようにとのことでした)。
そこでsubstitute関数でカポフィールドの値に応じてC⇒B F⇒E G⇒F#(カポ1の場合)というようにしたのですが、
コードは相互に関係してくるので、カポ1の時C⇒Bで止まってほしいのですが、B⇒A#という変更も行なってしまうのです…
実際の値(カポ1)
元コード C C# D D# E F F# G G# A A# B
変更後コード A# A## C# C## D# E E# F# F## G# G## A#
変更後コードフィールドの値 Case ( カポ = 1 ;
Substitute(元コード ; ["C";"B"] ; ["C#";"C"] ; ["D";"C#"] ; ["D#";"D"] ; ["E";"D#"] ;
["F";"E"] ; ["F#";"F"] ; ["G";"F#"] ; ["G#";"G"] ; ["A";"G#"] ;
["A#";"A"] ; ["B";"A#"]) ;元 コード)
上記は一例です。当然といえば当然なのですが何かうまくいく方法はございませんでしょうか。
なにとぞご教授よろしくお願いします。
noel
Offline
IF kapo=1
case(元コード="C" ; "B"; "C#" ;"C" ;・・・)
else if kapo=2
case(元コード="C" ; "A#"; "C#" ;"B" ;・・・)
↑こんなべたなやり方か、
c=1 c#=2 D=3 などという風に音階に値を設定しておいて、
カポ1なら その値-1とかいう風にしてはどうでしょうか。
それなら計算で求められますしね。
でもきっともっと頭の言い方がサクッとした解決案を出してくれくださるはず!!
私もギターやってたのでつい気になったので。。。
Offline
Substituteの中が順番に処理されるので、処理後の文字が再度処理対象になってしまうということですよね。
やまほんさんが書いてるように、一回数字変換して、それを音階に戻す、でどっちかの時に必要なだけずらせばいいのでは。12種類あるので0~9の他は適当な使われない文字を割り当て。
大文字しか使わないなら、Substituteでは小文字に変換して、最後に大文字にする、でもいいかな。
他に、
["C";"B"] ; ["C#";"C"]
これだとC#は最初の置換でB#になってしまいCにはなりません。C#をを先に書く必要があります。
Offline
やまほん様
回答ありがとうございます。
1フィールドに1コード入るようにしていれば問題ないのですが、
コードフィールドは歌詞フィールドと同じ大きさにして(レイアウトいっぱいの大きさ)
フィールドの中でスペースや改行でコードを打つ場所を決めるので
うまくいかないのです。。。
Offline
1フィールドに1コード入るようにしていれば問題ないのですが、
コードフィールドは歌詞フィールドと同じ大きさにして(レイアウトいっぱいの大きさ)
フィールドの中でスペースや改行でコードを打つ場所を決めるので
うまくいかないのです。。。
では、その長いフィールド内を全部一旦substituteして、計算後、substituteではどうでしょう。
カポ2なら
[C D Em]→[1 3 5m]→[-1 1 3m]→[A# C Dm]
と思ったのですが、
数字のテンション付コード(c#m7) とかオクターブをまたぐときの処理に一工夫いりそうです。
置き換え文字の工夫と、オクターブをまたいだときの数値も対応させればいいですかねぇ。
なんか別のいい方法があるといいのですが。
Offline
数字のテンション付コード(c#m7) とかオクターブをまたぐときの処理に一工夫いりそうです。
mや7は基本変わらないと思いますのでそのまま触らずに…
#や♭が曲者でした。
C# は C と # に分けて処理されてしまうみたいで、、、
そこで、不格好ではありますが、(ヌルを_で表しています)
(カポ1の時) ["C_";"B_"]["C#";"C_"]
とすることによりその問題は解決した(と思いたい。。。)のですが、
立ちはだかるのはwader様ご指摘のとおりsubsituteの再度処理です。
Offline
立ちはだかるのはwader様ご指摘のとおりsubsituteの再度処理です。
そこだけがネックなら、フィールドの頭から順番にテキスト抜き出してloopで処理していくとかどうでしょうか。
それとも、おそらくコードとコードの間はスペースか改行があるでしょうし、それを区切りにしてやはり1コード単位1レコードに展開して、
コード処理してからまた1レコードにもどすとか。
これならsubsituteの再度処理にはひっかかることはないですし。
やはり1フィールドに複数コードがはいってるまま変換させるのはsubsituteの再度処理の面から無理かと思います。
Offline
Cを1 Dを3 というように番号をつけ、番号からカポ位置を引きます。
サンプル
http://yahoo.jp/box/v3EnRH
Last edited by keima (2013-09-30 11:02:30)
Offline
Substituteで一括変換する式例、(※オクターブ補正式を含む)
Let([
Cs=コードフィールド;
Cop=カポ位置フィールド;
Oct=12; //1オクターブ分の音階数
Ns=Substitute(Cs
;["C";mod((1-Cop)-1;Oct)+1]
;["C#";mod((2-Cop)-1;Oct)+1]
;["B♭";mod((2-Cop)-1;Oct)+1]
;["D";mod((3-Cop)-1;Oct)+1]
;["D#";mod((4-Cop)-1;Oct)+1]
;["E♭";mod((4-Cop)-1;Oct)+1]
;["E";mod((5-Cop)-1;Oct)+1]
;["F";mod((6-Cop)-1;Oct)+1]
;["F#";mod((7-Cop)-1;Oct)+1]
;["G♭";mod((7-Cop)-1;Oct)+1]
;["G";mod((8-Cop)-1;Oct)+1]
;["G#";mod((9-Cop)-1;Oct)+1]
;["A♭";mod((9-Cop)-1;Oct)+1]
;["A";mod((10-Cop)-1;Oct)+1]
;["A#";mod((11-Cop)-1;Oct)+1]
;["B♭";mod((11-Cop)-1;Oct)+1]
;["B";mod((12-Cop)-1;Oct)+1]
)
];
Substitute(Ns
;[12;"B"]
;[11;"A#"]
;[10;"A"]
;[9;"G#"]
;[8;"G"]
;[7;"F#"]
;[6;"F"]
;[5;"E"]
;[4;"D#"]
;[3;"D"]
;[2;"C#"]
;[1;"C"]
)
)Last edited by Hiro (2013-09-16 16:49:20)
Offline
あ、そうですね、HIROさんのようにひとつの式の中で置き換え処理すれば再度変換はおきないですね。
オクターブ処理もなるほどです。
Offline
HIROさんの、それだと先にC#が数字#に置換されてしまいませんか?
「半角スペースで調整」してるんで、"C "とか全部2文字ずつにした方がよさそう。
「数字のテンション付コード(c#m7)」こんなのがあるんだと、この「7」も"F#"に置換されてしまいます。「スペース数字」で判別できるのかな。
Offline
興味があったので、横からですけど。
分数コードの処理が必要だと思いますけど。
分数コード以外のコードネームの基音だけを変換しても、分数コードが出てくると、これだけでは狂う気がするんですけど。
Substituteでやった方が、分数コードが出てきた場合、簡単な気がしますが、間違ってますか?
Offline
Hiroさんの、それだと先にC#が数字#に置換されてしまいませんか?
「数字のテンション付コード(c#m7)」こんなのがあるんだと、この「7」も"F#"に置換されてしまいます。
やはり検証が甘かった。^^;
旧式のご指摘箇所を修正しました。
Let([
$Cs=コードフィールド;
$Cop=カポ位置フィールド;
$Oct=12; //1オクターブ分の音階数
$Fnc="Choose(Mod(($n-$Cop)-1;$Oct)+1
;\"\"
;\"あ\"
;\"い\"
;\"う\"
;\"え\"
;\"お\"
;\"か\"
;\"き\"
;\"く\"
;\"け\"
;\"こ\"
;\"さ\"
;\"し\"
)"; //←【関数$Fncを定義】カポ補正コード値をユニーク文字へ仮変換するカスタム関数。
$Ns=Substitute($Cs
;["C#";Let($n=2;Evaluate($Fnc))]
;["C";Let($n=1;Evaluate($Fnc))]
;["D♭";Let($n=2;Evaluate($Fnc))]
;["D#";Let($n=4;Evaluate($Fnc))]
;["D";Let($n=3;Evaluate($Fnc))]
;["E♭";Let($n=4;Evaluate($Fnc))]
;["E";Let($n=5;Evaluate($Fnc))]
;["F#";Let($n=7;Evaluate($Fnc))]
;["F";Let($n=6;Evaluate($Fnc))]
;["G♭";Let($n=7;Evaluate($Fnc))]
;["G#";Let($n=9;Evaluate($Fnc))]
;["G";Let($n=8;Evaluate($Fnc))]
;["A♭";Let($n=9;Evaluate($Fnc))]
;["A#";Let($n=11;Evaluate($Fnc))]
;["A";Let($n=10;Evaluate($Fnc))]
;["B♭";Let($n=11;Evaluate($Fnc))]
;["B";Let($n=12;Evaluate($Fnc))]
)
];
Substitute($Ns
;["あ";"C"]
;["い";"C#"]
;["う";"D"]
;["え";"D#"]
;["お";"E"]
;["か";"F"]
;["き";"F#"]
;["く";"G"]
;["け";"G#"]
;["こ";"A"]
;["さ";"A#"]
;["し";"B"]
)
)Last edited by Hiro (2013-09-17 05:28:25)
Offline
皆様回答ありがとうございます。
こんなに伸びるとは恐縮です。
皆様の意見を参考に挑戦してみたところ、
変換1=Substitute(コード;
["C#";"2"];["D♭";"2"];
["E♭";"4"];["F#";"h"];["G♭";"h"];
["A♭";"k"];["G#";"k"];
["B♭";"x"];["A#";"x"])変換2=Substitute(コード⇒数字変換1;
["C";"1"];["D";"3"];
["E";5];["F";6];["G";8];
["A";0];["B";"y"])上記の二つのフィールドで元のコードを数値化(1,2,3,4,5,6,h,8,k,0,x,y)させて
実際に歌詞フィールドに重ねるフィールドには
Choose(capo;
コード;
Substitute(コード⇒数字変換2;
["1";"B"];["2";"C"];["3";"C#"];["4";"D"];["5";"E♭"];["6";"E"];
["h";"F"];["8";"F#"];["k";"G"];["0";"A♭"];["x";"A"];["y";"B♭"]);
Substitute(コード⇒数字変換2;
["k";"F#"];["x";"A♭"];["y";"A"];["1";"B♭"];["2";"B"];["3";"C"];
["4";"C#"];["5";"D"];["6";"E♭"];["h";"E"];["8";"F"];["0";"G"]);
Substitute(コード⇒数字変換2;
["8";"E"];["x";"G"];["y";"A♭"];["1";"A"];["2";"B♭"];["3";"B"];
["4";"C"];["5";"C#"];["6";"D"];["h";"E♭"];["k";"F"];["0";"F#"]);
Substitute(コード⇒数字変換2;
["x";"F#"];["y";"G"];["1";"A♭"];["2";"A"];["3";"B♭"];["4";"B"];
["5";"C"];["6";"C#"];["h";"D"];["8";"E♭"];["k";"E"];["0";"F"]);
Substitute(コード⇒数字変換2;
["x";"F"];["y";"F#"];["1";"G"];["2";"A♭"];["3";"A"];["4";"B♭"];
["5";"B"];["6";"C"];["h";"C#"];["8";"D"];["k";"E♭"];["0";"E"]);
Substitute(コード⇒数字変換2;
["x";"E"];["y";"F"];["1";"F#"];["2";"G"];["3";"A♭"];["4";"A"];
["5";"B♭"];["6";"G"];["h";"C"];["8";"C#"];["k";"D"];["0";"E♭"]);
Substitute(コード⇒数字変換2;
["x";"E♭"];["y";"E"];["1";"F"];["2";"F#"];["3";"G"];["4";"A♭"];
["5";"F"];["6";"B♭"];["h";"B"];["8";"C"];["k";"C#"];["0";"D"]);
Substitute(コード⇒数字変換2;
["x";"D"];["y";"E♭"];["1";"E"];["2";"F"];["3";"F#"];["4";"G"];
["5";"A♭"];["6";"A"];["h";"B♭"];["8";"B"];["k";"C"];["0";"C#"]);
Substitute(コード⇒数字変換2;
["x";"C#"];["y";"D"];["1";"E♭"];["2";"E"];["3";"F"];["4";"F#"];
["5";"G"];["6";"A♭"];["h";"A"];["8";"B♭"];["k";"B"];["0";"C"]);
Substitute(コード⇒数字変換2;
["x";"C"];["y";"C#"];["1";"D"];["2";"E♭"];["3";"E"];["4";"F"];
["5";"F#"];["6";"G"];["h";"A♭"];["8";"A"];["k";"B♭"];["0";"B"]);
Substitute(コード⇒数字変換2;
["x";"B"];["y";"C"];["1";"C#"];["2";"D"];["3";"E♭"];["4";"E"];
["5";"F"];["6";"F#"];["h";"G"];["8";"A♭"];["k";"A"];["0";"B♭"]))数値化されたコードをカポ数によって変換させました。
ゴリ押し臭がすごいですが、今のところ問題なく動いています。
長文駄文失礼しました。
ほかに何かスマートな方法がありましたらご教授よろしくお願いします。
noel
Offline
Hiro様
一発で出るんですね!
感動しました!
ありがとうございます。
自分でもこの式を噛み砕いて、理解を深めます。
noel
Offline
wader wrote:Hiroさんの、それだと先にC#が数字#に置換されてしまいませんか?
「数字のテンション付コード(c#m7)」こんなのがあるんだと、この「7」も"F#"に置換されてしまいます。やはり検証が甘かった。^^;
旧式のご指摘箇所を修正しました。
コピペしたんですが、分数コードも変換されるんですけど、Cの1capoがBに変換されちゃいます。
私がどこか間違ってるのかなぁ。
Offline
;["F#";Let($n=6;Evaluate($Fnc))]
ここは7じゃないですか?
Offline
-の値を入れるんですねぇ<カポ位置
$Fnc="Choose(Mod(($n+$Cop)-1;$Oct)+1
これにして望み通りになりました。
失礼しました。
Offline
Pages: 1
[ Generated in 0.010 seconds, 9 queries executed - Memory usage: 619.43 KiB (Peak: 652.34 KiB) ]