ソースコードと日記帳

日々の出来事をちょこちょこと。

ETロボコンCS行ってきました

11月16,17日に開催されたETロボコンCSに行ってきました。とりあえず、お疲れ様でした。
横浜から帰ってきて、ずっと記事を書こうと思って、気付けばもう2週間も経ってしまった(;´Д`) 風邪で寝込んだり、休んだ分の授業に追いついたり、進んでいない研究を進めたり。以外に忙しい2週間でした。
結果はと言うと、僕たちのチームが、プライマリ部門全17チーム中11位。まあまあかなって思ってます。学校としては今までに 1回行ったことはあったらしいですが、去年僕がロボコンを始めたときには当時の遺産は殆ど皆無。さらにロボット本体がNXTからEV3に変わったことで、 今までのシステムはブラックボックス化してたこともあって)切り捨て、今回から全く新しいシステムを組んでました。まあ、言い訳です^^;
ということで、来年に向けて、また走り出そうと思います。僕は来年アドバンス部門に出るので、色々と追加で勉強しないといけないなw

JavaでMIDIファイルを再生する

環境

MIDIファイル (SMF) を鳴らしたい

学校の課題でアラームを作った時、その音をどうしてもMIDIで鳴らしたかった。そこで色々調べたので、そのメモ。

色々と情報を探してみたりはしたけど、どうも自分の思うような情報に辿り着けなかったので(自分の情報詮索能力が低いだけ・・・)Javadocとにらめっこした結果、いろいろ見えてきた。
使いそうなクラスは次の3つ!

  • Sequencer : 再生や停止など
  • Sequence : トラックの生成や作成など
  • MidiSystem : MIDIに関する様々な機能を提供

MidiSystemクラスは様々なメソッドがStaticで宣言されているので、インスタンスを作る必要はない。主な手続きは・・・

  • Sequencerを宣言してMidiSystem.getSequencer()シーケンサを取得
  • Sequenceを宣言してMidiSystem.getSequence(ファイル)シーケンサを取得
  • このファイルは、File fileInputStream streamまたはURL urlのどれか
  • 取得したSequenceSequencerにセットする
  • Sequencerをoepn()し、start()で再生。
  • 止めたいタイミングでstop()し、Sequencerstop()する。

サンプル

以下のサンプルコードは、何かキーボードから入力があるまで再生、入力があったら停止するプログラム。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class MidiTest {
    public static void main(String[] args) 
            throws MidiUnavailableException, InvalidMidiDataException, IOException {
        //シーケンサを宣言
        Sequencer myMidi;
        myMidi = MidiSystem.getSequencer();
        //シーケンスを宣言
        Sequence mySequence ;
        mySequence = MidiSystem.getSequence(new File("hoge.mid"));
        //シーケンサにシーケンスをセットする
        myMidi.setSequence(mySequence);
        //シーケンサを開き再生する
        myMidi.open();
        myMidi.start();
        
        //何か入力があるまで再生。
        System.out.println("入力があるまで再生します。");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.read();
        //再生の停止
        System.out.println("入力を検知しました。再生を終了します。");
        myMidi.stop();
        myMidi.close();
    }
}

ETロボコン入門 ~空のアプリケーション~

筆者の開発環境

はじめに

こんにちは。最近アールグレイティーがお気に入りの筆者じょーじです。

 さて、ETロボコンを初めて思うことは、どうやって開発を始めればよいのかという事ではないでしょうか。環境構築でお世話になったTOPPERSのサイトを覗いてみても

3.3. アプリケーションの新規作成

既にワークスペースにあるアプリケーションをテンプレートとして、以下の手順で新しいアプリケーションを作成できます。

ワークスペースのフォルダに移動します

② 「cp -r <テンプレートとしたアプリケーションのフォルダ名> <新しいアプリケーションのフォルダ名>」で新しいアプリケーションを作成できます(gyroboyをテンプレートとした例
$ cp –r gyroboy newapp1

としか書いていません。ようは既存の物をコピーして使えってことなのでしょうが、
workspace内のどのアプリケーションを見ても、何も処理がないシンプルなアプリケーションがない。C++で開発したいけど、どれもapp.cってなってる。じゃあどうすればいいんだ!!って感じで僕は初めの頃はずっと悩んでいました。
 そこで今回はメモ書きを兼ねて空のアプリケーションを用意してみようと思います。

ファイル構成

 まずはじめに、空のアプリケーションのファイル構成を見てみましょう。

ファイル名 説明
app.h メインのヘッダファイル
app.cpp メインのソースファイル
app.cfg タスクやリンクするオブジェクトなどを記述するコンフィグファイル
Makefile.inc 読み込むライブラリやオブジェクトなどを記述するメイクファイル

たったのこれだけです。上の例でもあげたgyroboyと同じ構成です。ではソースコードも見てみましょう。ソースコードGitHubsimple-project.zipという名前でアップロードしてあるので、そちらからダウンロードしてみてください。

app.h

#ifdef __cplusplus
extern "C" {
#endif

#include "ev3api.h"

#define MAIN_PRIORITY    TMIN_APP_TPRI + 1

#ifndef STACK_SIZE
#define STACK_SIZE      4096
#endif /* STACK_SIZE */

#ifndef TOPPERS_MACRO_ONLY

extern void main_task(intptr_t exinf);




#endif /* TOPPERS_MACRO_ONLY */

#ifdef __cplusplus
}
#endif

 これは要となるヘッダファイルです。中にはタスクに使うプライオリティの値の宣言やスタックサイズなどが記述されています。main_task関数はMAIN_TASKというタスクが実行状態になった時に呼ばれる関数になっています。この辺りはまた別の機会が合ったら記事にしたいと思います。

app.cpp

#include "app.h"


void main_task(intptr_t unused) {
    ext_tsk();
}
// end::main_task[]

 こちらはヘッダファイルで宣言した関数の処理を記述するファイルになっています。至って普通ですね。特別なことはしていません。ext_tsk関数はタスクを終了させる関数です。つまり今のままでは何もしないまま終了することになります。実際に動かす時は処理をwhileでループさせたり別タスクで動かしたりすることになります。

app.cfg

INCLUDE("app_common.cfg");

#include "app.h"

DOMAIN(TDOM_APP) {
CRE_TSK( MAIN_TASK, { TA_ACT,  0, main_task,   MAIN_PRIORITY,   STACK_SIZE, NULL } );
}

ATT_MOD("app.o");

 このファイルにはタスクやハンドラの宣言や、オブジェクトの追加などの処理を書きます。詳しいことはタスクに関する記事を書く時にしたいと思います。またクラスなどを追加するために、新しいファイルを作りリンクさせる時は、その時のオブジェクト名をATT_MOD関数に記述します。同時に次に説明するMakefile.incにも記述しなければいけないので、忘れないよう注意してください。

Makefile.inc

APPL_COBJS += \

APPL_CXXOBJS += \


SRCLANG := c++

ifdef CONFIG_EV3RT_APPLICATION

# Include libraries
include $(EV3RT_SDK_LIB_DIR)/libcpp-ev3/Makefile

# C++ Version API Extra
#include $(EV3RT_SDK_LIB_DIR)/libcpp-ev3ext/Makefile

endif

# $./hoge
APPL_DIR += 

# -I$./hoge
INCLUDES += 

 これはいわゆるメイクファイルです。ここにはリンクしたいオブジェクトやライブラリの場所、ソースファイルが格納されているディレクトリなどを記述します。C言語オブジェクトの場合はAPPL_COBJSに、C++オブジェクトの場合はAPPL_CXXOBJSに追記していきます。記述する時はスペースで区切って記述する方法と\で改行する方法の2通りあります。

#Examples
APPL_COBJS += hoge1.o hoge2.o
APPL_CXXOBJS += hoge3.o \ 
                hoge4.o \

おわりに

 いかがだったでしょうか。自力で調べて四苦八苦する後輩を見て、少しは資料を残してあげたいなと思い、勢いだけで書いてきました。少しでも読んでいただいた方の力になれたら嬉しいなと思います。また、このような記事が増えたらいいな、なんて考えています。僕も全国大会に向けたシステムの調整が残っているので、そこで新たなノウハウを発見したら記事にしてみようと思います。

 それでは良いETロボコンライフを。


リンク

TOPPERS EV3RT:EV3RTのホームページです。
Git Hub:今回のソースコードを公開しています。

はじめに

とりあえず最初に自己紹介やら何やらをやろうかと思ったけど、既に1日考えてて先に進みそうにないので、スパッと済ませようと思います。

現在僕は大学で「TEAM八草」というチームに所属してETロボコンに取り組んでいます。この大会は主に組み込み系システムの開発を競う大会です。今回僕の所属するチームが全国大会に出場する事になったので、この機会にブログでも始めてみようと思った次第です。
ETロボコン公式ホームページ

まあぼちぼちロボコンやその他プログラミングとか趣味とかについて書いていこうと思います。