Rikkymodule/関数一覧/midiconverter系

このページでは、Rikkymoduleで追加される関数を解説する。

## midiconverter関数、midiconverterEx関数

ます、音を出すものではありません

* midiファイル(smf)をluaでも読みやすい形式に変換するものです
* 読み込んだmidファイルと同じ場所に同名で拡張子が.datになったファイルを生成します

```
 boolean = rikky\_module.midiconverter(string)

```

* 第1引数はmidiファイルのフルパスです
* 戻り値は変換に成功するとtrue、失敗するとfalse返ってきます
	+ また変換後のファイルがある場合も成功としてtrueを返します

```
 boolean = rikky\_module.midiconverterEx(table, string)

```

* 第1引数にはmidiファイルを解析して、そのデータを用いたオブジェクトを生成するためのテーブルを渡します
* 第2引数はmidiファイルのフルパスです
* 戻り値は変換に成功するとtrue、失敗するとfalse返ってきます
	+ また変換後のファイルがある場合も成功としてtrueを返します
* オブジェクトを生成したテーブルにはいくつかのメソッドが使えるようになっています
	+ また変換した.datファイルの中身も同じテーブル内に収められています

例

```
local midi = {}
local success = rikky\_module.midiconverterEx(midi, "C:\\rikky.mid")
if not success then
	return
end
local oldtime = midi:SetOffsetTime(10)

```

* 上のように使います

メソッドは現在以下のものがあります

* :関数名はmidiconverterExで引数としたテーブル変数の後に関数名をつけることを意味を表しています
	+ 上記の例を参考にしてください

* `number = :SetOffsetTime(number)`
	+ 再生時間を移動させることができます、初期状態は0で、秒数を数値で指定します、戻り値は前のoffsettimeです
* `number = :SetUprange(number)`
	+ Now系のメソッドで取得する上限を決めます、初期状態は0です、戻り値は前のuprangeです
* `number = :SetDownrange(number)`
	+ Now系のメソッドで取得する下限を決めます、初期状態は0です、戻り値は前のdownrangeです
* `number = :SetTyperange(number)`
	+ Now系のメソッドで取得する際にUprangeとDownrangeの解釈を変更します、0だと範囲なし、1だと秒数、2だと経過時間、3だと小節数です、戻り値は前のtyperangeです

例

```
midi:SetDownrange(1)
midi:SetUprange(2)
midi:SetTyperange(1)

```

* 現在の時間の1秒前から2秒後までのデータを取得できるようになります

```
midi:SetDownrange(480)
midi:SetUprange(1920)
midi:SetTyperange(2)

```

* 現在の経過時間から480引いた数から現在の経過時間に1920を加えた数までのデータを取得できるようになります(基本的に480が1拍を表します)

* `number = :Step2Time(number)`
	+ 経過時間を秒数に変換します、引数が経過時間で戻り値が秒数です
* `number = :Time2Step(number)`
	+ 秒数を経過時間に変換します、引数が秒数で戻り値が経過時間です
* `number, number, number = :Step2Bar(number)`
	+ 経過時間を小節数などに変換します、引数は経過時間で戻り値が小節数、拍数、その拍の経過パーセント(0から1未満)
* `number = :Bar2Step(number, number, number)`
	+ 小節数などを経過時間に変換します、引数は小節数、拍数、その拍の経過パーセント(0から1未満)で戻り値が経過時間です
* `string = :NoteNumber2KeyName(number)`
	+ ノート番号を音階の文字列に変換します、引数はノート番号(60など)で戻り値が音階を表す文字列(C4など)です
* `number = :KeyName2NoteNumber(string)`
	+ 音階の文字列をノート番号に変換します、引数は音階を表す文字列(C4など)で戻り値がノート番号(60など)です

* `number = :GetMaxNoteNumber()`
	+ 読み込んだmidiの一番高い音のノート番号を返します
* `string = :GetMaxNoteName()`
	+ 読み込んだmidiの一番高い音の音名を返します
* `number = :GetMinNoteNumber()`
	+ 読み込んだmidiの一番低い音のノート番号を返します
* `string = :GetMinNoteName()`
	+ 読み込んだmidiの一番低い音の音名を返します
* `number = :GetTrackNum()`
	+ 読み込んだmidiのトラック数を返します
* `number = :GetDeltaTime()`
	+ 読み込んだmidiの単位時間(4分音符1つ分の経過時間)を返します
* `number = :GetMidiLength()`
	+ 読み込んだmidiの曲の全体の経過時間を返します

* Now系のメソッドはSetOffsetTimeで設定した時間プラスオブジェクトの経過時間(obj.time)をもとに現フレームにおける各データを取得します
	+ SetTyperangeが0(初期状態)かそれ以外かで戻り値の型や戻り値のテーブルの構造が変わるものもあります
* `string or table = :GetNowScaleKey()`
	+ type : 0
		- 現在のスケールのキー(CやCmなど)の文字列を返します
	+ type : 1,2,3
		- 現在の範囲内のスケールのキー(CやCmなど)が入ったテーブルを返します
		- テーブルには単数または複数のテーブルが入っています
			* テーブルにはstepとkeyの要素が入っていて、table[1].stepのように使います
			* keyはスケールキーの文字列、stepはスケールキーになった経過時間の数値です
			* 複数の場合は要素が若い順に経過時間も小さくなっています
			* 例えば現在の経過時間が1920で`table[1].step=0、table[1].key="C"、table[2].step=3840、table[2].key="A"`ならば現在のスケールキーはCメジャーとなります
* `string or table = :GetNowScaleName()`
	+ type : 0
		- 現在のスケールの調号(ハ長調やハ短調など)の文字列を返します
	+ type : 1,2,3
		- 現在の範囲内のスケールの調号(ハ長調やハ短調など)が入ったテーブルを返します
			* テーブルには単数または複数のテーブルが入っています
			* テーブル内テーブルにはstepとnameの要素があって、table[1].stepのように使います
			* nameは調号の文字列、stepはその調号になった経過時間の数値です
			* 複数の場合は要素が若い順に経過時間も小さくなっています
			* 例えば現在の経過時間が1920で`table[1].step=0、table[1].name="ハ長調"、table[2].step=3840、table[2].name="イ長調"`ならば現在の調号はハ長調となります
* `table = :GetNowBPM()`
	+ type : 0
		- 現在の現在のbpm情報が入ったテーブルを返します
			* テーブルにはtempo、bpmの2つの要素があります
			* tempoは単位時間(4分音符1つ分)経過する時間(マイクロ秒)の数値、bpmは1分当たりの4分音符の数を表した文字列です
	+ type : 1,2,3
		- 範囲内のbpm情報が入ったテーブルを返します
			* テーブルには単数または複数のテーブルが入っています
			* テーブル内テーブルにはtempo、bpm、stepの3つの要素があって、table[2].tempoのように使います
			* tempoは単位時間(4分音符1つ分)経過する時間(マイクロ秒)の数値、bpmは1分当たりの4分音符の数を表した文字列、stepはこのbpmが開始する経過時間の数値です
			* 例えば現在の経過時間が1920で`[1].step=0、table[1].bpm="120.00"、table[2].step=3840、table[2].name="159.00"`ならば現在のbpmは120となります
* `number or table = :GetNowStepNum()`
	+ type : 0
		- 現在の経過時間の数値を返します
	+ type : 1,2,3
		- 現在の範囲内の経過時間が入ったテーブルを返します
			* テーブルにはstep、low\_step、high\_stepの3つの要素があります
			* stepは現在の経過時間の数値、low\_stepが範囲の下限の経過時間の数値、high\_stepが範囲の上限の経過時間の数値です
* `table = :GetNowNote()`
	+ typeに関わらず同一テーブルを返します
		- テーブルにはトラック数の数だけテーブルを持ちます
		- 各テーブルには範囲または現在に該当するノートが0または単数または複数だけ入っています
		- 各ノートはテーブル型で1番目の要素がノート番号(C4などを表した数値)、2番目が鳴り始めの経過時間の数値、3番目が鳴り終わりの経過時間の数値、4番目がベロシティ(音の強さ)で0から1の数値です
* `table = :GetNowExpression()`
	+ typeに関わらず同一テーブルを返します
		- テーブルにはトラック数の数だけテーブルを持ちます
		- 各テーブルには範囲または現在に該当するエクスプレッションが0または単数または複数だけ入っています
		- 各エクスプレッションはテーブル型で1番目のそのエクスプレッションになる経過時間の数値、2番目がエクスプレッションの数値(0から127)です

### .datファイルの読み方

midiでは各イベントは独自の経過時間を用いています

* まず単位時間という単位(四分音符1つ分がどのぐらいか)が決まっています
	+ 例えば単位時間が480で経過時間が1920ならば4拍分経過したことになります
	+ 実際どのぐらいの時間(秒)が経過したかはbpmなど使って計算します

bpm
* テーブルの1番目の要素は経過時間です
* 2番目は四分音符1つ分のマイクロ秒です(つまり、100000で割ると秒になります)

rhythm
* テーブルの1番目の要素は経過時間です
* 2番目は拍子の分子です
* 3番目は拍子の分母です

scale
* テーブルの1番目の要素は経過時間です
* 2番目はシャープまたはフラットの数です(プラスならシャープ、マイナスならフラットの数)
* 3番目は長調か短調かのフラグです(0が長調、1が短調です)

event
* eventテーブルには複数のnoteとexpressionが収められています
* noteの各要素は
	+ 1番目が鳴らす音の番号です(60ならC4です)
	+ 2番目が鳴り始める経過時間
	+ 3番目が鳴り終わる経過時間
	+ 4番目がべロシティです
* expressionの各要素は
	+ 1番目が変化開始の経過時間です
	+ 2番目が強さです(最大値が127で最小値が0です)

info
* テーブルの1番目の要素は音の番号の最大値です
* 2番目は音の番号の最小値です
* 3番目はeventテーブルの要素数です(音が鳴るトラック数)
* 4番目は単位時間です
* 5番目は全体の経過時間です