-->

2015年04月

MacのCotEditorのマクロ作ってみた。
タブ区切りのテキストをHTMLのtableタグに変換する
で、CotEditor用にマクロ作ったんだが、Windowsのサクラエディタのマクロでも作って見た。

サクラエディタのマクロはJScript、VBScript、PPAとか使えるけど、JScriptを使うことにする。
JScriptには、Editorオブジェクトが提供されていて、それのメソッドを呼び出すことで操作する。

作ったマクロは↓だ。

続きを読む
このエントリーをはてなブックマークに追加

メッセージをWebブラウザの外部に表示するAPIだ。

説明する前にTypeScriptを使うので、型定義ファイルを示しとく。

interface NotificationOptions {
	dir?: string;
	lang?: string;
	body?: string;
	tag?: string;
	icon?: string;
}

declare class Notification implements EventTarget {
	static permission: string;
	static requestPermission(callback: (permission: string) => void): void;
	
	onclick: (e: Event) => any;
	onshow: (e: Event) => any;
	onerror: (e: Event) => any;
	onclose: (e: Event) => any;
	
	dir: string;
	lang: string;
	body: string;
	tag: string;
	icon: string;
	
	close(): void;
	
	removeEventListener(type: string, listener: EventListener, useCapture?: boolean): void;
	addEventListener(type: string, listener: EventListener, useCapture?: boolean): void;
	dispatchEvent(evt: Event);
	constructor(title: string, options?: NotificationOptions);
}

このAPI、IEでサポートしてないものだからだと思うが、型定義ファイルが用意されていない。(Visual Studio 2013にて)

また、Web Notifications APIに対応しているかチェックするのに

interface Window {
	Notification: Notification;
}

が必要だ。

Web Notifications APIに対応しているかどうかは、

if (window.Notification) {
	alert("通知に対応してる");
} else {
	alert("通知に対応してない");
}

で判定する。

メッセージを出す場合、ユーザから許可を得ているか、得ていないなら許可を得なければなりません。
許可を得ているかどうかは、Notification.requestPermissionプロパティが、"granted"でないと許可を得てないので許可を得るようにする。

if (Notification.permission !== "granted") {
	Notification.requestPermission((status) => {
		if (Notification.permission !== status) {
			Notification.permission = status;
		}
	});
}

こんな感じ。

そして、メッセージを出すには、

var hoge = new Notification("title", {
	body: "body",
	icon: "icon.png",
	tag: "tag",
})
hoge.onshow = (e) => {
	setTimeout((e) => { hoge.close(); }, 3000);
};

こんな感じ。自動的に消えないのでsetTimeoutで3秒後に閉じるようにしている。


このエントリーをはてなブックマークに追加

別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

前にWPFでマルチタッチを試してみたのと同様のWindowsストアアプリを試しに作ってみた。

Windowsストアアプリを新規作成して、canvasを張り付けてPointerPressed、PointerMoved、PointerReleasedイベントを取るようにする。
これらのイベントでマウス、ペン、タッチのイベントが発生する。
イベントで渡されるPointerRoutedEventArgsのGetCurrentPointで
PointerPointを取得してそのPointerDeviceのPointerDeviceTypeプロパティでマウス、ペン、タッチの区別ができる。
複数タッチを区別するのはPointerPointのPointerIdプロパティで行う。

サンプル:TestMultiTouchWS.zip

続きを読む
このエントリーをはてなブックマークに追加

別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

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

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



このエントリーをはてなブックマークに追加

別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

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。ただし、オーバーフローしないようにしないといけない。


このエントリーをはてなブックマークに追加

↑このページのトップヘ