超高音vitasなりきりマイクのプログラム

Kansai.ARで歌ってきました - 無題 @ はてな
これで使っているソースコードを公開するのを忘れていました.
動かしているプラットフォームはDebian GNU/Linux(sid)です.動かすには別途cwiidとsndobjのインストールが必要です.

vitas.cpp

#include <iostream>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>

#include <SndObj/AudioDefs.h>

#include <stdarg.h>
#include <cwiid.h>

#define CWIID_NUM 50
#define VITAS_TIME 3000 

#define toggle_bit(bf,b)	\
		(bf) = ((bf) & b)		\
	       ? ((bf) & ~(b))	\
	       : ((bf) | (b))

int tone = 0;

using namespace std;

void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode);

cwiid_err_t err;
void err(cwiid_wiimote_t *wiimote, const char *s, va_list ap)
{
	if (wiimote) printf("%d:", cwiid_get_id(wiimote));
	else printf("-1:");
	vprintf(s, ap);
	printf("\n");
}

void cwiid()
{
	cwiid_wiimote_t *wiimote;	// wiimote handle
	struct cwiid_state state;	// wiimote state
	bdaddr_t bdaddr;				// bluetooth device address
	unsigned char rpt_mode = 0;
	int cnt = 0;
	int sum = 0;

	cwiid_set_err(err);

	bdaddr = *BDADDR_ANY;

	// Connect to the wiimote
	printf("Put Wiimote in discoverable mode now (press 1+2)...\n");
	if(!(wiimote = cwiid_open(&bdaddr, 0))){
		fprintf(stderr, "Unable to connect to wiimote\n");
		exit(EXIT_FAILURE);
	}

	printf("### vitas ###\n");

	// set ACC rpt mode
	toggle_bit(rpt_mode, CWIID_RPT_ACC);
	set_rpt_mode(wiimote, rpt_mode);

	while(1){
		// get acc state
		if (cwiid_get_state(wiimote, &state)) {
			fprintf(stderr, "Error getting state\n");
		}
		
		sum += state.acc[CWIID_Y];
		cnt++;
		
		if(cnt>=CWIID_NUM){
			sum = sum / CWIID_NUM;
	
			int value = sum - 110;
			if(value<0)
				value = 0;

			tone = value;

			cnt = 0;
			sum = 0;
		}
	}

	if(cwiid_close(wiimote)){
		fprintf(stderr, "Error on wiimote disconnect\n");
		exit(EXIT_FAILURE);
	}

}

void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode)
{
	if(cwiid_set_rpt_mode(wiimote, rpt_mode)){
		fprintf(stderr, "Error setting report mode\n");
	}
}

void vitas()
{
	int dur =VITAS_TIME;
	SndRTIO input(1, SND_INPUT);
	SndIn audio(&input);
	Gain gain(-3.f, &audio);
	//Comb comb(0.9f, 0.008f, &gain);	//robot
	Comb comb(0.5f, 0.1f, &gain);
	Pitch pitch(.1f, &comb, 0);

	SndRTIO output(1, SND_OUTPUT);
	output.SetOutput(1, &gain);
	output.SetOutput(1, &comb);
	output.SetOutput(1, &pitch);

	for(int i=0; i<dur*(44100/DEF_VECSIZE); i++){
		printf("tone = %d\n", tone);
		
		pitch.SetPitch(tone);
		input.Read();
		audio.DoProcess();
		gain.DoProcess();
		comb.DoProcess();
		pitch.DoProcess();
		output.Write();
	}
}

int main()
{
	boost::thread th0(&cwiid);
	boost::thread th1(&vitas);

	th0.join();
	th1.join();

	return 0;
}

Makefile

TARGET = vitas

CC = g++
CFLGS = -g -O2 -fPIC -DALSA
LIBS = -lstdc++ -lm -lsndobj -lasound -lboost_thread -lcwiid

SRCS = $(TARGET).cpp
OBJS = $(SRCS:.cpp=.o)


all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(CFLGS) -o $(TARGET) $(OBJS) $(LIBS)

%.o:%.cpp
	$(CC) $(CFLGS) -c $<

clean:
	rm -rf *.o $(TARGET) *~