2013-02-18 15 views
6

Qualcuno può aiutarmi a convertire i file .mid in qualsiasi formato audio come .wav o .mp3 in formato programmatico.Converti file .mid in qualsiasi formato audio come file .wav o .mp3 in Android?

+0

Hai già provato la classe mediaplayer? può riprodurre file midi, forse è possibile intercettare il buffer di output e memorizzarlo come un'onda. – lelloman

+0

Sì, l'ho usato per riprodurre file midi ma non so come salvarlo? hai qualche idea? – sandeep

+0

potresti pubblicare il codice che hai scritto per suonare il midi? – lelloman

risposta

5

Ho pensato che fosse possibile utilizzare un AudioRecorder per registrare direttamente da un MediaPlayer, impostando il Mediaplayer come fonte audio del registratore, ma sembra che ci sia no way per farlo. Quindi, ho pensato due modi davvero non puliti:

1- La maggior parte dei dispositivi ha una presa jack da 3,5 mm con 3 canali, 2 per uscita stereo e una per ingresso microfono. Quello di cui hai bisogno è un cavo che divida i tre segnali in modo da poter collegare l'uscita stereo all'ingresso, in una sorta di cortocircuito, e registrare il MIDI dall'ingresso del microfono. L'ho usato per passare una fonte di streaming audio al telefono, elaborarlo e quindi inviarlo a un terzo dispositivo. Il filo di cui sto parlando è molto simile ai connettori RCA con audio stereo + video, so che sembra folle, ma dipende da cosa stai facendo.

2- Supponendo che non sia necessario registrare il MIDI durante la riproduzione, è possibile leggere il file midi e sintetizzare il suono manualmente. Questo è veramente difficile, specialmente quando si devono affrontare suoni di strumenti diversi (archi, batteria ecc.), L'uso di campioni potrebbe ridurre il lavoro, forse.

So che questa non è la risposta prevista, ma è meglio di niente, se siete così disperati di provare uno di questi metodi, posso fornire codice di esempio e collegamenti.

EDIT:

ok, che era pazzo. Ho trovato un altro modo, utilizzare la classe Visualizer. Lo scopo del visualizzatore non è quello di ottenere PCM per registrarlo, ma (sorprendentemente) per visualizzare l'onda sonora, quindi potrebbero esserci alcuni problemi di qualità. Tuttavia è possibile salvare PCM in formato wave, per farlo, è necessario aggiungere un'intestazione all'array PCM grezzo. Per il formato file wave dai uno sguardo here. Ecco un esempio, mostra solo l'array di byte ottenuto da MediaPlayer in un TextView, ma sembra funzionare ...!

android.permission.RECORD_AUDIO 
android.permission.MODIFY_AUDIO_SETTINGS 

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context=".MainActivity" > 

    <Button 
     android:id="@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Play" /> 

    <Button 
     android:id="@+id/btn2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Pause" /> 

    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <TextView 
      android:id="@+id/textview" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </ScrollView> 

MainActivity.java

package com.example.midify; 

import java.util.Arrays; 

import android.media.MediaPlayer; 
import android.media.audiofx.Visualizer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.app.Activity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    MediaPlayer mp; 
    TextView tv; 
    Visualizer mVisualizer; 

    Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      tv.setText((String) msg.obj); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mp = MediaPlayer.create(this, R.raw.midi); 

     Button btn = (Button) findViewById(R.id.btn); 
     Button btn2 = (Button) findViewById(R.id.btn2); 
     tv = (TextView) findViewById(R.id.textview); 

     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (!mp.isPlaying()) { 
        mp.start(); 
        init_visualizer(); 
       } 
      } 
     }); 

     btn2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       if (mp.isPlaying()) { 
        mp.pause(); 
        mVisualizer.release(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void finish() { 
     mp.release(); 
     mVisualizer.release(); 

     super.finish(); 
    } 

    private void PassData(byte[] data) { 
     String txt = Arrays.toString(data); 
     Message msg = handler.obtainMessage(); 
     msg.obj = txt; 
     handler.sendMessage(msg); 
    } 

    public void init_visualizer() { 
     mVisualizer = new Visualizer(mp.getAudioSessionId()); 
     mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); 

     Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener() { 
      @Override 
      public void onWaveFormDataCapture(Visualizer visualizer, 
        byte[] bytes, int samplingRate) { 
       PassData(bytes); 
      } 

      @Override 
      public void onFftDataCapture(Visualizer visualizer, byte[] bytes, 
        int samplingRate) { 

      } 
     }; 

     mVisualizer.setDataCaptureListener(captureListener, 
       Visualizer.getMaxCaptureRate(), true, false); 

     mVisualizer.setEnabled(true); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       mVisualizer.setEnabled(false); 
      } 
     }); 
    } 
} 
+0

Ciao, grazie per aver risposto di nuovo.Possiamo salvare l'output dal microfono, ma non è buono memorizzare il suono dal microfono perché in primo luogo aggiungerà un po 'di sfocatura ad esso e il secondo è, se stavamo parlando qualcosa quando stiamo salvando il suono dal microfono, allora la nostra voce si fondono anche con esso..so non sto usando il mic per salvare l'output. Grazie mille ancora .. se hai qualche suggerimento, per favore aiuto .. – sandeep

+0

@sandeep edit ...! – lelloman

+0

Salve, converto quel pcm (dati di byte) in formato wav ma l'uscita non è perfetta.Esso emette un suono sfocato e un po 'di musica midi quando lo suoniamo.Grazie ... – sandeep

Problemi correlati