2014-11-08 50 views
0

我想製作一個我自己的用戶界面,它發出MIDI信號(或OSC或其他),這些信號會導致拇指帶或車庫帶或我已經安裝在我的其他程序ipad,(或Galaxy)播放我創作的音樂。我怎麼做?有什麼方法可用。我必須使用什麼編程語言來創建我的「控制器」應用程序?什麼API。什麼是最快的方式來實現這一目標。控制在Android和IOS後臺運行的音樂合成器

看起來OSC應該是我應該做的,至少對於iPad而言,但在我看來,它只能在網絡上的機器之間工作。我希望它可以在正在運行的應用程序之間工作,就像我看到Jordan Rudess的SampleWiz由另一個程序控制或者https://www.youtube.com/watch?v=ZMyRS9y20mw thumbjam控制sampleTank(我現在再次查看該視頻並看到它的MIDI)

+0

的[誰能告訴我如何在iOS上使用CoreMIDI?]可能重複(http://stackoverflow.com/questions/13952151/can-anyone-show-me-how-to-use-coremidi -on-ios) – 2014-11-09 07:39:26

+0

沒有。這是說明如何從您的IOS設備(即您的iPad或iPhone)連接到外部設備(即數字音樂鍵盤)。 – pashute 2014-11-10 08:21:12

+0

「您可以使用本地CoreMIDI會話向/從另一個CoreMIDI兼容應用程序發送或接收消息」 – 2014-11-10 08:24:57

回答

0

這是一個準系統的Android項目創建一個MIDI文件,然後由外部MIDI合成器播放。出於測試目的,包括playNewMIDIFile()。這使用Android自己的MediaPlayer播放新文件。

包含此提取物的原始問題可以找到here

package com.example.midi; 

import java.io.File; 
import java.io.FileDescriptor; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 

import android.app.Activity; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 

public class Main extends Activity { 

    private String file = "midi.mid"; 
    private MediaPlayer mediaPlayer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    createNewMIDIFile(); 
    playNewMIDIFile(); 
    } 

    public void createNewMIDIFile() { 
    Integer[] stream = new Integer[]{ 
     // 
     0x4d, 0x54, 0x68, 0x64, // MThd = MIDI file designator 
     0x00, 0x00, 0x00, 0x06, // Standard MIDI File (SMF) 
     0x00, 0x01, 0x00, 0x02, // multiple-track format: 2 tracks 
     0x00, 0x40, // 64 ticks per beat (quarter note) 
     0x4D, 0x54, 0x72, 0x6B, // Header for track 1 
     0x00, 0x00, 0x00, 0x0B, // 11 bytes to describe the track 
     0x00, 0xFF, 0x51, 0x03, // set tempo: 
     0x0F, 0x42, 0x40, // 1,000,000 microseconds/beat: 60 bpm 
     0x00, 0xFF, 0x2F, 0x00, // End of track 1 
     0x4D, 0x54, 0x72, 0x6B, // Header for track 2 
     0x00, 0x00, 0x00, 0x0F, // 15 bytes to describe the track 
     0x00, // Immediately 
     0xC1, 0x01, // change instrument for track 2 to piano 
     0x00, // Immediately 
     0x91, 0x3C, 0x7F, // play middle C with a velocity of 127 
     0x30, // 48 ticks later (dotted eighth note) 
     0x81, 0x3C, 0x00, // stop playing the middle C 
     0x00, 0xFF, 0x2F, 0x00 // End of track 2 
    }; 

    int length = stream.length; 
    byte[] byteStream = new byte[length]; 
    for (int ii = 0; ii < length; ii++) { 
     byteStream[ii] = (byte) (stream[ii] % 256); 
    } 

    try { 
     FileOutputStream outputStream = openFileOutput(file, MODE_PRIVATE); 
     outputStream.write(byteStream); 
     outputStream.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    public void play(View view) { 
    /* Triggered by a button defined in activity_main.xml as 
    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="play" 
    android:text="Play MIDI" /> 
    */ 
    playNewMIDIFile(); 
    } 

    public void playNewMIDIFile() { 
    try { 
     String filename = getFilesDir() + "/" + file; 
     File midifile = new File(filename); 
     FileInputStream inputStream = new FileInputStream(midifile); 
     FileDescriptor fileDescriptor = inputStream.getFD(); 
     mediaPlayer.reset(); 
     mediaPlayer.setDataSource(fileDescriptor); 
     inputStream.close(); 
     mediaPlayer.prepare(); 
     mediaPlayer.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
}