- ベストアンサー
異名同音(C# = Db)をenumで表現する方法
質問です。 友達がギターコードを表示するプログラムを組もうとしています。 そこで問題なのがコードには異名同音(例えばC#とDbは同じ音)があるので enumでどう表現すればよいのか分からない、ということです。 彼はプログラマーとして働いているのでenumの使い方は熟知してます。 自分は音楽専門でenumは授業で習ったくらいです。 僕はenumを使わずにC=1, C# or Db=2 , D=3, D# or Eb=4, E=5, ... B=12という感じで 割り振ったらどうか、と素人考えで助言したのですが 転調などを考えるとenumの方が良いそうです。 うむ、確かに納得ですが…。 皆さんはこういうプログラムのときはどのように処理してるのでしょうか? なるべく実際に音楽関連のソフトを組んだ経験のある人に答えていただきたいです。 彼には借りがあるので、どうかよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
音楽関連ソフトを作ったことはないですが、 enumで同じ値を指定する仕方はわかります。 例えば次のようにします。 public class Sample { static enum Code { C(1),CSharp(2),Db(2),D(3),DSharp(4),Eb(4), E(5); private final int codeValue; Code(int v){ this.codeValue=v; } public int codeValue() { return codeValue; } } public static void main(String args[] ) { System.out.println(Code.CSharp.codeValue()); System.out.println(Code.Db.codeValue()); } }
その他の回答 (4)
- incho0922
- ベストアンサー率41% (84/204)
No.1です。発想が全く違うかもしれませんが・・・ ギターの指板を図示するということであれば、かなり限られたコードしか表示できないと思います。 たとえば、10フレット目をセーハするようなコードが図示されても、いちいちフレットを数えなければなりませんから、実用的ではないですよね。 実用的なのは、せいぜい7フレットくらいの間に収まるようなコードではないでしょうか。 だとしたら、必要なコードの画像とコードネームを一対一に対応付けして、コードを指定したらその画像を表示するようなものでよいのではないかと思いました。 もし本当に異名同音を正しく処理しようとしたら、C#コードではEシャープ音が出てきますし、GbmコードではBダブルフラット音が出てきますから、相当な数の異名同音を処理できるようにしておく必要があります。
- deadlock
- ベストアンサー率67% (59/87)
ギターのコードは分からないのですが…。 異名同音であるということであれば、音と名称は一度明確に分けてそれぞれにenumを用意しましょう。 この場合、No.3さんの >「C#」と表記するか「Db」と表記するかは、楽曲のキーによって決まってくる を参考にすれば、音とコードをenumで定義し、相互の変換をキーのオブジェクトが担当するのがよさそうです。
- ngsvx
- ベストアンサー率49% (157/315)
どのように処理するか、最終的な決定は、#1のおっしゃっている通り、仕様によってくると思います。 ただ、今の情報だけでいえば、質問者さんの方法でいいような気がします。 「C#」と表記するか「Db」と表記するかは、楽曲のキーによって決まってくるもので、この2つを別のものとして管理してしまうとキーを変えたときの処理が面倒になりそうだからです。
- incho0922
- ベストアンサー率41% (84/204)
ギターコードをどのように表示しようとしているのでしょうか? 図示するのか、構成音を文字で表示するのか、その他なのか・・・ また、enumをどのように定義して、どのように利用しようとしているのかによっても全然違ってくると思います。 kickerさんがどの程度プログラミングに詳しいのかこの質問からは分かりませんが、どちらかと言えばkickerさんよりもプログラマーのご友人本人が質問する方が、回答もしやすいと思います。
お礼
本人にここでの回答について説明すると納得したようです。 ありがとうございました。
補足
友人はアメリカ人なので本人は質問できません。 ギターコードを仮想のフィンガーボード上で図示するのが目的らしいです。 enum Key{C, C#, D, D#, E, ...,B}という感じで定義していたと思います。 ただ、彼とゆっくり話せるのは今週の金曜日ですので そのときに詳しいことを聞くつもりです(ここの回答も見せるつもりです)。 自分もここんとこJavaを触ってないものですから勉強しておきます。 他の回答者の方々ももう少しお待ちください。m(__)m
お礼
連続投稿ができなくなったんですね…本当に時間がないので 他のみなさんには申し訳ありませんがこれでお礼とさせていただきます。 ありがとうございました。