# HG changeset patch # User Masataka Kohagura # Date 1409044210 -32400 # Node ID 353a1a3035ea6f7d45523863df1ec176df987a02 # Parent 497a4de079bcff9c6ecb19bb576ed595a77fb5da add Aug_26th.html diff -r 497a4de079bc -r 353a1a3035ea Aug_26th.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Aug_26th.html Tue Aug 26 18:10:10 2014 +0900 @@ -0,0 +1,352 @@ + + + + + 26th,August + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+

マルチコアソフトウェアシンセサイザー(仮)

+
+
+ Masataka Kohagura 22th June,2014 +
+
+ + +
+

研究目的

+

+ コンピュータ上で作曲を行うときは、ハードウェアシンセサイザーの音を録音するのではなく、ソフトウェアシンセサイザー(以下ソフトシンセ)で収録することが主流となっている。 +

+

+ ソフトシンセのマルチコア化は進んでいる。しかし、現状としてはマルチコアで駆動しているわけではなく、1つのコアだけに負荷がかかるものが多い。 +

+

+ 作曲をする上ではソフトシンセを複数立ち上げることが基本となっている。 + また、オシレーターの複数使用や Filter による波形編集を重ねると計算量が大きくなっていくため、ソフトシンセ単体の動作を軽量化する必要がある。
+

+

+ また、実用的なシンセサイザーは入力に対するレスポンスが必須となるので、計算量が多くなっても入力から出力までの遅延を抑える必要がある。 +

+

+ (軽量化しながら音を良くしたいが、抽象的すぎて評価する点がみつけづらい)
+ 音がいいって何??
+ 評価どうするの?? +

+
+ + +
+

今週までの作業

+
    +
  • + Cerium にて SDL_audio.h を使用して音を出せるようにした。(単音出力) +
  • +
  • + 三角波、矩形波の実装 +
  • +
  • + MIDI コントローラーからの入力を受け付ける(途中) +
  • +
+
+ +
+

SDL

+
    +
  • + SDL : Simple DirectMedia Layer
    + マルチメディア関係のソフトウェアを開発するための、グラフィックやサウンド等の API を提供するライブラリ。 +
  • +
  • + Windows, Mac OS X, Linux, iOS, Android をサポート +
  • +
  • + C,C++
    + C#,Python もいけるみたい?? +
  • +
+
+ +
+

SDL_audio.h(1/3)

+
    +
  • + SDL に含まれている、オーディオ回りのライブラリ +
  • +
  • + オーディオ情報(音量、ステレオ、sampling rateなど)を SDL_AudioSpec(構造体)として持っている。 +
  • +
    +    
    +typedef struct SDL_AudioSpec {
    +    int freq;          /** DSP frequency -- samples per second */
    +    Uint16 format;     /** Audio data format */
    +    Uint8  channels;   /** Number of channels: 1 mono, 2 stereo */
    +    Uint8  silence;    /** Audio buffer silence value (calculated) */
    +    Uint16 samples;    /** Audio buffer size in samples (power of 2) */
    +    Uint16 padding;    /** Necessary for some compile environments */
    +    Uint32 size;       /** Audio buffer size in bytes (calculated) */
    +    void (SDLCALL *callback)(void *userdata, Uint8 *stream, int len);
    +    void  *userdata;
    +} SDL_AudioSpec;
    +    
    +    
+ +
+ +
+

SDL_audio.h(2/3)

+
    +
  • + SDL_AudioSpec を SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained);という関数に渡すことによって、音が再生される。 +
  • +
    +    
    +SDL_AudioSpec Desired;
    +SDL_AudioSpec Obtained;
    +
    +int main(int argc, char *argv[])
    +{
    +    printf("Freq:%f\n",Frequency);
    +    Desired.freq= 44100; /* Sampling rate: 44100Hz */
    +    Desired.format= AUDIO_S16LSB; /* 16-bit signed audio */
    +    Desired.channels= 1; /* Mono */
    +    Desired.samples= 8192; /* Buffer size: 8K = 0.37 sec. */
    +    Desired.callback= callback;
    +    Desired.userdata= NULL;
    +
    +    SDL_OpenAudio(&Desired, &Obtained);
    +    SDL_PauseAudio(0);
    +    SDL_Delay(200);
    +    SDL_Quit();
    +    return 0;
    +}
    +    
    +    
+ +
+ +
+

SDL_audio.h(3/3)

+
    +
  • + SDL_AudioSpecにSDLCALL 関数が含まれている。ここで、音の波形を生成しておき、 SDL_OpenAudioにて音を再生する。 +
  • +
    +    
    +void callback(void *userdata,Uint8 *stream,int len){
    +
    +    AudioDataPtr au = (AudioData*)userdata;
    +
    +    char *waveform_name = au->waveform_name;
    +    double frequency = au->frequency;
    +    int volume = au->volume;
    +    static unsigned int step = 0;
    +    Uint16 *frames = (Uint16 *) stream;
    +    int framesize = len / 2;
    +
    +    if(strcmp(waveform_name, "tri")){
    +
    +        for (int i = 0; i < framesize ; i++, step++){
    +            frames[i] = tri(step * frequency / Obtained.freq) * volume ;
    +        }
    +
    +    }else if(strcmp(waveform_name, "sqr")){
    +
    +        for (int i = 0; i < framesize ; i++, step++){
    +            frames[i] = square(step * frequency / Obtained.freq) * volume ;
    +        }
    +
    +    }
    +}
    +    
    +    
+ +
+ +
+

波形の生成

+ +

矩形波

+
+    
+double
+square(double t){
+    double decimal_part = t - abs(t);
+    return decimal_part < 0.5 ? 1 : -1;
+}
+    
+    
+ + + +
+ + + +
+

波形の生成

+ +

三角波

+ +
+    
+double
+tri(double t){
+
+    double decimal_part = t - abs(t);
+
+    if(abs(t) % 2 != 0){
+        return decimal_part < 0.5 ? decimal_part : 1 - decimal_part;
+    }else{
+        return decimal_part < 0.5 ? -decimal_part : 1 - decimal_part;
+    }
+}
+
+    
+    
+ + + +
+ + + +
+

波形の生成

+ +

のこぎり波

+
+    
+double
+saw(double t)
+{
+    double decimal_part = t - abs(t);
+    return decimal_part;
+}
+    
+    
+ + +
+ + + +
+

いましていること

+
    +
  • + MIDI I/O は PortMidi を使用して実装中である。 +
  • +
  • + Multi Platform 対応、 + Windows (MME)、 + Mac (CoreMIDI)、 + Linux (ALSA) +
  • +
+ +
+ +
+ +