private void SetDelta(int ch, midiChip chip, long NewFrameCounter) { if (ch >= chip.oldFrameCounter.Length) { return; } long sub = NewFrameCounter - chip.oldFrameCounter[ch]; long step = (long)(sub / (double)Common.SampleRate * 960.0); chip.oldFrameCounter[ch] += (long)(step * (double)Common.SampleRate / 960.0); bool flg = true; for (int i = 0; i < 4; i++) { byte d = (byte)((step & (0x0fe00000 >> (7 * i))) >> (21 - 7 * i)); if (flg && d == 0 && i < 3) { continue; } flg = false; d |= (byte)((i != 3) ? 0x80 : 0x00); chip.data[ch].Add(d); } }
private void InitMIDIDevice() { midi = new midiChip(); midi.maxTrk = 16; midi.data = new List <byte> [midi.maxTrk]; midi.oldFrameCounter = new long[midi.maxTrk]; for (int i = 0; i < midi.maxTrk; i++) { midi.data[i] = new List <byte>(); midi.oldFrameCounter[i] = -1L; } for (int i = 0; i < midi.maxTrk; i++) { midi.data[i].Add(0x4d); //チャンクタイプ'MTrk' midi.data[i].Add(0x54); midi.data[i].Add(0x72); midi.data[i].Add(0x6b); midi.data[i].Add(0x00); //データ長 この時点では不明のためとりあえず0 midi.data[i].Add(0x00); midi.data[i].Add(0x00); midi.data[i].Add(0x00); midi.data[i].Add(0x00); //delta0 midi.data[i].Add(0xff); // メタイベントポート指定 midi.data[i].Add(0x21); midi.data[i].Add(0x01); midi.data[i].Add(0x00); //Port1 midi.data[i].Add(0x00); //delta0 midi.data[i].Add(0xff); // メタイベント トラック名 midi.data[i].Add(0x03); midi.data[i].Add(0x00); } }