|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Linux: ファイルマネージャから Timidity の ncurses インターフェイスで MIDIファイルを再生する

Nautilus、Konqueror でファイル一覧を眺めつつ、その中から選んでダブルクリックないし コンテキストメニューから選択して再生させたい。 「これどんな曲だったっけ?」みたいな時にちょろっと使いたい。

最低限、一時停止とボリューム調節くらいはできるようにしたい。

Ruby/Qt あたりで GUIフロントエンドとかごにょごにょできるかな?などと思ったものの さっさと使いたいのでもっと簡単な方法を探す → そういえば Timidity の ncurses インターフェイスってのがあったような → 使ってみた → これでいいんじゃない?

という経緯で…。以下シェルスクリプトです。

#!/bin/bash

## $1 だとファイル名にスペースが入ったとき動かない。
mididir=`dirname "$*"`
midifile=`basename "$*"`

cd $mididir
rxvt -e timidity -in "${midifile}" 
# その他オプションはお好みで。

最初 gnome-terminal、konsole を使ってみたけど、どうも上手くいかなかったので (konsole に関しては擬似端末の権限がどうとか) rxvt を使うことに。

適当なとこに置いて、ファイルマネージャで MIDIファイルに関連付けしてできあがり。


Firefox のアドオン ViewSourceWith に登録しておけば、Firefoxで見ているページ内の MIDIファイルへのリンクから再生できます。 たぶん内部的にはローカルに一旦保存してから開いてます。


キーボード h でキーバインド等のヘルプが出ますが、以下適当に抜粋。

s  一時停止

V/Up   音量上げる
v/Down 音量下げる

r/Home  曲の先頭から演奏

>  再生スピード上げる
<  再生スピード下げる

+  キー上げる
-  キー下げる

t  トレースモード ON/OFF

ちなみに自分の環境は Ubuntu Studio 8.04 です。

スポンサーサイト

対訳: クリエイティブ・コモンズが営利・非営利の利用法について調査を始めたとのこと

Creative Commons Launches Study of “Noncommercial Use”
クリエイティブ・コモンズが「非営利利用」についての調査を開始

Eric Steuer, 2008-09-18

Today, Creative Commons announced the launch of a research study that will explore differences between commercial and noncommercial uses of content. The study will explore how the definitions of “commercial use” and “noncommercial use” are understood among various communities and in connection with a wide variety of content.

クリエイティブ・コモンズは今日、コンテンツの「営利利用」と「非営利利用」の違いについて模索する調査研究を始めると公表した。 この研究では、「営利利用」と「非営利利用」の定義がさまざまなコミュニティーで、またさまざまなコンテンツとの関わりにおいてどのように理解されているかを探る。

“The study has direct relevance to Creative Commons' mission of providing free, flexible copyright licenses that are easy to understand and simple to use,” said Creative Commons CEO Joi Ito. “The NC term is a popular option for creators choosing a Creative Commons license, and that tells us the term meets a need. However, as exponentially increasing numbers of works are made available under CC licenses, we want to provide additional information for creators about the contexts in which the NC term may further or impede their intentions with respect to the works they choose to share, and we want to make sure that users clearly understand those intentions. We expect the study findings will help us do a better job of explaining the licenses and to improve them, where possible. We also hope the findings, which will be made publicly available, will contribute to better understanding of some of the complexities of digital distribution of content.”

「この調査は、 『分かりやすくかシンプルであり、自由で柔軟な著作権ライセンス』 というクリエイティブ・コモンズのミッションと直接的な関わりを持つ」 とクリエイティブ・コモンズの CEO 伊藤穰一氏は語った。 「『非営利』という条件は、クリエイティブ・コモンズ・ライセンスを選択するクリエイターにとっては一般的なオプションであり、ニーズに合っていることが分かります。 ですが、CCライセンスで利用できる作品が指数的に増えるのにともない、 『非営利』がどのような条件のとき 共有のために彼らが選んだ作品へのリスペクトを伴った意図を後押しするか、あるいは妨げるかといった 付加的な情報をクリエイターに対して提供したくなりました。 また、それらの意図を利用者がはっきりと理解できるようにしたいと思っています。 この調査の結果によってうまく条件を示せるようになり、可能な場合はそれらを向上できるようになることを期待しています。 調査結果は公に利用できる形にする予定ですが、 コンテンツのデジタル配布にまつわる複雑さのいくつかをよりよく理解する手助けになればと願っています。 」

You can read more about this news in the press release CC issued this morning.

今朝のプレスリリースで詳細を読むことができる。

Thank you to The Andrew W. Mellon Foundation for its generous support of this study.

調査に対するアンドリュー・W・メロン財団 の全般的なサポートに感謝する。

Creative Commons License
This work by sonota is licensed under a Creative Commons Attribution 3.0 Unported License.
Based on a work at creativecommons.org.

雑メモ: libsndfile を使ってみた

まあ、いろいろと適当ですけど…… いやほんと適当なのでちゃんとやりたい人は The libsndfile API とかを見てください。


Ubuntu Linux の場合は
  $ sudo apt-get install  libsndfile1-dev


16bit の場合

---- 32767
∫
----  1
----  0
---- -1
∫
---- -32767

指定されたフレーム数だけ読み込んで値を表示

/*
gcc snd-003.c -lsndfile -o snd-003.exe
snd-003.exe wav_file_name frames_to_display

frames_to_display で指定されたフレーム数だけ読み込んで値を表示。
入力ファイルのフォーマットは 16bit, ステレオ(チャンネル数=2)。
*/

#include <stdio.h>
#include <sndfile.h>

int main( int argc, char** argv ){

  // ファイル名
  char* file_in =  argv[1] ;
  // 読み込むフレーム数
  int frames_to_read = atoi( argv[2] );

  // ファイルハンドラ
  SNDFILE* sf;
  // チャンネル数、サンプリング周波数などを持つ構造体
  SF_INFO sinfo;

  // sf_open の前に 0 にしておく
  sinfo.format = 0;

  // ファイル開く
  sf = sf_open( file_in, SFM_READ, &sinfo );

  printf( "%s\n", argv[1] );
  printf( "--------\n" );

  // 読み込むフレーム数
  sf_count_t count = 1;

  // 読み込んだ値を入れる配列
  short val[2];

  // 1フレームずつ読み込んで値を表示
  int a;
  for( a = 0; a < frames_to_read; a++ ){
    sf_readf_short( sf, val, count) ;

    printf( "% 4d:  L: % 6d  -  R: % 6d \n", a, val[0], val[1] );
  }

  // ファイル閉じる
  sf_close( sf );

  return 0;
}

読んでそのまま書き込み

/*
20080914
gcc snd-004.c -lsndfile -o snd-004.exe
snd-004.exe file_in file_out

file_in を読み込んで 1フレームずつ読み、file_out に移し替える
入力ファイルのフォーマットは 16bit, ステレオ(チャンネル数=2)とする。
*/

#include <stdio.h>
#include <sndfile.h>

int main( int argc, char** argv ){
  char* file_in  = argv[1] ;
  char* file_out = argv[2] ;

  SNDFILE* sfr;
  SNDFILE* sfw;
  // チャンネル数、サンプリング周波数などを持つ構造体
  SF_INFO sinfo;

  sinfo.format = 0;

  // ファイル開く
  // 入力
  sfr = sf_open( file_in, SFM_READ, &sinfo );
  // 出力 - 入力ファイルと同じフォーマットなので、sinfo をそのまま渡す
  sfw = sf_open( file_out, SFM_WRITE, &sinfo );

  printf( "sinfo.frames   = %d  \n", sinfo.frames   );
  printf( "sinfo.format   = 0x%x\n", sinfo.format   );
  printf( "sinfo.channels = %d  \n", sinfo.channels );
  printf( "sinfo.sections = %d  \n", sinfo.sections );
  printf( "sinfo.seekable = %d  \n", sinfo.seekable );

  printf( "--------\n" );

  sf_count_t count = 1;
  short val[ (int)count * sinfo.channels ];

  int a = 0;
  sf_count_t read_num;
  while(1){
    // これ以上データがないという場合には count と異なる値が返ってくる
    read_num = sf_readf_short(  sfr, val, count) ;
    printf( "% 4d:  L: % 6d  -  R: % 6d  -  %6d \n", a, val[0], val[1], read_num );

    if( read_num != count ){ 
      // ファイル終端まで達したらループ抜ける
      break; 
    } else {
      // 読み込みに成功していれば書き込む
      sf_writef_short( sfw, val, count) ;
    }

    a++;
  }

  // ファイル閉じる
  sf_close( sfr );
  sf_close( sfw );

  return 0;
}

サイン波を書き出す

参考: TaptAudio: sample.cpp Source File / unpaid_p10l: Parser/Reader for Korg KMP and KSF Files

/*
20080915
gcc snd-006.c -lsndfile -o snd-006.exe
snd-006.exe file_out frequency length_sec

周波数(Hz)、長さ(秒)を指定してサイン波を書き出す。
出力ファイルのフォーマットは 16bit, モノラル(チャンネル数=1)とする。
*/

#include <stdio.h>
#include <stdlib.h> // atof
#include <math.h> // atan, pow
#include <sndfile.h>

#define PI ( 4*atan(1.0) )

#define SAMPLE_RATE 44100
#define BIT_DEPTH 16

// 16bit のとき 2^15 - 1 = 32767
#define AMP_MAX (pow(2,(BIT_DEPTH-1)) - 1)

short frame2sine( int frame, double freq){
  //  double sec = (double)(frame % SAMPLE_RATE) / SAMPLE_RATE;
  double sec = (double)frame / SAMPLE_RATE;
  return (short)( sin( sec * 2 * PI * freq ) * AMP_MAX );
}

int main( int argc, char** argv ){
  char* file_out = argv[1] ;
  double freq = atof(argv[2]) ;
  double length_sec = atof(argv[3]) ;

  SNDFILE* sfw;
  SF_INFO sfinfo;

  // .wav の場合最低限この3つは指定しないといけないっぽい
  sfinfo.samplerate = SAMPLE_RATE;
  sfinfo.channels = 1;
  sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;

  // 書き込み用に sf_open() する前にフォーマットをチェック
  if( sf_format_check( &sfinfo ) == 0 ){
    printf( "invalid format: %d\n", sf_format_check( &sfinfo ) );
    exit(1);
  }

  sfw = sf_open( file_out, SFM_WRITE, &sfinfo );

  sf_count_t frames = 1;
  short val[ (int)frames * sfinfo.channels ];

  int a = 0;
  sf_count_t write_num;
  for( a=0; a < (int)(SAMPLE_RATE * length_sec); a++ ){
    val[0] = frame2sine(a, freq);
    write_num = sf_writef_short( sfw, val, frames ) ;
  }

  sf_close( sfw );

  return 0;
}

参考

MIDIキーボードを Ubuntu Studio + LMMS に繋いでピコピコした音で弾く

Ubuntu Studio 8.04 で試しました。たぶん素の Ubuntu でもほとんど同じだと思います。

$ uname -a
Linux squirrel 2.6.24-19-rt #1 SMP PREEMPT RT Thu Aug 21 02:08:03 UTC 2008 i686 GNU/Linux

機器

とりあえず今回自分が使ったものを挙げておきますが、お好きなもの・お持ちのものでどうぞ。

キーボード。

MIDI-USBケーブル。

Ubuntu Studio のインストール

省略。だいたい Ubuntu と一緒です。

日本語入力

$ sudo apt-get install anthy scim-anthy

一応。日本語でメモとか取るために。

接続

キーボードの MIDI-OUT ~ UX16 ~ パソコン の USB となるように繋ぎます。

INとOUTを間違えないようにしましょう。 UX16 だと、差し間違えていなければケーブルに付いているランプが点滅します。

LMMS

$ sudo apt-get install lmms  # インストール
$ lmms  # 起動

初回起動時には設定ウィンドウが出ますが、後で変更できるのでスキップしても大丈夫です。

バッファの設定

メニューから [ Settings - Show settings dialog General settings - BUFFER SIZE ] でバッファのサイズを小さくしておきます。

とりあえず、 最小値 Frames: 64 Latency: 1.5ms に設定し [ OK ] を押します。

ほとんどの変更は再起動するまで反映されません、とのことなので [ OK ] を押して LMMS を一旦終了させ、再起動します。

音色とMIDIの設定

ウィンドウ左上のここをクリック

ドラッグ&ドロップで BitInvader をソングエディタに追加。

鍵盤のアイコンをクリックして [ MIDI input - 20:0 UX16 MIDI 1 ] (お使いの機器を選んでください)

この状態で MIDIキーボードを弾くと、サイン波が出ます。

では、音色をピコピコした矩形波に変えましょう。

BitInvader の音色設定ウィンドウ右側から矩形波をクリック(★1)。

これだけでもいいのですが、ノイズが混じって耳障りなので [ Interpolation ] を有効にしておきます(★2)。
また、音量はウィンドウ上側の VOLUME で調節してください (★3、ツマミをクリックして上下にドラッグするか、ツマミにカーソルを合わせてマウスホイール上下)。

これで準備完了です!思う存分ピコピコしてください!

おまけ

エンベロープは [ ENV/LFO/FILTER ] タブで設定できます。 デフォルトでは無効になっていますが、図の赤枠内の部分をクリックするとエンベロープが効くようになります。

以上。

関連記事

参考(外部リンク)

Script-Fu: 現在のレイヤーをレベル補正して緑色にする

黒い線で下描き書いて、緑色にして、透明な新規レイヤーを上に作ってなぞる、 という作業で使っています。 関数名適当ですごめんなさい。


; anobota-level-greenize.scm

(define (script-fu-anobota-level-greenize img drawable)
  ; アンドゥしたらここに戻る
  (gimp-image-undo-group-start img)
  
  ; レベル補正
  ; 最後の5つの引数は 入力レベル黒、白、中間(灰色)、出力レベル黒、白
  (gimp-levels drawable 2   0 255 1 255 255)

  ; 表示に反映
  (gimp-displays-flush)
  
  ; ここまでがアンドゥの対象
  (gimp-image-undo-group-end img)
)

(script-fu-register
  "script-fu-anobota-level-greenize"
  "<Image>/Script-Fu/misc/緑化" ; このスクリプトのメニュー位置
  "レベル補正色で緑に" ; このスクリプトの説明
  "sonata" ; 作者名
  "(c) 2007" ; コピーライト
  "2007-06-27" ; 製作日
  "RGB*"  ; スクリプトが動作可能なモード
  SF-IMAGE "Image" 0       ; 引数1
  SF-DRAWABLE "Drawable" 0 ; 引数2
)

Gimp: 記事のもくじ

Script-Fu: 透明な新規レイヤーを作成して追加

ただそれだけの簡単なスクリプトです。 マウス操作がだるいのでショートカットキー Insert を割り当てて使っています。

現在選択しているレイヤーのすぐ上に追加します。


; anobota-add-transparentlayer.scm

(define (script-fu-anobota-add-transparentlayer-ts img drawable)
(let (
       (width  0)
       (height 0)
       (temp   0)
      )
  ; アンドゥしたらここに戻る
  (gimp-image-undo-group-start img)
  
  ; 幅と高さを取得
  (set! width (car  (gimp-image-width img)))
  (set! height (car (gimp-image-height img)))

  ; 新規レイヤー生成
  (set! temp (car (gimp-layer-new img width height 1 "new layer" 100 0 )))
  ; 透明塗りつぶし(?)
  (gimp-drawable-fill temp TRANS-IMAGE-FILL)
  ; 作ったレイヤーを追加
  (gimp-image-add-layer img temp -1)

  ; 表示に反映
  (gimp-displays-flush)

  ; ここまでがアンドゥの対象
  (gimp-image-undo-group-end img)
))

(script-fu-register
  "script-fu-anobota-add-transparentlayer-ts"
  "<Image>/Script-Fu/misc/ts-透明な新規レイヤーを追加" ;このスクリプトのメニュー位置
  "透明な新規レイヤーを追加する(TS)" ; このスクリプトの説明
  "sonota" ; 作者名
  "(c) 2007"    ; コピーライト
  "2007-06-21"  ; 日付
  "RGB*, GRAY*, INDEXED*"  ; スクリプトが動作可能なモード
  SF-IMAGE    "Image"    0 ; 引数1
  SF-DRAWABLE "Drawable" 0 ; 引数2
)

Gimp: 記事のもくじ

Script-Fu: 選択範囲の角を丸めた枠を描く


自分用バックアップを兼ねて適当に転がしておきます。 選択範囲を元にして、上の図のように角がちょっと丸い枠を描きます。 枠の中は単純に消去しているので、透明な新規レイヤーを選択した状態で使います。


; anobota-rounded-frame.scm

(define (script-fu-anobota-rounded-frame img drawable)
  ; 処理の内容

  ; アンドゥしたらここに戻る
  (gimp-image-undo-group-start img)

  ; 選択範囲を縮小
  (gimp-selection-shrink img 5)
  ; 選択範囲を拡大
  (gimp-selection-grow img 6)
  ; 選択範囲の縁どり
  ;(gimp-selection-border img 2)
  ; 描画色で塗りつぶし
  (gimp-edit-fill drawable 0)
  ; 選択範囲を縮小
  (gimp-selection-shrink img 2)
  ; 消去
  (gimp-edit-clear drawable)

  ; 表示に反映
  (gimp-displays-flush)

  ; ここまでがアンドゥの対象
  (gimp-image-undo-group-end img)
)

(script-fu-register
  "script-fu-anobota-rounded-frame"; 関数登録名
  "<Image>/Script-Fu/misc/角を丸めた枠" ; このスクリプトのメニュー位置
  "描画色で角の丸い枠を描く"      ; このスクリプトの説明
  "sonota"     ; 製作者
  "(c) 2008"   ; コピーライト
  "2008-09-08" ; 日付
  "RGB*"  ; スクリプトが動作可能なモード
  SF-IMAGE "Image" 0       ; 引数1
  SF-DRAWABLE "Drawable" 0 ; 引数2
)

Gimp: 記事のもくじ



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。