月曜日, 10月 17, 2016

Karplus–Strongアルゴリズム

Karplus–Strongアルゴリズムというのがあります。ランダムなデータを減衰させながら一定の間隔でフィードバックしてやると音階となり、弦をはじいたような音がする、というものです。

ほんとかよ、というノリで音を合成してみました。これが案外きれいな音が出る。ハープシコードのような音が出ます。

ハープシコードの曲を聴きながらどんな旋律を弾かせようか考えたのですが、ここは純粋かつ簡素なかの曲を弾かせてみました。

この曲がいつまでも平和のシンボルであってほしいですね。

終わらないイラク戦争でミサイルで総攻撃をかけ、殺戮と破壊の「イラク軍」(+同盟軍)へ喝采を送る市民とかいうどこかの病んだ軍事大国はよくないと思います。

戦争でないと解決しないような不安定ないどうしようもない状態で、殺戮と破壊で即片が付くかといえばそんなことはありえないわけですが、後先考えない。目的が選挙であれば勝てればいいわけですね。イラクがどうなろうとそもそもイラクのためなのか議論さえなされない。

イラク戦争を終わらせるというのはそのものがスローガンだったのですが、戦争というのは始まると終わらない、わけですね。

// Audio.java -- a Karplus–Strong string synthesis implentation
// Copyright (c) 2016 easai
// Author: easai
// Created: Mon Oct 17 22:26:16 2016
// Keywords:
// Commentary:
// A random sequence is played at certain frequencies generates harpsichord-like sounds.
//
// Code:
import javax.sound.sampled.*;
import java.lang.Math;
public class Audio {
static final int freq=44100;// sampling rate
byte[] org=new byte[freq];
byte[] data=new byte[freq];
// play a note (picth = scale, length = len)
void note(SourceDataLine audio, int scale,double len)
{
double alpha=1.0;
for(int n=0;n<scale*len;n++)
{
for(int i=0;i<freq;i++){
data[i]=(byte)(org[i]*alpha);
}
audio.write(data, 0, (int)(freq/scale));
alpha*=.99;
}
}
public Audio(){
try{
AudioFormat fmt=new AudioFormat(freq, 8, 1, true, false);
SourceDataLine audio=(SourceDataLine)AudioSystem.getSourceDataLine(fmt);
audio.open(fmt);
audio.start();
// set random
for(int i=0;i<freq;i++){
org[i]=(byte)(Math.random()*256-128);
}
double scale[]={261.6, 293.7, 329.6, 349.2, 392.0, 440, 493.9, 523.3, 587.3, 659.3,698.5,784};
int index[]={1,0,1,2,4,2,1
,2,4,5,4,5,8,6,5,4
,2,4,5,8,7,8
,2,4,5,4,2,4,1
,5,7,8,7,8,5,4,5,4,2,1};
double len[]={1,1,1,1,1,1,2
,1,1,1,.5,.5,1,1,1,1
,1,1,2,1,1,2
,1,1,1,1,1.5,.5,2
,1,1,2,1,1,1,1,1,.5,.5,2};
for(int i=0;i<index.length;i++)
note(audio, (int)(scale[index[i]]),len[i]);
}catch(Exception e){
e.printStackTrace();
System.exit(1);
}
}
public static void main(String[] args){
new Audio();
}
}
// Audio.java ends here
view raw Audio.java hosted with ❤ by GitHub

土曜日, 10月 15, 2016

Arduino: 温度・湿度データロガー

ロボットを作るっていうのはエンジニアとしてはかなり究極な夢だと思います。

人間の能力を超えていてもいいんですが、発想というのはどうしても考える人間を基準としてしまうんですよね。

人らしさを備えたロボットっていうのは理想っぽいんではないかと思います。

あまり人間らしいと気味悪がられるわけですが、ちゃんとした研究があって、適度な人らしさというのがいいんだそうです。

でもここはロボットを作る(日本の)技術は人助けだといいたいですよね。

最新科学技術の粋であるところのロボットで人間らしさを取り戻す。

ここのところ米メディアで騒がれているロボットアームの技術というのがあります。

 まひした手にロボットアームで触覚を取り戻す! 米国防総省の研究機関が実験に成功

精巧なロボットアームと脳をつなぎ、失った腕の感覚を取り戻すという画期的な技術なわけですが、いいですね。

こういう研究があって、しかも政府とメディアが取り上げてくれる。エンジニアとしてはありがたい存在だと思います。



夢を大きく持ったところで、しまってあった Arduino を取り出して、温度・湿度データロガーを作ってみました。

... ちょっと格差が大きいですね。でもちゃんと出来たのでアップします。

/*
DHT11 temperature datalogger
[SD Card Module]
MOSI - pin 11
MISO - pin 12
SCL -- pin 13
CS --- pin 4
3.3 V
GND
[DHT11]
Data -- pin 5
Vcc
GND
*/
#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#define CHIPSELECT 4
#define DHTPIN 5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
unsigned long prev;
unsigned long start;
void setup() {
start = millis();
prev = start;
if (!SD.begin(CHIPSELECT)) {
return;
}
dht.begin();
}
void loop() {
unsigned long now = millis();
if (1000L * 30 < now - prev)
{
prev = now;
String dataString = "";
float h = dht.readHumidity();
dataString += String(h) + " %";
dataString += ", ";
float t = dht.readTemperature();
dataString += String(t) + " C";
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
}
}
view raw DHT11Logger.ino hosted with ❤ by GitHub

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...