fc2ブログ

773mbar

2023年08月 ≪  123456789101112131415161718192021222324252627282930 ≫ 2023年10月

GarageBandからmidiファイルに書き出す

備忘録
MacのGarageBandで編集したデータをmidiファイルに書き出す方法。
ネット上では「できない」「Logicで」「MidiOプラグインを入れて(これは外部機器にmidiで出力するためのプラグインであってmidiファイルに書き出すものではない)」といったものがほとんど。
面倒、制限付き(1トラックのみ)ではあるが、Loopとして書き出し、そこからmidiファイル部分を取り出すことでなんとか実現できる。
以下、GarageBand 6.0.5で確認済み。

1. GarageBandで曲データを編集(ソフトウエア音源で)。
2. ファイルとして出力したい部分のループをすべて選択し、結合してひとつのループにする。
3. そのループを「ループライブラリに追加...」で書き出す。これで ~/Library/Audio/Apple Loops/User Loops/SingleFiles/ 以下に .aif ファイルとして保存される。
(GarageBandの過去バージョンでは、ここで既に .mid ファイルとしても保存されていたらしい)
4. .aif ファイルは、様々なフォーマットがパッケージングされたファイルなので、その中からmidiフォーマットのチャンクを取り出せばよい。
そのためのスクリプトがhttp://www.larskobbe.de/midi-export-in-apples-garageband/に公開されている(GB2MIDI)。このページはドイツ語だけど、スクリプトは .aif ファイルを選択(またはドラッグ&ドロップ)するだけなので難しい事は無い。
これで .mid のファイルが作成される。

スクリプトはパッケージの中を見てみればわかるが、実際の処理はperlで書かれている。
要となっているのは、
$pos = rindex($data, "MThd\x00\x00\x00\x06\x00\x00\x00\x01\x01\xE0MTrk");
これでmidiチャンクの先頭を調べて(あと終了点として次のチャンクの先頭も調べて)、
$midi_data = substr($data, $pos, $end-$pos);
これで取り出している。

スポンサーサイト



未分類 | Comments(0) | Trackbacks(-)

Edison + LED Matrixのテスト

現時点(2014/12/11)では一般発売されていないものの、MakerFairTokyoにて入手できたスイッチサイエンスの8×8 LED Matrixのテスト。サンプルのページ(すみません、その後ページが見つからない)を参考に作ってみた。
このLEDマトリクス、Groveコネクタ経由で直接スイッチサイエンス版Eagletに接続することができるので、場合によってはArduino互換基板と各種シールドを使うよりも手軽にEdisonを使って何か表現することができる。とても便利だ。

I2Cで接続なのでMRAAを使用すれば簡単に制御できるが、8×8のLEDが表示されているように見せるためにはソフト上で8個ずつダイナミック点灯するようコマンドを送り続けなければならない。
普通のArduinoであればタイマー割り込みを使って表示すると便利だと思うが、EdisonはLinuxベースなので、表示専用のスレッドを使って表示させてみた。タイミングに微妙な時間のばらつきが生じるためか、若干輝度の変動があるが、実用上は問題ないだろう。


#include <stdio.h>
#include "mraa.hpp"
#define LOWBYTE(v)   ((unsigned char) (v))
#define HIGHBYTE(v)  ((unsigned char) (((unsigned int) (v)) >> 8))

void initLed();
void *showLed(void *arg);

unsigned char led[8][8];
mraa::I2c* i2c;
pthread_t thread_showLed;
 
int main() {
    int i,j;
    i2c = new mraa::I2c(6);
    i2c->address(0x50);
 
    initLed();
    pthread_create(&thread_showLed, NULL, showLed, NULL);
    while(1) {
        for(i=0; i<8; i++) {
            for(j=0; j<8; j++) {
int n;
for(n=0; n<256; n+=1) {
          led[i][j] = n;
          usleep(1000);
       }
for(n=255; n>=0; n-=1) {
          led[i][j] = n;
          usleep(1000);
       }
       led[i][j] = 0;
            }
        }
    }
}

void initLed() {
    int i,j;
    char init[] = {0x80, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
                                     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
                                     0xFF, 0x00};
    i2c->write(init, 21);
    for(i=0; i<8; i++) {
        for(j=0; j<8; j++) {
       led[i][j] = 0;
        }
    }
}

void *showLed(void *arg) {
    int i,j;
    unsigned int row,column;
    char buff[9];
    while(1) {
        for(i=0; i<8; i++) {
            // write PWM duty
            buff[0] = 0x8a; // register address
            for(j=0; j<8; j++) {
                buff[8-j] = led[i][j];
            }
            i2c->write(buff,9);
            // write on/off
            buff[0] = 0x94; // register address
            row = 0x0002 << (i * 2);
       buff[2] = HIGHBYTE(row);
       buff[1] = LOWBYTE(row);
       column = 0;
       for(j=0; j<8; j++) {
           if(led[i][j]) {
           column |= (0x8000 >> (j * 2));
       }
            }
   buff[4] = HIGHBYTE(column);
   buff[3] = LOWBYTE(column);
   i2c->write(buff,5);
   usleep(1000);
        }
    }
}

 
void *showLed() が、led[8][8]という配列の情報を実際のLEDマトリクスに表示するためのスレッド。この配列に輝度のデータ(0〜255)を書き込むことで表示されるようにしている。メインルーチンでは、まずLEDマトリクスを初期化したのち、表示用スレッドを起動し、あとはled[8][8]の配列に順番にデータを書き込んでいる。

コンパイル時には、MRAAとともにpthreadをリンクする必要がある。具体的には以下のコマンド(ソースはledtest.cppというファイル名とする)

g++ ledtest.cpp -lmraa -lpthread

あとは普通に ./a.out で、順番にLEDが点灯する。




Intel Edison | Comments(0) | Trackbacks(-)

Edison

Edisonを購入した。

Galileoは、その後Gen2もリリースされたが、それまではなんかいまひとつインテルの「やる気」が感じられなかった(主観です)。
Edisonが発表された時は特に買ってみようとは思わなかったのだが、発表当初のSDカードサイズから形が変わって発売され、そしてその後にEagletが発表されてから「これは面白そうだ」と思った。 Galileoはその形でGalileoだ。しかしEdisonは、とにかく小さく作り、それを取り付ける基板によって性格が変わってく。Arduinoに慣れた人、シールドを使いたい人のための互換ボード、Edisonをガチで使いたいという人のためのBreakout Boardという2種類の基板をスタートとして、EdisonのコネクタでスタックできるSparkFunの各種基板、そしてMakerFair Tokyo2014でスイッチサイエンスが発売したMFT版Eaglet。…その後もいろいろ出てくるかもしれない。
このEagletに興味を持ち、MakerFairの前日に秋月でEdisonを購入(せっかくなのでArduino互換を買った)、そしてMakerFairで運良くEagletを購入でき、その時にどうせなら…と、Edison単体を購入…しようと思って、いやいやどうせなら…と思ってBreakout Board付きを購入してしまった。

ってことで今、手元には2個のEdisonがある。 いざ使ってみると、今度はインテルの「やる気」が感じられる。 Galileoの時は乏しかった開発関係の情報もいろいろあり、c++コンパイラも最初から入ってるのでターミナルでログインしてvi等でソース書いてコンパイルも可能、さらにEclipseの開発環境も用意されている。Galileoに比較して開発関係のハードルは格段に低くなった。
あとは、これを乗せられる基板やシステムが、どのようなものが出てくるか楽しみだ。それ次第で応用もとても広くなると思う。

たぶん出てくるだろうものが、Raspberry Piと同じ大きさ、同じインターフェースコネクタを持った基板(笑)
Intel Edison | Comments(0) | Trackbacks(-)

LPC800-MAXのデバッグでException

LPC800-MAXを購入した。
LPC812を搭載、LPCXpressoでプログラミング、デバッグができ、さらにmbedにも対応。

ところが、OS X Marvericks上でのLPCXpressoでデバッグしようとすると、OS X起動後の最初だけ正常に動作するものの、一度デバッグを終了してもう一度デバッグしようとするとExceptionが発生してLPC800-MAXに接続できない。

Exception_LPCXpresso


さすがにその都度OS Xを再起動するのは効率が悪すぎる。
検索しても似たような症状に対する情報は無い。別の機器でも同様に発生するし、再インストール等でも改善しない。

いろいろ確認したところ、原因は不明だが、どうやら redlinkserv というプロセスの後処理に問題があるのではないかと思う。一度デバッグを起動し、デバッガとしてCMSIS-DAPを選択するとこのプロセスが起動する。デバッグを終了してもこのプロセスは残ったまま。そして次のデバッグ起動時にExceptionが発生する。
そしてこのプロセスをkillすると、その直後のデバッグは問題なく起動する。

ということで、とりあえずデバッグ直前にこのプロセスを強制的に終了させるという方法で対処できることがわかった。
対策とは言えないような対策だが、OS Xを再起動するよりマシだ。

具体的にはターミナルから
pkill -9 “redlinkserv”
を入力すればいい。

LPC800-MAXをMACで使っている人って少ないのかなぁ…。
LPCXpresso | Comments(0) | Trackbacks(-)

Raspberry PiでのGPIOのプルアップ/プルダウン

Raspberry PiのGPIOにはPull-Up/Downの機能がある。
しかし、なぜかネット上にはそれを説明する情報よりも抵抗を外付けする情報のほうが多いようだ。
ってことで、PythonでPull-Up / Pull-Down を設定する方法のメモ

>>> import RPi.GPIO as GPIO
>>> GPIO.setmode(GPIO.BCM)
>>> GPIO.setup(23,GPIO.IN,pull_up_down=GPIO.PUD_UP) # GPIO No.23をプルアップする場合
>>> GPIO.setup(23,GPIO.IN,pull_up_down=GPIO.PUD_DOWN) # 同 プルダウンする場合

これで、わざわざ抵抗を外付けする必用は無くなる。
Raspberry Pi | Comments(0) | Trackbacks(-)