신기하다고 해야겠지만..
파형을 뒤집는다고 해서 소리가 달라지지 않는다라는 신기한 사실이 발견되었다.

당연히 뒤집으면 값이 달라지니, 주파수 쪽에서도 변동이 생길 것이고,
그러다 보면 당연히 일반적인 사람의 목소리가 아니거나 다른 소리로 변한걸이라고 생각했는데
그대로 나오는 현상이 있었다.

완전히 같은 위치는 아니지만
"in.wav"에서는 2채널에서는 파형이 나오는데 반해

"outout.wav"에서는 파형이 전혀 나오지 않음에도 불구하고 소리는 나온다.

왼쪽 파형을 뒤집어서 오른쪽에 덮어 씌운 결과물이 "output.wav"인데
왜 소리가 나오는지도 애매하다..

void main()
{
	short s16temp;
	FILE *fp;
	FILE *output;
	char filename[] = "in.wav";
	RIFF_HEADER riff;
	FMT_CHUNK fmt;
	DATA_CHUNK data;
	char *wave = NULL;
	unsigned int idx, maxloop;
	unsigned int ch_idx, ch_maxloop;

	fp = fopen(filename, "rb");
	output = fopen("output.wav","wb");
	fread(&riff, 1, sizeof(RIFF_HEADER), fp);
	fwrite(&riff, 1, sizeof(RIFF_HEADER), output);
		printf("riff.file_length[%d] bytes\n",riff.file_length);

	fread(&fmt, 1, sizeof(FMT_CHUNK), fp);
	fwrite(&fmt, 1, sizeof(FMT_CHUNK), output);
		printf("fmt.fmt_length[%d] bytes\n",fmt.fmt_length);
			printf("fmt.format[%d]\n",fmt.format);
			printf("fmt.channels[%d] channels\n",fmt.channels);
			printf("fmt.khz[%d] kHz\n",fmt.khz);
			printf("fmt.bps[%d] Bps\n",fmt.bps);
			printf("fmt.blockalign[%d] bytes/block\n",fmt.blockalign);
			printf("fmt.depth[%d] bits/sample\n",fmt.depth);

	fread(&data, 1, sizeof(DATA_CHUNK) - 4, fp);
	fwrite(&data, 1, sizeof(DATA_CHUNK) - 4, output);
		printf("data.data_length[%d]\n",data.data_length);
		printf("playtime %02d:%02d\n",
			data.data_length/fmt.bps/60,
			data.data_length/fmt.bps);
		printf("samples %02d\n",
			data.data_length/fmt.blockalign);

		wave = malloc(data.data_length);
		fread(wave, 1, data.data_length, fp);
	
		maxloop = data.data_length / 2;
		ch_maxloop = fmt.channels;
#if 1
		for(idx=0; idx < maxloop; idx+=fmt.channels)
		{
			memcpy(&s16temp, (short*)wave + idx + 1, fmt.depth / 8);
			fwrite(&s16temp, 1, fmt.depth / 8, output);

			if(s16temp == -65536)
			{
				s16temp = -65535;
			}
			s16temp = -s16temp;
			fwrite(&s16temp, 1, fmt.depth / 8, output);
		}
#endif
		free(wave);
	fclose(fp);
	fclose(output);
}

'모종의 음모 > noise cancelling' 카테고리의 다른 글

wave multi channel order  (0) 2010.05.01
WAVE format  (0) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
Posted by 구차니
WAVE 파일은 RIFF / FMT / DATA chunk로 구성된다.
chunk는 데이터 덩어리 혹은 패킷이라고 생각하면 될 듯 하다.

아무튼 각 chunk에는 식별을 위한 MAGIC WORD가 있으나, 몇개의 파일만 확인해서
저 순서가 아닌 다른 순서로도 있는지는 확인하지 못하였다.
그냥 순서대로 읽어오면 된다.

typedef struct _RIFF_HEADER_
{
	unsigned char magic_RIFF[4];
	unsigned int file_length;
	unsigned char magic_WAVE[4];
} RIFF_HEADER;

typedef struct _FMT_CHUNK_
{
	unsigned char magic_FMT[4];
	unsigned int fmt_length;
	unsigned short format;
	unsigned short channels;
	unsigned int khz;	// sample rate
	unsigned int bps;	// bytes per second
	unsigned short blockalign;
	unsigned short depth;	// bits per sample
} FMT_CHUNK;

typedef struct _DATA_CHUNK_
{
	unsigned char magic_DATA[4];
	unsigned int data_length;
	unsigned char *data;
} DATA_CHUNK;

'모종의 음모 > noise cancelling' 카테고리의 다른 글

wave multi channel order  (0) 2010.05.01
파형 뒤집어 플레이 하기  (6) 2009.08.12
Active Noise Control - ANC  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
Posted by 구차니
능동 소음 제어는, 들어오는 소리의 반대파형을 출력함으로
소음을 사라지게 하는 기술이다.


[링크 : http://www.themotorreport.com.au/5928/toyota-to-fit-active-noise-cancelling-to-crown-hybrid/]

[링크 : http://en.wikipedia.org/wiki/Active_noise_control]

'모종의 음모 > noise cancelling' 카테고리의 다른 글

파형 뒤집어 플레이 하기  (6) 2009.08.12
WAVE format  (0) 2009.08.12
WAVEFORMATEX structure  (0) 2009.04.01
음속  (0) 2009.03.30
waveInOpen() waveOutOpen()  (0) 2009.03.26
Posted by 구차니
적절한 제목이 안떠오르는데..
아무튼, 특정 이미지를 특정 사이즈의 사각형(Rectangle) 에 맞도록 출력해주는 일이 있는데
예를들면 탐색끼의 미리보기처럼, 100x100사이즈의 미리보기에 어떠한 크기의 이미지가 오더라도
벗어나지 않도록 적절한 크기의 이미지를 출력해주는 함수가 필요했다.

한달정도 깔끔한 알고리즘을 고심하다가 GG치고 다른 방법으로 구현했었는데
약간의 오작동을 보여서, 또 다시 고민을 하다가 어제 퇴근길 지하철에서 !! 했다.


#define min(a,b)    (((a) < (b)) ? (a) : (b))
#define max(a,b)    (((a) < (b)) ? (b) : (a))
#define FALSE               0 
#define TRUE                1 

#define CALC_MULTIPLIER	1000

typedef struct tagRECT {
	int		x1, y1, x2, y2;
} RECT;

RECT getRectsize(RECT dispRect, RECT imgRect)
{
	RECT ret;
	unsigned int Rx, Ry;
	unsigned char bhorAxis = FALSE;
	unsigned char bscale = FALSE;
	
	Rx = imgRect.x2 * CALC_MULTIPLIER / dispRect.x2;
	Ry = imgRect.y2 * CALC_MULTIPLIER / dispRect.y2;
	if(min(Rx,Ry) > CALC_MULTIPLIER)
	{
		if(Rx > Ry)
			bhorAxis = TRUE;
		else	bhorAxis = FALSE;
		bscale = TRUE;
	}
	else if(max(Rx,Ry) > CALC_MULTIPLIER)
	{
		if(Rx > Ry)
			bhorAxis = TRUE;
		else	bhorAxis = FALSE;
		bscale = TRUE;
	}

	if(bscale == TRUE)
	{
		if(bhorAxis == TRUE)
		{
			ret.x2 = dispRect.x2;
			ret.y2 = imgRect.y2 * dispRect.x2 / imgRect.x2;
			ret.x1 = dispRect.x1;
			ret.y1 = dispRect.y1 + (dispRect.y2 - ret.y2) / 2;
		}
		else
		{
			ret.y2 = dispRect.y2;
			ret.x2 = imgRect.x2 * dispRect.y2 / imgRect.y2;
			ret.x1 = dispRect.x1 + (dispRect.x2 - ret.x2) / 2;
			ret.y1 = dispRect.y1;
		}
	}
	else
	{
		ret.x2 = imgRect.x2;
		ret.y2 = imgRect.y2;
		ret.x1 = dispRect.x1 + (dispRect.x2 - imgRect.x2) / 2;
		ret.y1 = dispRect.x2 + (dispRect.y2 - imgRect.y2) / 2;
	}
	return ret;
}


간단한 구현원리는

1. 가로길이의 비율, 세로길이의 비율을 얻는다. (원본 크기 / 넣어야 할 크기)
   Rx, Ry - 가로 세율의 비율
   Ix, Iy - 원본 이미지의 가로세로 크기
   Dx, Dy - 표시할 사각형의 크기
   Rx = Ix / Dx
   Ry = Iy / Dy
2. 만약에 축소가 필요 하다면, 위의 비율은 1을 넘게 되고, 축소가 필요 없으면 1 이하가 나온다.
3. 비율값들이 모두 1을 넘으면 어느 방향이던지 간에 축소를 해주어야 함
4. 비율값들이 둘다 1이하면 그대로 출력하면 됨
5. 비율값이 하나만 1보다 크면, 작은쪽 값이 맞추어 축소함

'모종의 음모 > Bitmap 조작' 카테고리의 다른 글

완전 날로먹는 Bitmap 구조분석하기  (6) 2009.03.28
Posted by 구차니
바코드 리더 관련 정보는 정말 눈 씻고 뒤져봐도 안나온다.
이유는 간단하다.

바코드 리더 = 특화된 키보드

메뉴얼을 읽어 보면
prefix / suffix가 존재하고, 이에 따라서 처리방법이 조금씩 달라지지만,
PS/2 방식의 바코드 리더의 경우에는 실질적으로 키보드와 다를바가 전혀없다.
그렇게 때문에, 바코드 리더 프로그래밍이란 것은 실질적으로 존재하지 않는 것이다.


prefix - 접두어(잘 쓰이는지는 모르겠지만, STX 가 있는것 봐서는 RS-232 시리얼 통신 표준을 맞추는데 사용하는 것 같다)
suffix - 접미어 (예를 들어 엔터 몇번이냐, 엔터를 어떤걸로 - CR/LF - 처리하냐 정도의 차이)


[링크 : http://www.iepos.com/support/symbol/ls1004userprogrammermanual.pdf]

'모종의 음모 > 바코드 리더' 카테고리의 다른 글

MFC 에서 바코드리더 메시지, 버츄얼 키  (0) 2009.06.17
바코드 폰트 (code 39)  (0) 2009.06.15
barcode reader - PS/2 type  (2) 2009.06.12
Posted by 구차니
키보드로 입력할 때에는
메시지는 WM_KEYDOWN / WM_KEYUP 와 버츄얼 키는 VK_RETURN이 입력된다.

하지만 바코드로 입력할 때에는
메시지는 WM_CHAR / 버츄얼 키는 VK_RETURN 이 입력된다.


어떤 차이로 인해서 이렇게 다르게 인식을 하는지는 모르겠다...

[참고 : http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx]
[참고 : http://web.lge.cn:8000/system/api/1241/page/3]

'모종의 음모 > 바코드 리더' 카테고리의 다른 글

바코드 리더 관련 프로그래밍 힌트  (0) 2009.06.22
바코드 폰트 (code 39)  (0) 2009.06.15
barcode reader - PS/2 type  (2) 2009.06.12
Posted by 구차니
Download the Code 39 truetype font package.
다운로드는 위에 링크를 클릭해주세요

Tips for Using the Barcode Font

  • Be sure to add an asterisk * character before and after your text. Example *YOURTEXTHERE*
  • Microsoft Word may adjust the character spacing and make the barcode unreadable. You may have more luck with Wordpad, found in the Windows Start Menu under Programs > Accessories.


폰트를 다운로드 받으면 두개가 나오는데, Free 3 of 9 Extended알파벳까지 적용된 폰트이다.
위에 빨간색 했듯이, 반드시 문자열 앞뒤로 *를 쳐주어야 한다.

개인적으로 16 사이즈로 출력해서 사용중
(작아 보인다고 32 포인트 했더니 스캐너가 인식 못하는 불상사가 -ㅁ-!)

[링크 : http://www.barcodesinc.com/free-barcode-font/]
Posted by 구차니
Posted by 구차니
LS1004-I100 이라는 모델의 PS/2 타입 바코드 핸드 스캐너를 사용할 일이 생겨서 데이터 시트를 찾는데..
영 안나온다.. OTL(요즘 따라 왜케 안나오는 일만 하는거지 .. OTL)

일단 데이터 포맷을 알아야 하기에 찾아봐도 안나오고
그냥 무책임하게 키보드 처럼 읽으면 되요~ 라고 하는 센스 ㄱ-

아무튼! 메모장과 frhed를 동원해서 캡쳐를 해보니

시리얼 넘버+ 엔터 + 엔터 이런식으로 날아 온다.
0x0D 0x0A 가 CR/LF 로 엔터 부분이고(DOS 타입인가..)


CR/LF 가 두번 있으니, 메모장 상에서는 엔터 두번 친것 처럼 한번 띄워진다.
(엔터 한번에 다음줄, 또 한번에 다음줄 이니 실질적으로 한줄의 공백이 생긴다.)


문제는, 일부 프로그램에서 Ctrl-A, Ctrl-M 단축키가 지정되어 있을 경우
전부 선택후 엔터, 전부 선택후 엔터로 인식을 하므로 아무런 문장도 입력되지 않을 수 있다.
(네이트온의 경우 Ctrl-M으로 인해 미니대화/일반대화 오가면서 데이터 소실)

0.01mg 정도의 도움을 준 문서
[PDF] Built-in Laser Barcode Scanner PROGRAMMING MANUAL
Klaser Series에 대한 메뉴얼이다. 바코드만 잔뜩 -ㅁ-! (아마 설정 바꾸는데 사용하는 것 같다.)

1088kb...pdf LS1004 User-Programmer Manual
[링크 : http://www.iepos.com/support/symbol-manuals.htm]


Posted by 구차니
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

의 내용을 enumrate 하면 된다는데..
아무튼 아래 링크의 프로젝트는 .net에서 생성된 c++ 기반 프로그램인 듯 하다.

[링크 : http://www.naughter.com/enumser.html]
[링크 : http://forum.sysinternals.com/forum_posts.asp?TID=4544]




다른 방법
그냥 for문으로 뱅글뱅글 open하고 open 되면 close 하고
open 안되면 패스하면 되고~ 생각대로 하면되고~ 응?
단, 일부 시리얼(USB)의 경우에는 10번대 까지 점프하니
넉넉하게 포트는 20번 정도 까지 해주는 센스?



2010.02.03 추가


Posted by 구차니