2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
ブログ:ココログ
時間のないサイト運営者リング
時間のないサイト運営者リング

« 2014年8月 | トップページ | 2014年10月 »

2014年9月

2014.09.18

C# そのスレッド本当に必要ですか? - Qiita

リンク: C# そのスレッド本当に必要ですか? - Qiita.

だよねー
不発弾も怖いけど、
発生したら発生したでどこが悪いのかなかなか掴めなかったりするんだよねー

と、言いつつけっこー使ってたりする(^^;)

2014.09.17

[Java8] PSGぽい音を出す。

JavaでPSGぽい音を出すサンプルです。タイトルでJava8って書いてるけど、古いのでもいけると思います。(どのバージョンから出来るのかは確認してない)

package jp.hemohemo.testaudio;
 
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
 
public class TestAudio {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int SAMPLING_RATE = 44100;  // 44.1kHz(CDと同じ)
       
        // オーディオフォーマットを準備
        AudioFormat format = new AudioFormat(
                SAMPLING_RATE,      // サンプリング周波数
                16,                 // 16ビット
                2,                  // ステレオ
                true,               // 符号
                true                // ビッグエンディアン
        );
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
       
        SourceDataLine line;
        try {
            // データラインを取得
            line = (SourceDataLine)AudioSystem.getLine(info);
            // ラインを開く
            line.open();
        } catch (LineUnavailableException ex) {
            Logger.getLogger(TestAudio.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }
 
        // 1秒間の波形データを準備
        int freq = 440;      // ラ(A)の周波数(440Hz)
        int vol = 2000;     // 音量
        byte[] datas = new byte[SAMPLING_RATE * 2 * 2]; // ステレオ、16ビットなので * 2 * 2なる
        int val;
        for(int i = 0; i < SAMPLING_RATE; i++) {
            int tmp = (int)(2 * i * freq / SAMPLING_RATE);
            if(tmp % 2 == 0) {
                val = vol;
            } else {
                val = -vol;
            }
            // 左チャンネル
            datas[i * 2 * 2 + 0] = (byte)((val >> 8) & 0xff);
            datas[i * 2 * 2 + 1] = (byte)(val & 0xff);
            // 右チャンネル
            datas[i * 2 * 2 + 2] = (byte)((val >> 8) & 0xff);
            datas[i * 2 * 2 + 3] = (byte)(val & 0xff);
        }
        line.start();
        // 波形データを書き込む
        line.write(datas, 0, datas.length);
        // 鳴り終わるのを待つ
        line.drain();
        line.stop();
        line.close();           
    }
}

まっ、見ればわかると思いますが、最初のほうでCDと同等の音質でデータラインを取得して、そこに440Hzの矩形波のデータを用意して書き込んでる。このfreqの値を変えると音程が変更でき、volを変更すると音量が変わる。
和音の出し方は別の音程の波形データを加算するだけでOK。ただし、オーバーフローしないようにしないといけない。

2014.09.13

NetBeansで日本語を入力すると落ちる - Така блог

リンク: NetBeansで日本語を入力すると落ちる - Така блог.

JDKを古いのにするのか。

2014.09.11

[WPF] Windowsでマルチタッチ

Windowsでマルチタッチ試してみた。

マルチタッチに対応しているのはOSはWindows7からで対応するアプリを開発するには.NetのWPF4以降か、Win32 APIを使う。Windos8以降だとWindowsストア向けに作れば対応できる。(Windowsストア向けは、まだ調べてない)

WPFアプリのプロジェクトを新規作成してCanvasを貼り付けて、TouchDown、TouchMove、TouchUpイベントを取ればマルチタッチが取れるようになる。これらのイベントはマウスのMouseDown、MouseMove、MouseUpイベントのタッチ版のようなものだ。

複数のタッチ(指)を認識するには、タッチイベントで渡されるTouchEventArgsのTouchDeviceのIdで複数の指を識別する。複数のタッチそれぞれにIDがふられてそれぞれイベントが発生することになる。

サンプルは、タッチしたところに赤丸(かなり大きいが(^^;))とIDが表示されるようになっている。ついでにマウスイベント、スタイラス(デジタイザペン)でも円を描画するようにしてる。マウスは青丸で押してるボタンを表示する。スタイラスは緑丸とIDを表示し、円は筆圧によって大きさが変わるようになっている。
これでわかるのが、タッチするとスタイラス、マウスのイベントが、スタイラスで画面を触るとマウスのイベントが発生する。この辺はそれぞれのEventArgsのhandledプロパティにtrueを設定すると発生しなくなるが、タッチ、スタイラスとも長押しすると右ボタンを押したマウスイベントは発生するようなので都合が悪い場合はなんか別の方法で回避しないといけない。(簡単な方法があるかは調べてないので不明)

サンプル:TestMultiTouchWPF.zip

全体を見ないとわからない部分もあるんだが、サンプルからタッチ関係のイベント部分を抜き取ったものものせとく。

続きを読む "[WPF] Windowsでマルチタッチ" ≫

« 2014年8月 | トップページ | 2014年10月 »


Google

サーチする:
Amazon.co.jp のロゴ









携帯URL