midiファイルの表現には色々と制約が多いので、自分でより高度なことを簡単に扱えるような独自のファイル形式を作っています。
(その形式においては処理を簡易化するためにデルタタイムに当たる数値は開始点からの絶対値だったり、エンディアンはそのファイルを作ったOSを何らかの方法で特定できるようにしておいて、それに合わせるようになってたり、固定長だったりとか、微妙に仕様は違いますが)


しかし、やはりDAWのようなソフトならば当然他のソフトとある程度の互換性は持たせたいので
midiファイルとしてのInput Output、つまり結果的には編集も可能にしているところなのですが(XFフォーマットVer2.03あたりを意識しながら)

このmidiファイル、(あるいはXFフォーマット限定の情報でも)に関して
歌詞情報等でUnicode文字を使えるような標準の方法(メタイベントか何かを利用して)ってありますか?


※通常はマルチバイトだけで、そういう事は独自拡張しか方法はないということならば、Unicode文字は自分のつくっているソフト専用でもいいので『独自に対応』しておき、通常はマルチバイトにしようと思っています。
(標準であるかないかにかかわらず、選択可にするようには組みそうですが)

このQ&Aに関連する最新のQ&A

A 回答 (2件)

とりあえず「検索したらなんか出てきた」レベルなのでなんともいいにくいのですが, 純粋に「規格」として読むならその解釈で全部あってるはずです.



あ, SMF ではなく XMF (eXtensible Music Format) なら UNICODE が使えそうですね. 4.9 Synchronised lyrics/text によれば, 「言語」と「エンコーディング」の両方が指定できそうです.

参考URL:http://www.midi.org/techspecs/xmf/rp47public.pdf
    • good
    • 0
この回答へのお礼

お~!ありがとうございます。

XMFなんてものがありましたか!
確かにそう読めますね。
目的を読むと、現在作っている独自の形式と方向性は似ている箇所もあるようで
しかし、やはり詳細は実物をじっくりいじり倒してみないと見えません。


んで、かなり興味がわいたのですが

調べてもSMFのそれと比べて対応ソフトとか解説とかが恐ろしいほど見つかり辛く感じます。

手持ちのソフトで対応してるのが結構あれば良いのですが、そうでないとなるとファイル作成の実験そのものが困難を極めそうなことと


現状ではSMFにおいてUNICODEの問題は、結局は「流通レベルの問題」に等しい→XMFだと結果的に同じ問題にぶち当たる


となれば、時間の問題からいっても、ファイルサイズは多少大きくなっても、ひたすらに表現力を求めまくった自分のソフト専用(少なくとも公開直後は)の形式を煮詰める時間と、十分に普及しているSMFサイドへの対応を専決することにして


当初の作戦でいくのが、まずはベストと判断しました。


しかし、存在を知ったのは、今後役に立つ可能性も否定できません。

お礼日時:2011/04/11 02:53

Lyric Meta Event に UNICODE を使うことはできそうだけどねぇ....



参考URL:http://www.midi.org/techspecs/rp26.php
    • good
    • 0
この回答へのお礼

これはこれは、どうもありがとうございます♪



>If an undefined <code_set> appears, lyrics should be ignored until a defined <code_set> appears.
>In addition, if a byte order mark which specifies UNICODE such as 'FF FE' or 'FE FF' exists, the character code SET should be treated as UNICODE.

未定義のコードセットが出たら定義されたコードセットが出るまで歌詞を無視すべき、そんでもって、もしUNICODE特有の文字が出たらそれはUNICODEとみなされるべき


ただし


>Other <code_sets> for different languages are not defined yet.
>AMEI/MMA will be responsible for defining those <code_sets>.

これやっぱり、この"yet"と"will"がポイントでしょうか…w


え~っと、このコードセットの指定のそもそもの使い方なのですが

(読む限り途中でコードセット変えてもいいようだけど)例えば、デフォルトのLATINとかを明示的に示すとすると

あらゆる歌詞が始まる前にLyric Meta Eventにて

{@LATIN}

を突っ込む、というだけで「仕様通りのはず」ということでしょうか?
つまりこの場合バイナリ的には


16進表記で
(デルタタイム) FF 05 08 7B 40 4C 41 54 49 4E 7D


となるはず、で

これは標準ではまだ決まってないけど自分で{@UNICODE}とかに対応するようにやったとしても、SMFの「仕様通りではある」ということでしょうか?


どちらも

{@LATIN}
{@JP}

に正確に対応してると考えられるシーケンサーがなんなのか、あるいはあるのかないのか分からないのですが

とりあえず、いずれにしても現状ではまだUNICODE対応というのは「標準的」ではない、という感じになりそうですかね?

お礼日時:2011/04/11 00:12

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q電子ピアノでMIDI録音する方法が分かりません

初めまして。MIDI初心者です。電子ピアノでのMIDI録音についての質問です。
電子ピアノの演奏をMIDIにしたいのですが、ピアノを鳴らしてもPCから音が鳴らず、シーケンサーにも表示されません。

仕様は
MIDIシーケンサー:Music Studio Producer 1.24
電子ピアノ:CASIO Privia PX-110
MIDI インターフェース:ALESIS USB-MIDI CABLE

[MIDIデバイスの設定]
MIDI Out→Microsoft GS Wavetable Synth [デフォルト:Yes][クロック送信:ON]
MIDI In→USB2MIDI[クロック送信:ON]
[ディアクティブ時にMIDIデバイスを開放]:チェック無し

接続時でのMIDI-IN、MIDI-OUTはきちんとINとOUTを逆に接続しました。
また、[MIDIデバイスの設定]でOUTに”USB2MIDI[クロック送信:ON]”を設定したところ
きちんと電子ピアノ側へOUTし音が聞けました。

ただ入力がうんともすんともいいません・・・・
(電子ピアノを鳴らすと音はいっているのか、インターフェースの灯りはチカチカしています。)

[環境の設定]-[MIDI環境]-[MIDI接続の設定]をいじってみましたがダメでした。
もちろん録音トラックは[R]に設定、MIDIの録音ボタンも押し忘れはありませんでした。

一応電子ピアノ側の設定は
送信チャンネルの設定:よく分からなくいじっていません(デフォルト)
アカンプ/ソングMIDIアウトの設定:OFF
MIDIインコードジャッジの設定:OFF
ローカルコントロールの設定:OFF
となっております。

自分ではどうにもいかなく質問させて頂きました。
本当に初歩の初歩的な事で自分でも悲しくなってしまいますが
どなたか分かる方がいましたら、是非御指南の程をよろしくお願い致します。

初めまして。MIDI初心者です。電子ピアノでのMIDI録音についての質問です。
電子ピアノの演奏をMIDIにしたいのですが、ピアノを鳴らしてもPCから音が鳴らず、シーケンサーにも表示されません。

仕様は
MIDIシーケンサー:Music Studio Producer 1.24
電子ピアノ:CASIO Privia PX-110
MIDI インターフェース:ALESIS USB-MIDI CABLE

[MIDIデバイスの設定]
MIDI Out→Microsoft GS Wavetable Synth [デフォルト:Yes][クロック送信:ON]
MIDI In→USB2MIDI[クロック送信:ON]
[ディアクティブ時に...続きを読む

Aベストアンサー

Music Studio Producerは手元にないのではっきりしたことはわかりませんが、
MIDIデバイス設定や配線に不備はないと思います。
考えられる可能性としては、MIDIインプットに関する設定の不備か、あるいはオーディオ環境の設定のどちらかだと思います。

○MIDIインプットに関する設定(クロック)
 クロックは、Music Studio以外のシーケンサーと同期をとる場合に利用します。Microsoft GSにはシーケンサーはついていませんし、CASIO Priviaの自動伴奏等を使わないのであれば、基本的にOFFにしていて問題ありません。
 通常クロックの設定が発音の不具合に繋がることはあまりないのではないかと思いますが、Music Studio Producerの場合、クロックを使用する場合は再生モードをMIDIにしておく必要があり、同時にオーディオデータを使用する場合はクロックを使用することができません。これが具体的にどういう意味なのかは僕もわかりませんが、もしクロック設定をした上で再生モードをMIDI以外にしていたらどういうことが起こるのかは実機をさわらないとわかりません。

 設定
 [MIDIデバイスの設定]各クロック送信をOFF
 [環境設定][MIDI環境][同期の設定]SMPTE/MTCを送信の蘭にチェックが入っていないこと

○MIDIインプットに関する設定(フィルター)
 MIDI入力時にフィルターがかかっていると、入力信号を受取ってもMusic Studio Producerはそのデータを無視します。

 設定
 [環境設定][インプットフィルター]最低限ノートの蘭にチェックが入っていること
 (用語の意味が分からない場合、全てにチェックを入れておくのが妥当です)


○オーディオ環境の設定
 オーディオ環境設定に不備がある場合、全ての音が出ません。

 設定
 [環境設定][オーディオ環境]オーディオドライバの項目を設定
 Windows PCのスピーカー、あるいはヘッドホンを直接刺して試聴する場合、MMEドライバーを選択します。外部のオーディオインターフェイスを使用する場合は、ASIOドライバーを選択します。

 設定(MMEドライバーを選択した場合)
 [セットアップメニュー][オーディオデバイスの設定]Out, Inのデバイスを選択します。
 
 設定(ASIOドライバーを選択した場合)
 [セットアップメニュー][ASIOドライバー]Driverをコンボボックスから選択します。
  Control Panelボタンを押すと、ドライバー独自の設定ができます。
  その後Output / Inputの1-Lと1-Rを設定します。


これが、一般的なところでの確認項目だと思います。これで解決しない場合、固有の問題を考えていかなければならないと思います。

補)調査資料:Music Studio Producer取扱い説明書
       CASIO Previa PX-110仕様
  実機試験:なし

Music Studio Producerは手元にないのではっきりしたことはわかりませんが、
MIDIデバイス設定や配線に不備はないと思います。
考えられる可能性としては、MIDIインプットに関する設定の不備か、あるいはオーディオ環境の設定のどちらかだと思います。

○MIDIインプットに関する設定(クロック)
 クロックは、Music Studio以外のシーケンサーと同期をとる場合に利用します。Microsoft GSにはシーケンサーはついていませんし、CASIO Priviaの自動伴奏等を使わないのであれば、基本的にOFFにしていて問題ありませ...続きを読む

Q配列表現とポインタ表現

配列とポインタの2通りの表現で表せる場面によく遭遇します。例えば、pというdouble型の配列に乱数を10個発生させて格納したい時など、

for(i=0;i<10;i++)
*(p+i) = (double) rand();

for(i=0; i<10; i++)
p[i] = (double) rand();

のように、配列とポインタの2通りの表現が考えられると思いますが、複雑な場合などは特に、見た感じは配列のほうが分かりやすいと思います。
まだ、C言語の初級から中級向けの本しか読んでいないのですが、標準関数の多くがポインタを引数や返り値としていることを知りました。わざわざポインタ表現にすることの意義は、実行速度が上がることと、標準関数の多くがポインタを引数や返り値としているからと理解して良いのでしょうか。

Aベストアンサー

その1

>*(p+i) = (double) rand();
>p[i] = (double) rand();

この2者は全く同じです。
同じと言うのは「結果的に同じ動作をする」と言う意味でなく、全く同じコードの2種類ある表記方法と言う意味です。

p[i]はコンパイラによって*(p+i)と解釈され実行コードに落とされます。
よって、非常に奇妙な話ですが、i[p]と書くことも許されます。*(p+i)も*(i+p)も同じですから。
もちろん、許されるだけで、敢えてそのような書き方をするべきでないことは当然ですが。

その2
そもそも配列を関数の引数・戻値にすることは出来ません。
だからこそ関数の引数・戻値はポインタになっているのです。当たり前の話です。
このため、ポインタを引数に取る関数に配列名を渡すと、配列名はその配列の先頭要素を指すポインタとして読み替えられるという規則があります。
厳密に言うと一部の例外を除き配列名は常にそのように解釈されます。「その1」で書いたこともこの規則に当てはまります。

これは初心者が引っかかりやすい点で、まともな入門書なら必ず説明してあるはずです。
詳しくお知りになりたければ下記のサイトの06あたりを読まれることをお薦めします。

なお、どうしても配列を引数・戻値にしたい場合(値渡しにする必要がある)は配列を構造体に入れるなり、C++であればクラスするなりの手を使います。

その3
C++になるとイテレータ(というものが存在する)との互換のためポインタ表記の方が便利ですね。

参考URL:http://www.kouno.jp/home/c_faq/

その1

>*(p+i) = (double) rand();
>p[i] = (double) rand();

この2者は全く同じです。
同じと言うのは「結果的に同じ動作をする」と言う意味でなく、全く同じコードの2種類ある表記方法と言う意味です。

p[i]はコンパイラによって*(p+i)と解釈され実行コードに落とされます。
よって、非常に奇妙な話ですが、i[p]と書くことも許されます。*(p+i)も*(i+p)も同じですから。
もちろん、許されるだけで、敢えてそのような書き方をするべきでないことは当然ですが。

その2
そもそも配列を関数...続きを読む

Qmidiについて

只間ノベルゲームを使っています。
フリーの素材屋さんからお借りしてきたMIDIなのですが、
リセット命令の入っているものと、入っていないものがありました。

リセット命令の入っていないmidiは、音が変になる事があると聞きます。
しかし、リセット命令の入っているMIDIを鳴らしたあとにもう一度そのMIDIを聞くと、音が直っていると。

この場合、こんな感じに使用すれば問題ありませんでしょうか?
(ちなみに、MIDIは改変不可だそうです)
●リセット命令の入っているMIDI→入っていないMIDI→入っているMIDI

こんな風にすると、きっと良くないのだろうなぁと考えています。
●リセット命令の入っていないMIDI→入っていないMIDI→入っていないMIDI

Aベストアンサー

下記に詳しく説明されています、参照してください
http://cw-kamikaze.hp.infoseek.co.jp/MIDI_Reset.html

Qchar 文字列型 の表現範囲が-128~127の文字のマイナス表現とは

char 文字列型 の表現範囲は-128~127だそうです。・・文字を表する範囲のマイナスがついていますが、数字だったら-1 -2 -3 と流れていくのでわかります。
 文字の種類を+127の範囲で表現できる意味は分かりますが、-128までの範囲で文字の種類を
 表現する意味が分かりません!?
どういった表現方法でしょうか?(考えた方でしょうか?)
 よろしくお願いいたします。

Aベストアンサー

Cの char は、実は、整数型の一種だからです。
「文字(コード)を表現するのに十分なサイズ」の整数型です。

あと、char の範囲が、-128 ~ 127 かどうかは、実際には、「お使いのコンパイラはそうなっている」というだけで、Cでは、char が、
符合付き:多くの処理系では -128 ~ 127
符合無し:多くの処理系では 0 ~ 255
のいずれとして扱うかは、「処理系依存(コンパイラが決めればいい)」ということになっています。

※ついでにいえば、符合の有無を明示した signed char と unsigned char は、char とは別の型として扱われています。

というわけで、char は、(文字の表現に適したデータサイズなので)文字として扱うのが便利なような道具(関数など)が準備されていますが、本質的なレベルでは、整数として扱われることは、時々意識すると良いと思います。

Qguitar rig 3 とMIDI端子付きギターアンプの切り替えについて

これから,以下の機材等を購入するために,色々と検討及び勉強しているのですが,当方,機材の知識にまだ自信が無いため,何卒お知恵をお貸し下さい。

以下の様な設定で,guitar rig 3の設定とギターアンプのチャンネルの設定を同時に変換・切り替えはできますでしょうか?

また,出来ない場合,またはこれは必要ない等,何か良い方法がありましたらお教え下さいm(_ _)m

オーディオ信号
ギター→【IN】EDIROL/FA-66(Guitar rigとFirewireで接続されたオーディオインターフェイス)【OUT】→【IN】Diezel Herbert(ギターアンプ)

MIDI信号
ROLAND FC-300(MIDIフットコントローラー)【MIDI OUT】→【MIDI IN】PROVIDENCE PMD-101(MIDI THRU BOX)【MIDI Thru(1)】→【MIDI IN】 Diezel Herbert(ギターアンプ)
PROVIDENCE PMD-101(MIDI THRU BOX)【MIDI Thru(2)】→【MIDI IN】EDIROL/FA-66(Guitar rigとFirewireで接続されたオーディオインターフェイス)
PROVIDENCE PMD-101(MIDI THRU BOX)【MIDI Thru(3)】→【MIDI IN】ROLAND FC-300(MIDIフットコントローラー)

自分で調べながら想像で組み合わせているのですが,確信が得られなくて…

以上,宜しくお願い申し上げます。

これから,以下の機材等を購入するために,色々と検討及び勉強しているのですが,当方,機材の知識にまだ自信が無いため,何卒お知恵をお貸し下さい。

以下の様な設定で,guitar rig 3の設定とギターアンプのチャンネルの設定を同時に変換・切り替えはできますでしょうか?

また,出来ない場合,またはこれは必要ない等,何か良い方法がありましたらお教え下さいm(_ _)m

オーディオ信号
ギター→【IN】EDIROL/FA-66(Guitar rigとFirewireで接続されたオーディオインターフェイス)【OUT】→【IN】Diezel ...続きを読む

Aベストアンサー

当方guitar rig 3については知識がありません。
guitar rig 3 が EDIROL/FA-66 を使えて外部からMIDI信号で質問者さんのやりたいことをコントロールできるのであればDiezel Herbertを辻褄が合うように設定して使うことが可能です。

http://web2.moridaira.com/diezel/herbert.htm

アンプ本体が学習リモコンの要領で設定できる旨の記述があります。
さらにMIDI THRU端子を装備しているのでMIDIパラボックスは必要なくなります。フットコントローラーからアンプに繋ぎアンプのMIDI THRUからオーディオインターフェイスのMIDI INに繋いでください。プログラム・チェンジのやりとりならこれで十分です。
またMIDI接続のパラボックスからFC-300に行く信号経路は必要ありません。

パソコンをエフェクターのように使うおつもりのようですがパソコンが原因となる音の遅れについてはどれほどスペックが高くても保証しかねます。

QMicrosoft Visual C++でのエラー「fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024」について

タイトルに書きましたが、Microsoft Visual C++で実行(?)した際に、エラーがある時は下の欄にいろいろ出てくると思いますが、先ほど「fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024」というエラーがでてきました。

絶対にあってるだろう簡単なプログラムでも毎回そうなってしまします。

どういうことなのでしょうか?

初心者なのですがよろしくお願いします。

Aベストアンサー

VC++6.0あたりまでですと、プリコンパイル済みヘッダーなんかが悪さして、まともにコンパイルできないって事は良くありました。
表記のエラーは記憶に無いですが。

試しにプリコンパイル済みヘッダーを使用しない設定にするとか、フルビルドをかけてみるとか。

815644 - C1010 エラーの情報: 最も多くの共通の原因
http://support.microsoft.com/kb/815644/ja


> #include <stdio.h>
> ~

> このコードでも同様のエラーなんです。

VC++だと、stdio.hを直接書き換えるなんて事も可能だったハズ。
間違って書き換えちゃったとかって事は?


あるいは、コンパイル時の設定で、#defineが無効になるような所をいじってしまったとか。

QMIDI/AUDIOインターフェースの購入検討

現在MIDIコントローラー(キーボード)とPCをUSBケーブルで接続して楽曲製作をしています。
レイテンシを小さくするため、ASIO対応のMIDIインターフェースの購入を検討していますが、どの製品を買えば良いのか判断ができません。
5万以下で、おすすめの製品があれば教えて下さい。
将来的にはオーディオ録音もしたいので、オーディオインターフェース機能が付いたものでも構いません。

※希望としては、キーボードとMIDIインターフェースをUSBケーブルで接続して、
MIDIインターフェースとPCをUSBケーブルで接続するのが理想ですが、
キーボードのMIDI_OUTとMIDIインターフェースのMIDI_INを接続して、
MIDIインターフェースとPCをUSBで接続する場合でも良いです。

Aベストアンサー

勘違いしているようですが、ASIOはオーディオインターフェースのサウンドドライバの仕様です。ASIOはあくまでオーディオの遅延を極力解消するためのものです(そもそもは入力チャンネルの問題だったようですが)。MIDIインターフェースとは関係ありません。ちなみにMIDIデータは、通常USB接続の方がMIDIケーブル接続より高速です。
http://ja.wikipedia.org/wiki/ASIO
現在の構成で発音に遅延が生じているとしたら、それはレイテンシの高いソフト音源を使用しているからでしょう。VSTiなどの低レイテンシのソフト音源やハードMIDI音源を使用すれば解消することであり、MIDIインターフェースの問題ではありません。
なお、VSTiはシーケンサーソフトが対応している必要があるので注意が必要です。
http://www.dtmm.co.jp/special/lama.shtml

ASIOが必要なのはオーディオの録音・再生を行う場合であって、MIDIだけで使用している限りは関係ありません。

オーディオデバイスについては楽器屋で店員に相談して選んだほうがいいと思いますが、いちおうこちらを参考に。
http://www.sofmap.com/product_list/exec/_/gid=PL13040100

勘違いしているようですが、ASIOはオーディオインターフェースのサウンドドライバの仕様です。ASIOはあくまでオーディオの遅延を極力解消するためのものです(そもそもは入力チャンネルの問題だったようですが)。MIDIインターフェースとは関係ありません。ちなみにMIDIデータは、通常USB接続の方がMIDIケーブル接続より高速です。
http://ja.wikipedia.org/wiki/ASIO
現在の構成で発音に遅延が生じているとしたら、それはレイテンシの高いソフト音源を使用しているからでしょう。VSTiなどの低レイテンシのソフ...続きを読む

Qポインタにによる値の表現と文字列の表現について

◎1------------------------------
#include<stdio.h>

int main(void)
{
char *pt="ABC";

printf("pt=%s\n",pt);

char dt[10]="ABCDE";
char *pp;

pp=dt;

printf("pp=%s\n",pp);

return 0;
}
--------------------------------------
◎2----------------------------------
#include<stdio.h>

int main(void)
{
char *pt="ABC";

printf("*pt=%s\n",*pt);

char dt[10]="ABCDE";
char *pp;

pp=dt;

printf("*pp=%s\n",*pp);

return 0;
}
-----------------------------------
◎3---------------------------------------
#include<stdio.h>
int main(void)
{
int ary[5]={111,222,333,444,-1};
int* pt=ary;

while(1){
printf("%d ",*pt);
++pt;
if(*pt==-1){
break;
}
}

puts("");

return 0;
}
-----------------------------------------------

以上3つのプログラムで、◎1はprintfで「*」が付いてなく、正常に実行出来ました。
◎2はprintfで「*」が付いてなく、エラーは出ませんが、文字列が表示されませんでした。
◎3は文字列ではなく値ですが、printfで「*」が付いていて正常に実行できます。

これは、値の場合は「*pt」とすることで、ptのアドレスに値を代入しているという事で、「printf("%d ",*pt);」で実行できたということですかね?
文字列の場合は、先頭のアドレスを渡すだけなので、「printf("pt=%s\n",pt);」のようにしてアドレスを参照しないとダメであるということですか?
◎2で「printf("*pt=%s\n",*pt);」としてしまうと、何が起きてしまうのかわかりません。

以上、教えていただけると嬉しいです。

◎1------------------------------
#include<stdio.h>

int main(void)
{
char *pt="ABC";

printf("pt=%s\n",pt);

char dt[10]="ABCDE";
char *pp;

pp=dt;

printf("pp=%s\n",pp);

return 0;
}
--------------------------------------
◎2----------------------------------
#include<stdio.h>

int main(void)
{
char *pt="ABC";

printf("*pt=%s\n",*pt);

char dt[10]="ABCDE";
char *pp;

pp=dt;

printf("*pp=%s\n",*pp);

return 0;
}
-----------------------...続きを読む

Aベストアンサー

◎1について

printfの%sは「ポインタ」を受け取り、そのポインタの先にある文字列を表示します。

>char *pt="ABC";
「ptはcharのポインタであり、そのポインタの先にある文字列は"ABC"だ」として、宣言と初期化を行っています。

>printf("pt=%s\n",pt);
「pt」は「ポインタ」であり「そのポインタの先にある文字列は"ABC"」です。なので「ABC」が表示されます。

>char dt[10]="ABCDE";
「ptはcharの配列であり、その配列の各要素はA,B,C,D,E,\0だ」として、宣言と初期化を行っています。

>char *pp;
「ppはcharのポインタである」と宣言を行っています。

>pp=dt;
「ppが指すポインタは、dtを指せ」と代入しています。結果、ppのポインタはdtを指し、ppのポインタの先にある文字列は"ABCDE"になります。

>printf("pp=%s\n",pp);
「pp」は「ポインタ」であり「そのポインタの先にある文字列は"ABCDE"」です。なので「ABCDE」が表示されます。

◎2について

printfの%sは「ポインタ」を受け取り、そのポインタの先にある文字列を表示します。これは◎1も◎2も変わりません。

>char *pt="ABC";
>char dt[10]="ABCDE";
>char *pp;
>pp=dt;
は◎1と同一なので説明を省きます。

>printf("*pt=%s\n",*pt);
>printf("*pp=%s\n",*pp);
どちらも、%sに対して「指してるポインタの中から取り出した文字」つまり「A」を渡しています。「文字A」はポインタではありません。

しかし、printfは「文字A」(アスキーコードで0x41、65である可能性が高い)を「ポインタだと信じて動く」ので「メモリの65番地にある内容を文字列だと思って表示しよう」とします。

もし「メモリの65番地にある内容が0」なら「1文字も表示せずに文字列の終りが来る」ので、何も表示しません。

もし「メモリの65番地から始まって、ずっ~と、数メガバイト、文字列の終りを示す0が無かった」としたら「メモリの65番地から数メガバイトに渡って、延々と文字列として表示し続け、プログラムを止められなくなる」と言う事態に陥った筈です。

今回は「偶然、何も表示しなかっただけ」で済みましたが、下手したらパソコンを強制リセットするしか無い状態になってたかも。

◎3について

printfの%dは「数値」を受け取り、その数値を表示します。

>printf("%d ",*pt);

ポインタとか*とはは何の関係もありません。「数値」を受け取るのだから「数値」を渡さなければなりません。

ptは「intを指してるポインタ」ですから、printfの引数に「*pt」と書くと「ポインタが指してる所にあるintの数値」が取り出されます。

そして、その「intの数値」がprintfに渡され、表示されます。

ここで注意しないとならないのは

[[[ printfは、渡された物がすべて正しいと思って、疑いもしない ]]]

と言う事です。

引数が足りなかったり、引数に指定した物の内容が変でも、何も疑わず、言われた通りに表示しようとします。

--------

一連の質問を見るに、質問者さんは「ポインタや配列で、*が付いている時、宣言、初期化、代入、参照がきちんと区別が出来ていない」ようです。

Cでは「見た目に、まったく同じ書き方」をしていても「それがどこに書いてあるかとか、前後の文脈の繋がりとかで、まったく全然別の意味」になってしまう文があります。

また、printfの%sと%dのように「見た目にそっくりだけど、まったく全然別のモノを要求してる」という事もあります。

この辺りの「見極め」が出来るまで「似たような書き方だから、同じように出来る筈」と思ってはいけません。

と言うか「似たような書き方だから、同じように出来る筈」と思ってしまうのが「質問者さんの悪い所」です。

Cでは「1文字でも違えば、何かが絶対に違う筈」という「疑う能力」が要求されます。

◎1について

printfの%sは「ポインタ」を受け取り、そのポインタの先にある文字列を表示します。

>char *pt="ABC";
「ptはcharのポインタであり、そのポインタの先にある文字列は"ABC"だ」として、宣言と初期化を行っています。

>printf("pt=%s\n",pt);
「pt」は「ポインタ」であり「そのポインタの先にある文字列は"ABC"」です。なので「ABC」が表示されます。

>char dt[10]="ABCDE";
「ptはcharの配列であり、その配列の各要素はA,B,C,D,E,\0だ」として、宣言と初期化を行っています。

>c...続きを読む

QMIDIデバイス、win7編

過去の[質問-回答]に、vistaでのMIDIデバイスについて書かれているのを見つけました。

「vistaでは、標準MIDIデバイス設定は無くなってしまった様だ」
との事ですが、win7ではどうなのでしょう?

もし、vista同様MIDIデバイス設定が無いのだとしたら、どうしたら、外部MIDI音源を通してMIDIファイルを鳴らす事が出来るのでしょう?

どうかおしえて下さい。

Aベストアンサー

私は、SC-8850を利用していますが、

下記ソフトのようなものを利用してMIDIマッパーの切り替えをしています。
http://openmidiproject.sourceforge.jp/MIDISelector.html
MIDIファイルをWindowsMediaPlayerで再生しても正しく音源から音が出ます。

正しくドライバーがインストールされていて利用できる環境であれば設定は可能のはずです。

8850の場合、USB接続のWin7ドライバが無いためVistaのドライバを利用していますが
動いています。(自己責任ですが)

参考URL:http://openmidiproject.sourceforge.jp/MIDISelector.html

QXファイルの法線情報について

現在、DirectX10を利用して3Dゲームを制作しています。
3Dデータを読み込むためにXファイルを使用しています。
Xファイルの読み込みは自分でXファイルパーサーを作成しています。

そして、
Xファイルには法線ベクトルの情報が入っています。
これは面法線情報であると今まで思っていました。
(理由:法線情報数が面情報数と一致していたので)
しかし、最近になって、頂点法線情報が入っているXファイルの存在を知りました
(理由:法線情報数と面情報数が一致せず、頂点数と一致していたので)

そこで質問があります。
Xファイルに入っている法線情報が面法線なのか、頂点法線なのか
知る方法を教えてください。

よろしくお願い申し上げます。

Aベストアンサー

> 1つのXファイルに1つのMESHの場合は、法線情報数が頂点数とも面数とも一致しないということはないですよね

例えば円盤をかんがえてみてください。

中心に1点頂点を置き、そこから放射状に20枚程度のポリゴンを敷き詰めて円盤を作ったとします。
完全な円盤であれば法線はどこを見ても一緒なはずなので、データとして1個だけ法線を持ち、
全ての面と法線がそれを参照する、といった形でデータを作ることもできます。

上記の場合、ファイル内の要素数は

点数→21
面数→20
法線数→1

となります。

法線数を点数、面数と一致するようにデータを作ることは可能です。
ですが、xファイルの仕様としてはそれは保障されていません。


人気Q&Aランキング

おすすめ情報