ラベル java の投稿を表示しています。 すべての投稿を表示
ラベル java の投稿を表示しています。 すべての投稿を表示

水曜日, 5月 09, 2018

AndroidのVrVideoViewで大きな動画ファイルを再生したい時

展示用にVR動画を再生するアプリを作っていた。Android開発は初めてだったがストア配布しないしサンプルあるし楽勝と考えていたら、はまった。loadVideoFromAsset()は大きなファイルの場合ヒープエラーになる。メモリに全部入れてるのだろうか?

そもそもストア配布するAPKには100MBの制限があるので、大きなファイルを再生することは想定してなさそう。拡張ファイルを使う方法があるみたいだけど、今回はコンピュータから直接動画とアプリを入れられれば良い。という訳でloadVideo()を使う。

Android File Transferで端末のDOWNLOADSフォルダ以下に動画を置き、

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "MOVIEFILENAME.mp4");
Uri fileUri = Uri.fromFile(file);

とする。loadVideoFromAsset()はassets以下に置いたファイル名を指定すれば良かったが、loadVideo()にはファイルのUriオブジェクトを渡す。

日曜日, 9月 21, 2014

Processingでアプリケーションを作る際に知っておくと便利なコード

ホームディレクトリのパスを取得

Processingでアプリケーションとして書き出す際に、リソースを後で差し替えたかったり、dataフォルダ以外に置きたい場合があります。ProcessingというよりはJavaのAPIですが、
System.getProperty("user.home")
でユーザのホームディレクトリの絶対パスが取得できます。例えば、
import java.io.*;
File movieFolder = new File(System.getProperty("user.home") + "/movies");
File[] movieFiles = movieFolder.listFiles(getFileExtensionFilter(".mp4"));

とすると、ホームディレクトリ以下に置いたmoviesフォルダ内にある.mp4ファイルを取得できます。.mp4を他の拡張子に変えれば他の拡張子も取得可能です。

スライドショー機能で使った画像のフェードイン・アウトのサンプルコード

地味にProcessingで画像がフェードイン・アウトする処理を書いたのは初めてでした。tint()を使うとできます。
fadeInOut.pde

これらは現在『六甲ミーツ・アート 芸術散歩』で展示中のNadegata Instant Partyの作品の自動撮影システムに活かされています。撮影された画像は自動でTumblrにアップロードされるのですが、開発の期間が限られていたため、IFTTTのDropbox連携を使いました。
PHOTO SPOT PARTY

土曜日, 8月 14, 2010

ProcessingでGUIを簡単に使う

Algorithm for Visual Designより。
controlP5とかその他色々あるけどちょっと試したい時とかAWT使うのもいいと思う。
サンプルではaddActionListenerのところがこんな感じ
a.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
println("A");
}
}

だったけどActionScriptぽく書き直してみた。
ボタンが押されたときに呼び出されるメソッドは全てactionPerformedになるのでその中で分岐。
[guiTest.pde]
MyControl control;
void setup() {
control = new MyControl();
}

void draw() {
}

[MyControl.pde]
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MyControl implements ActionListener {
Button a;
Button b;

MyControl() {
a = new Button("A");
a.addActionListener(this);
add(a);
b = new Button("B");
b.addActionListener(this);
add(b);
}

public void actionPerformed(ActionEvent e) {
if(e.getSource()==a) {
println("A");
} else if(e.getSource()==b) {
println("B");
}
}
}

土曜日, 8月 09, 2008

Vectors

nature of codeをちゃんとやろうと思った。何となく読んだりコード書き換えてみたりはしてたんだけど、いくつか勉強しておきたい項目を取り上げて書くつもり。まずはVectorsから。実はVector3Dクラスが何をしてるのかとかよく理解してなかった。

motion 101のメインになる部分(hellomotion.pde)とThingクラスの余計なところを削って円の動きだけに注目。Vector3Dクラスを使うにはVector3D.javaをAdd File...でスケッチフォルダに追加するかライブラリを入れてimport noc.*;と書いておく必要がある。

vec3dmotion.pde

Thing t;
void setup() {
t = new Thing(new Vector3D(0.01, 0.01), new Vector3D(0, 0), new Vector3D(0, 0));
}

void draw() {
background(204);
t.go();
}

Thing.pde

class Thing {
Vector3D loc;
Vector3D vel;
Vector3D acc;

Thing(Vector3D a, Vector3D v, Vector3D l) {
this.acc = a.copy();
this.vel = v.copy();
this.loc = l.copy();
}

void go() {
update();
borders();
render();
}

void update() {
vel.add(acc);
loc.add(vel);
}

void borders() {
if(loc.x > width) {
loc.x = 0;
}
if(loc.x < 0) {
loc.x = width;
}
if(loc.y > height) {
loc.y = 0;
}
if(loc.y < 0) {
loc.y = height;
}
}

void render() {
ellipse(loc.x, loc.y, 10, 10);
}
}


位置は点(Points)であり、速度/加速度はベクトル(Vectors)。コーディングをシンプルにするために、これらを全てベクトル(大きさと方向)として扱う。

setup()メソッドの中でThingクラスのインスタンスを作る時に、Vector3Dのインスタンスを生成して値を渡してるんだけど、この時の引数が2つ(new Vector3D(x,y))だと2次元、3つ(new Vector3D(x,y,z))だと3次元になる。実際には2つの場合はzに0が入るというだけなのでVector3Dのインスタンスは常にx,y,zで3次元の値を持ってるんだけど。

Thingクラスのコンストラクタではcopy()メソッドを使って、先ほど生成されたVector3Dクラスのインスタンス変数からThingクラスのインスタンス変数に値をコピーして格納してる。

加速度から速度を導いて、速度から位置を導く、という流れ。

Vector3D使わないとすればこうなる。
normalmotion.pde

Thing t;
void setup() {
t = new Thing(0.01, 0.01, 0, 0, 0, 0);
}

void draw() {
background(204);
t.go();
}

Thing.pde

class Thing {
float x;
float y;
float vx;
float vy;
float ax;
float ay;

Thing(float ax, float ay, float vx, float vy, float x, float y) {
this.ax = ax;
this.ay = ay;
this.vx = vx;
this.vy = vy;
this.x = x;
this.y = y;
}

void go() {
update();
borders();
render();
}

void update() {
vx += ax;
vy += ay;
x += vx;
y += vy;
}

void borders() {
if(x > width) {
x = 0;
}
if(x < 0) {
x = width;
}
if(y > height) {
y = 0;
}
if(y < 0) {
y = height;
}
}

void render() {
ellipse(x, y, 10, 10);
}
}

これはこれでわかりやすい。けど多分後々Vector3Dが効いてくるんだと思う。

ベクトルとかの数学的な概念とか、コード使ったアニメーションで勉強になるのは『ActionScript 3.0 アニメーション』。
スクリプトだけで全部やるからflash持ってなくても動くものが作れる。flex環境のセットアップとかも丁寧に書いてあるしその辺は検索すれば出てくる。値段は高いけど、夏休み(もう大分過ぎてますが)にこれ1冊やると思えばどっか遊びに行くより楽めるし安い。続編も出るらしいし。

processingとActionscript3.0の行き来はそれほど苦ではないと思うので、両方読み書きできるといいと思う。既に使えるソースコードが沢山公開されてる訳だし。

今までは使えそうなコードを集めて勘でプログラミングしてたんだけど、細かい調整できるようにそろそろスクラッチでも色々ちゃんと書けるようになりたい。DJからトラックメイカーへ。

自前のblog環境整えないとな、と思う。かゆいところに手が届かないストレスで投稿が減ってるってのもあるから、何とかしたい。

土曜日, 9月 01, 2007

a digital remake

» A Digital Remake

装飾イニシャル文字をプログラムで生成。洒落た論文だな。
これぐらいやってみたい。

で、装飾に使われてるのがCornuってライブラリ。それっぽいのが簡単に作れそう。
NodeBoxのライブラリの使い方は

~/Library/Application Support/NodeBox/

にフォルダごと入れてしまえばいい。もしくはスケッチと同じ階層。

Core Imageライブラリとか使ったら結構簡単に面白おかしいことができるんじゃないだろうか?
今何となくjavaでフィルタとかやってる(完全に趣味)んだけど、こっちにしようかな。python覚えたいし。
Java Image Processing - Blurring for Beginners

cornuをほんの少し触ってみた。リストを入れ子にして位置指定すれば簡単。
あとは一発でjpgなりgifに書き出せたらなー。

cornu = ximport("cornu")

size(400, 400)

path = [[(0.1,0.1),(0.15,0.3),(0.4,0.2),(0.6,0.6),(0.4,0.4),(0.5,0.4)],
[(0.1,0.1),(0.15,0.25),(0.4,0.2),(0.8,0.6),(0.35,0.2),(0.5,0.4)],
[(0.1,0.1),(0.15,0.35),(0.4,0.2),(0.8,0.6),(0.2,0.4),(0.5,0.4)]]
nofill()
stroke(0)
for i in range(0, 3):
cornu.drawpath(path[i], tweaks=20, points=False)

土曜日, 6月 16, 2007

program switcher

processingで例えばvjする時とか、どうやって切り換えするかなって疑問は前からあって、やっとその答えが出た。
abstractmachine >> Polymorphism
abstractmachine >> abstract classes

ポリモーフィズムね、抽象クラスね。やったやった。でも使い方全然わかってなかった。本当こういうテクニックって、できる人にとっては言うまでもないことで、僕くらいの知識だと思いつかないからなかなか共有されないんだよね。ここで駄目なやり方として紹介されてるswitch文で書いてた。

Polymorphismのはdouglasのページのをそのまま実行すればいいとして、abstract classesでのやつをやってみた。これでいいのかな。確かに変数のことで悩まなくて済むしコードも綺麗だ。Head First Javaで勉強し直そう...。


abstract class Animation {
void setup() {
background(255);
}

abstract void draw();
}

class Opening extends Animation {
int i=0;
void draw() {
background(255);
if(i>width) {
i=0;
}
line(i, 0, i, height);
i++;
}
}

class Middle extends Animation {
int i=0;
void draw() {
background(255);
if(i>height) {
i=0;
}
line(0, i, width, i);
i++;
}
}

class Ending extends Animation {
void draw() {
background(random(255));
}
}

Animation myAnimation;
void setup() {
myAnimation = new Opening();
}

void draw() {
myAnimation.draw();
}

void keyPressed() {
switch(key) {
case 'a':
myAnimation = new Opening();
break;
case 'b':
myAnimation = new Middle();
break;
case 'c':
myAnimation = new Ending();
break;
}
}

月曜日, 4月 16, 2007

20070415

性懲りもなくjavaで音作ろうと思って、この辺のexample見てたんだけどもよくわかんない。Oscillator.javaとか参考にjpeg作り直そうかなーと思ってたけど、しんどい。webで鳴るのは魅力的だな。p5+essとかminimで十分な気もするけど。。。

良さげなライブラリ。
jass

自分の言語を作ろうと思うんだけど、どうするのがいいんだろう。環境的に熱そうなのは、openframeworksとか、cocoacolliderとか、なのかな。ipodとか、モバイルゲームで動くとか。
wifiがいけたらな。
gp2x

scriptographerとかlilyみたいによく使われてるアプリのプラグインでもいいなと思う。

リアルタイムのフィールドレコーディング+エフェクトはやっぱ面白い。
ambient addition

esoteric programming languageか。色でプログラミング。
piet

今後のことを考えてもやっぱmax/mspとかprocessingでラピッドプロトタイピングしてからもっとローレベルまでいける言語で実装、てのがいいんだろうな。まだまだmax/mspで作られたパッチでも面白いものってそんなにないと思うし。

最近またよく思うのは細密なデッサンが普通の100円くらいの鉛筆で描けるすごさ、とか家庭用DVでびっくりするくらい綺麗な映像、とか「何でmaxとかsc使ってそんな音作るんだよ」というのとか。「illustrator使ってこのテイストはないだろ」とか。道具と成果物。多分こういう感想は、先行して作られたものを知ってて、その文脈で見てるから。maxもscもサンプルはかっこ良くない。多分チュートリアルだけとか見てたら使う気しなかっただろう。「こういう音楽はmax/mspで作ってるらしいよ」ってのがファーストインパクトだった訳で。htmlのtableで作られた画像はやっぱ、何かある気がする。結局は作者の目の良さ、とか耳の良さにかかってる。

あと、これ

木曜日, 3月 29, 2007

max and applescript



赤松先生の記事を読んでもしやと思ってやってみた、mxjでapplescript。前にiTunesを制御してたので、unixからapplescriptを呼び出すosascriptが動くことはわかってた。単純にStringを引数にしたメソッドを作って、Processに渡してるだけ。スクリプトとかプログラムを日常的に使う感覚がようやくわかったきた。書き捨てってやつ。ちょっとした頭の体操。メソッドの名前とか迷うな...。max側で使う際に良さげな感じにしました。MaxとAppleSCriptでmasc。興味ある方はmxj quickieとかでコンパイルして試してみてください。

[source code]

金曜日, 12月 22, 2006

mtunes and ptunes

max/mspからiTunesをコントロールするためのエクスターナルと、processingで作ったiTunesのコントローラー作りました。
download mtunes
download ptunes(controlP5が必要です)

javaで書いてるのにどっちもosxのみなのが残念ですが(applescript呼び出してるしね)。しかも"再生/一時停止"と"一曲飛ばす/戻る"しかない。もともとはJAVA SWING HACKSっていう本読んでてjavaからitunes制御するプログラムを見たからなんだけど、今後再生トラック名取得だとか、そういう機能を追加してけばそれなりに面白くなるかも。なるかしら。iTunes使ってdjするとして、曲名とかをjitterに渡すとか再生回数を反映したグラフィックをprocessingで作るとか何とか。。。それなりに使いやすいインターフェースになりそうな気もする。ブラウザから動かせれば(特に理由はないけど)いいのになー。要調査。2月の展示に何かしら使えれば最高。

aka.wiiremoteのmxj版はできるのか。。。
先日このオブジェクト使ってwiiリモコンで落語やりました。

金曜日, 12月 01, 2006

whichin



javaの勉強もだいぶ落ち着いてきたところで、maxのエクスターナルオブジェクトを作ってみました。
mxj whichin 数字
で数字の数だけインレットを作り、どのインレットからbangを受け取ったかを出力します(第1インレットが0になります)。tutorial読めば一瞬でできるものですが、何となく使いどころはありそうです。maxオブジェクトもeclipseで開発すれば非常に楽。max.jarファイルを追加して、ワークスペースをCycling '74/java/classes/にしておけば、あとはコードを書いて保存するだけでclassファイルができます。すぐ試せて便利。mspオブジェクトも作ろう!

download whichin

水曜日, 11月 22, 2006

processing beta with eclipse

eclipseでprocessingを使ってみた。何となくXcodeより体にフィットするので最近始めたC/C++もeclipse使うことにした。フォーラムの内容に沿いつつ自分の環境(Mac OS10.4.8, Eclipse 3.1.2, Processing 0121 Beta)でテスト。

Packege ExplorerでNew ProjectしてProject nameを適当にHelloP5とかつけてNext>。LibrariesタブをクリックしてAdd External JARs...クリック。Processing 0121フォルダにlibってフォルダがあって、その中のcore.jarを選択してfinish。New source foulderで名前をsrcにしとく。

New Classでクラス作って、import processing.core.*;と打ち込む。
processing. まで打ったらprocessing.core.*;ってのをサジェストしてくれる。多分当たり前なんだろうけど、こういう経験が浅い僕はちょっと感動。
public class HelloP5{
}
ってコードが既に作られてるはずなんで、そいつにextends PAppletと加える。あとはHelloP5クラス内に普段processingで書くみたいにsetup()メソッド、draw()メソッドを追加してRunメニューからRun As > Java Appletで動くはず。

コードアシストなどデバッグのこと考えるとすげーいいと思う。eclipseを使いこなす練習にもなるのかも。(ちなみに以下のコードではserialVersionUIDが宣言されてないとかそんな警告が出ます。)

import processing.core.*;

public class HelloP5 extends PApplet {
int i=0;

public void setup() {
size(200, 200);
stroke(255);
frameRate(30);
}

public void draw() {
background(51);
i++;
if(i > height) {
i = 0;
}

line(0, i, width, i);
}
}

日曜日, 10月 29, 2006

jpeg

Java code for Pure Electronica Generator
プログラミングの勉強も兼ねてjavaで音響合成。
コードを適当なエディタに書き込んで、Jpeg.javaという名前で保存。

javac Jpeg.java

でコンパイルして、

java Jpeg 周波数 長さ 波形

で音が鳴ります。明らかにおかしい音だけど。波形はsine, saw, triangle, square。例えば440Hzのサイン波を1秒鳴らす場合、

java Jpeg 440 1000 sine

とします。明らかにおかしい音だけど。
今はメソッドで波形を変えてるけど、ここの呼び出し方がもっと綺麗にならないかな。for文の中でif文てどうなんだろう。実用的なものを作りたい訳ではないし、途中で波形を変えられたりしておかしなことにできる可能性もあるからとりあえずはいいかな。とはいえ適当すぎると音鳴らないから勉強するとこはしないと。

波形クラスを作って、ポリモーフィズムとか使えばスマートにいけそうな気がする。時間かけてじっくりやっていこうと思います。

import javax.sound.sampled.*;

public class Jpeg {
public void sound(int freq, int msecs, String waveForm)
throws LineUnavailableException {
byte[] buf = new byte[1];
String wave = waveForm;
System.out.println(wave + ": " +
freq + "hz " + msecs + "msecs");

AudioFormat af = new AudioFormat(8000, 8, 1, true, false);
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);

sdl.open(af);
sdl.start();

for (int i=0; i<8*msecs; i++) {
double angle = i / (8000.0 / freq) * 2.0 * Math.PI;

if(wave.equals("sine")) {
buf[0] = (byte)(sineWave(angle) * 110d);
} else if(wave.equals("square")) {
buf[0] = (byte)(squareWave(angle) * 110d);
} else if(wave.equals("triangle")) {
buf[0] = (byte)(triangleWave(angle) * 110d);
} else {
buf[0] = (byte)(sawWave(angle) * 110d);
}

sdl.write(buf,0,1);
}

sdl.drain();
sdl.stop();
sdl.close();

System.exit(0);
}

public double sineWave(double angle) {
return Math.sin(angle);
}

public double squareWave(double angle) {
double ratio = angle % Math.PI / Math.PI;
if (ratio <= 0.5)
return 1.0;
return -1.0;
}

public double triangleWave(double rad) {
double ratio = rad % Math.PI / Math.PI;
if (ratio < 0.25)
return ratio*4;
if (ratio >= 0.25 && ratio < 0.5)
return 1.0-(ratio-0.25)*4;
if (ratio >= 0.5 && ratio < 0.75)
return -(ratio-0.5)*4;
return -1.0+(ratio-0.75)*4;
}

public double sawWave(double angle){
return 1.0 - 2 * (angle % Math.PI / Math.PI);
}

public static void main(String[] args) {
int freq = Integer.parseInt(args[0]);
int dur = Integer.parseInt(args[1]);
String waveForm = args[2];

Jpeg generate = new Jpeg();
try {
generate.sound(freq, dur, waveForm);
} catch (LineUnavailableException lue) {
System.out.println(lue);
}
}
}