<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=WinampPluginProgramming%2FDSP</id>
	<title>WinampPluginProgramming/DSP - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=WinampPluginProgramming%2FDSP"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=WinampPluginProgramming/DSP&amp;action=history"/>
	<updated>2026-05-15T12:37:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=WinampPluginProgramming/DSP&amp;diff=40301&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=WinampPluginProgramming/DSP&amp;diff=40301&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;winamp SDK 를 받으면 sample 로 있는 dspecho 에 대한 분석.&lt;br /&gt;
&lt;br /&gt;
기본 뼈대 프로그램은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
 // Winamp test dsp library 0.9 for Winamp 2&lt;br /&gt;
 // Copyright (C) 1997, Justin Frankel/Nullsoft&lt;br /&gt;
 // Feel free to base any plugins on this &amp;quot;framework&amp;quot;...&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;windows.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;commctrl.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;quot;dsp.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;resource.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // avoid stupid CRT silliness&lt;br /&gt;
 BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)&lt;br /&gt;
 {&lt;br /&gt;
 	return TRUE;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // pitch value&lt;br /&gt;
 int g_pitch=100;&lt;br /&gt;
 int delta = 1;&lt;br /&gt;
 &lt;br /&gt;
 // pitch control window&lt;br /&gt;
 HWND pitch_control_hwnd;&lt;br /&gt;
 &lt;br /&gt;
 // auxilary pitch buffer (for resampling from)&lt;br /&gt;
 short *pitch_buffer=NULL;&lt;br /&gt;
 int pitch_buffer_len=0;&lt;br /&gt;
 int quit_pitch=0;&lt;br /&gt;
 &lt;br /&gt;
 // module getter.&lt;br /&gt;
 winampDSPModule *getModule(int which);&lt;br /&gt;
 &lt;br /&gt;
 void config(struct winampDSPModule *this_mod);&lt;br /&gt;
 int init(struct winampDSPModule *this_mod);&lt;br /&gt;
 void quit(struct winampDSPModule *this_mod);&lt;br /&gt;
 void initpitch(struct winampDSPModule *this_mod);&lt;br /&gt;
 void quitpitch(struct winampDSPModule *this_mod);&lt;br /&gt;
 &lt;br /&gt;
 // 실제로 DSP 관련 처리시 호출되는 함수들. &lt;br /&gt;
 int modify_samples1(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate); &lt;br /&gt;
 int modify_samples2(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);&lt;br /&gt;
 &lt;br /&gt;
 // 이 부분은 [1002] 가 장난삼아 수정. ^^;&lt;br /&gt;
 int modify_samples3(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);&lt;br /&gt;
 int modify_samples4(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);&lt;br /&gt;
 int modify_samples5(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);&lt;br /&gt;
 &lt;br /&gt;
 // samples3-5 번 관련. pitch control 를 보여주기 위한 윈도우.&lt;br /&gt;
 // DSP 처리만을 위해서라면 별 필요 없다.&lt;br /&gt;
 static BOOL CALLBACK pitchProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);&lt;br /&gt;
 &lt;br /&gt;
 // Module header, includes version, description, and address of the module retriever function&lt;br /&gt;
 winampDSPHeader hdr = { DSP_HDRVER, &amp;quot;Nullsoft DSP demo v0.3 for Winamp 2&amp;quot;, getModule };&lt;br /&gt;
 &lt;br /&gt;
 // first module&lt;br /&gt;
 // DLL 당 여러개의 모듈들이 들어갈 수 있다.&lt;br /&gt;
 winampDSPModule mod =&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;Nullsoft Echo v0.2&amp;quot;,&lt;br /&gt;
 	NULL,	// hwndParent&lt;br /&gt;
 	NULL,	// hDllInstance&lt;br /&gt;
 	config,  // config 시 호출 함수.&lt;br /&gt;
 	init,    // init 시 호출 함수&lt;br /&gt;
 	modify_samples1, // DSP 처리시 호출 함수&lt;br /&gt;
 	quit     // quit 시 호출 함수&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // second module&lt;br /&gt;
 winampDSPModule mod2 =&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;Nullsoft Stereo Voice Removal v0.2&amp;quot;,&lt;br /&gt;
 	NULL,	// hwndParent&lt;br /&gt;
 	NULL,	// hDllInstance&lt;br /&gt;
 	config,&lt;br /&gt;
 	init,&lt;br /&gt;
 	modify_samples2,&lt;br /&gt;
 	quit&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 winampDSPModule mod3 =&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;Nullsoft Pitch/Tempo Control v0.2&amp;quot;,&lt;br /&gt;
 	NULL,	// hwndParent&lt;br /&gt;
 	NULL,	// hDllInstance&lt;br /&gt;
 	config,&lt;br /&gt;
 	initpitch,&lt;br /&gt;
 	modify_samples3,&lt;br /&gt;
 	quitpitch&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 winampDSPModule mod4 =&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;Nullsoft Pitch/Tempo Control v0.3 - lower&amp;quot;,&lt;br /&gt;
 	NULL,	// hwndParent&lt;br /&gt;
 	NULL,	// hDllInstance&lt;br /&gt;
 	config,&lt;br /&gt;
 	initpitch,&lt;br /&gt;
 	modify_samples4,&lt;br /&gt;
 	quitpitch&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 winampDSPModule mod5 =&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;Nullsoft Pitch/Tempo Control v0.3 - higher&amp;quot;,&lt;br /&gt;
 	NULL,	// hwndParent&lt;br /&gt;
 	NULL,	// hDllInstance&lt;br /&gt;
 	config,&lt;br /&gt;
 	initpitch,&lt;br /&gt;
 	modify_samples5,&lt;br /&gt;
 	quitpitch&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 #ifdef __cplusplus&lt;br /&gt;
 extern &amp;quot;C&amp;quot; {&lt;br /&gt;
 #endif&lt;br /&gt;
 // this is the only exported symbol. returns our main header.&lt;br /&gt;
 __declspec( dllexport ) winampDSPHeader *winampDSPGetHeader2()&lt;br /&gt;
 {&lt;br /&gt;
 	return &amp;amp;amp;hdr;&lt;br /&gt;
 }&lt;br /&gt;
 #ifdef __cplusplus&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 // getmodule routine from the main header. Returns NULL if an invalid module was requested,&lt;br /&gt;
 // otherwise returns either mod1 or mod2 depending on &amp;#039;which&amp;#039;.&lt;br /&gt;
 winampDSPModule *getModule(int which)&lt;br /&gt;
 {&lt;br /&gt;
 	switch (which)&lt;br /&gt;
 	{&lt;br /&gt;
 		case 0: return &amp;amp;amp;mod;&lt;br /&gt;
 		case 1: return &amp;amp;amp;mod2;&lt;br /&gt;
 		case 2: return &amp;amp;amp;mod3;&lt;br /&gt;
 		case 3: return &amp;amp;amp;mod4;&lt;br /&gt;
 		case 4: return &amp;amp;amp;mod5;&lt;br /&gt;
 		default:return NULL;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // configuration. Passed this_mod, as a &amp;quot;this&amp;quot; parameter. Allows you to make one configuration&lt;br /&gt;
 // function that shares code for all your modules (you don&amp;#039;t HAVE to use it though, you can make&lt;br /&gt;
 // config1(), config2(), etc...)&lt;br /&gt;
 void config(struct winampDSPModule *this_mod)&lt;br /&gt;
 {&lt;br /&gt;
 	MessageBox(this_mod-&amp;amp;gt;hwndParent,&amp;quot;This module is Copyright(C) 1997, Justin Frankel/Nullsoft\n&amp;quot;&lt;br /&gt;
 									&amp;quot;Notes:\n&amp;quot;&lt;br /&gt;
 									&amp;quot; * 8 bit samples aren&amp;#039;t supported.\n&amp;quot;&lt;br /&gt;
 									&amp;quot; * Pitch control rules!\n&amp;quot;&lt;br /&gt;
 									&amp;quot; * Voice removal sucks (works about 10% of the time)!\n&amp;quot;&lt;br /&gt;
 									&amp;quot; * Echo isn&amp;#039;t very good!\n&amp;quot;&lt;br /&gt;
 									&amp;quot;etc... this is really just a test of the new\n&amp;quot;&lt;br /&gt;
 									&amp;quot;DSP plug-in system. Nothing more.&amp;quot;,&lt;br /&gt;
 									&amp;quot;Configuration&amp;quot;,MB_OK);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int init(struct winampDSPModule *this_mod)&lt;br /&gt;
 {&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void initpitch(struct winampDSPModule *this_mod)&lt;br /&gt;
 {&lt;br /&gt;
 	pitch_buffer_len=0;&lt;br /&gt;
 	pitch_buffer=NULL;&lt;br /&gt;
 	quit_pitch=0;		&lt;br /&gt;
 	ShowWindow((pitch_control_hwnd=CreateDialog(this_mod-&amp;amp;gt;hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),this_mod-&amp;amp;gt;hwndParent,pitchProc)),SW_SHOW);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // cleanup (opposite of init()). Destroys the window, unregisters the window class&lt;br /&gt;
 void quit(struct winampDSPModule *this_mod)&lt;br /&gt;
 {&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void quitpitch(struct winampDSPModule *this_mod)&lt;br /&gt;
 {&lt;br /&gt;
 	if (this_mod == &amp;amp;amp;mod3 || this_mod == &amp;amp;amp;mod4 || this_mod == &amp;amp;amp;mod5)&lt;br /&gt;
 	{&lt;br /&gt;
 		if (pitch_buffer) GlobalFree(pitch_buffer);&lt;br /&gt;
 		pitch_buffer_len=0;&lt;br /&gt;
 		pitch_buffer=NULL;&lt;br /&gt;
 		quit_pitch=1;&lt;br /&gt;
 		if (pitch_control_hwnd)&lt;br /&gt;
 		{&lt;br /&gt;
 			DestroyWindow(pitch_control_hwnd);&lt;br /&gt;
 			pitch_control_hwnd=0;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 short echo_buf[65536], echo_buf2[65536];&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 // 실질적인 callback 함수. &lt;br /&gt;
 // this_mod 는 일종의 this pointer 라고 생각해도 좋을듯 하다. 해당 모듈(위의 mod1~5) 의 포인터이다.&lt;br /&gt;
 // samples 는 output 쪽으로 나갈 데이터이며 이 데이터를 수정해주면 된다.&lt;br /&gt;
 &lt;br /&gt;
 // echo plugin.&lt;br /&gt;
 int modify_samples1(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)&lt;br /&gt;
 {&lt;br /&gt;
 	// echo doesn&amp;#039;t support 8 bit right now cause I&amp;#039;m lazy.&lt;br /&gt;
 	if (bps==16)&lt;br /&gt;
 	{&lt;br /&gt;
         int x,s;&lt;br /&gt;
         s = numsamples*nch;&lt;br /&gt;
 &lt;br /&gt;
         memcpy(echo_buf2,       echo_buf,       s*2);&lt;br /&gt;
         memcpy(echo_buf,        echo_buf+s,     s*2);&lt;br /&gt;
         memcpy(echo_buf+s,      echo_buf+s*2, s*2);&lt;br /&gt;
         memcpy(echo_buf+s*2,echo_buf+s*3, s*2);&lt;br /&gt;
         memcpy(echo_buf+s*3,samples, s*2);&lt;br /&gt;
 &lt;br /&gt;
         for (x = 0; x &amp;amp;lt; s; x ++)&lt;br /&gt;
         {&lt;br /&gt;
                 int s = samples[x]/2+echo_buf2[x]/2;&lt;br /&gt;
                 samples[x] = (s&amp;amp;gt;32767?32767:s&amp;amp;lt;-32768?-32768:s);&lt;br /&gt;
         }&lt;br /&gt;
 	}&lt;br /&gt;
 	return numsamples;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // pitch 를 올렸다 낮췄다 함.&lt;br /&gt;
 int modify_samples3(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)&lt;br /&gt;
 {&lt;br /&gt;
 	int pitch=g_pitch;&lt;br /&gt;
 &lt;br /&gt;
 	int rlen =numsamples*bps/8*nch;&lt;br /&gt;
 	int index=0, x;&lt;br /&gt;
 	int n; &lt;br /&gt;
 	int dindex; &lt;br /&gt;
 &lt;br /&gt;
 	g_pitch += delta;&lt;br /&gt;
 &lt;br /&gt;
 	if (quit_pitch || g_pitch==100) return numsamples;&lt;br /&gt;
 	if (g_pitch &amp;amp;gt; 200) {&lt;br /&gt;
 		g_pitch=200;&lt;br /&gt;
         delta = -delta;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	if (g_pitch &amp;amp;lt; 50) {&lt;br /&gt;
 		g_pitch=50;&lt;br /&gt;
 		delta = -delta;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	pitch = g_pitch;&lt;br /&gt;
 &lt;br /&gt;
 	pitch = 100000/pitch;&lt;br /&gt;
 	n=(numsamples*pitch)/1000;&lt;br /&gt;
 	dindex=(numsamples&amp;amp;lt;&amp;amp;lt;14)/n;&lt;br /&gt;
 	if (pitch_buffer_len &amp;amp;lt; rlen) &lt;br /&gt;
 	{&lt;br /&gt;
 		pitch_buffer_len = rlen;&lt;br /&gt;
 		GlobalFree(pitch_buffer);&lt;br /&gt;
 		pitch_buffer=GlobalAlloc(GMEM_FIXED,rlen);&lt;br /&gt;
 	}&lt;br /&gt;
 	if (bps == 16 &amp;amp;amp;&amp;amp;amp; nch == 2)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *buf=pitch_buffer;&lt;br /&gt;
 		memcpy(buf,samples,rlen);&lt;br /&gt;
 		for (x = 0; x &amp;amp;lt; n; x ++)&lt;br /&gt;
 		{&lt;br /&gt;
 			int p=(index&amp;amp;gt;&amp;amp;gt;14)&amp;amp;lt;&amp;amp;lt;1;&lt;br /&gt;
 			index+=dindex;&lt;br /&gt;
 			samples[0] = buf[p];&lt;br /&gt;
 			samples[1] = buf[p+1];&lt;br /&gt;
 			samples+=2;&lt;br /&gt;
 		}&lt;br /&gt;
 		return n;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (bps == 16 &amp;amp;amp;&amp;amp;amp; nch == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *buf=pitch_buffer;&lt;br /&gt;
 		memcpy(buf,samples,rlen);&lt;br /&gt;
 		for (x = 0; x &amp;amp;lt; n; x ++)&lt;br /&gt;
 		{&lt;br /&gt;
 			int p=(index&amp;amp;gt;&amp;amp;gt;14);&lt;br /&gt;
 			index+=dindex;&lt;br /&gt;
 			*samples++ = buf[p];&lt;br /&gt;
 		}&lt;br /&gt;
 		return n;&lt;br /&gt;
 	}&lt;br /&gt;
 	return numsamples;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 // pitch 를 낮춘 결과를 출력하는 플러그인.&lt;br /&gt;
 int modify_samples4(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)&lt;br /&gt;
 {&lt;br /&gt;
 	int pitch=60;&lt;br /&gt;
 &lt;br /&gt;
 	int rlen =numsamples*bps/8*nch;&lt;br /&gt;
 	int index=0, x;&lt;br /&gt;
 	int n; &lt;br /&gt;
 	int dindex; &lt;br /&gt;
 &lt;br /&gt;
 	pitch = 100000/pitch;&lt;br /&gt;
 	n=(numsamples*pitch)/1000;&lt;br /&gt;
 	dindex=(numsamples&amp;amp;lt;&amp;amp;lt;14)/n;&lt;br /&gt;
 	if (pitch_buffer_len &amp;amp;lt; rlen) &lt;br /&gt;
 	{&lt;br /&gt;
 		pitch_buffer_len = rlen;&lt;br /&gt;
 		GlobalFree(pitch_buffer);&lt;br /&gt;
 		pitch_buffer=GlobalAlloc(GMEM_FIXED,rlen);&lt;br /&gt;
 	}&lt;br /&gt;
 	if (bps == 16 &amp;amp;amp;&amp;amp;amp; nch == 2)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *buf=pitch_buffer;&lt;br /&gt;
 		memcpy(buf,samples,rlen);&lt;br /&gt;
 		for (x = 0; x &amp;amp;lt; n; x ++)&lt;br /&gt;
 		{&lt;br /&gt;
 			int p=(index&amp;amp;gt;&amp;amp;gt;14)&amp;amp;lt;&amp;amp;lt;1;&lt;br /&gt;
 			index+=dindex;&lt;br /&gt;
 			samples[0] = buf[p];&lt;br /&gt;
 			samples[1] = buf[p+1];&lt;br /&gt;
 			samples+=2;&lt;br /&gt;
 		}&lt;br /&gt;
 		return n;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (bps == 16 &amp;amp;amp;&amp;amp;amp; nch == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *buf=pitch_buffer;&lt;br /&gt;
 		memcpy(buf,samples,rlen);&lt;br /&gt;
 		for (x = 0; x &amp;amp;lt; n; x ++)&lt;br /&gt;
 		{&lt;br /&gt;
 			int p=(index&amp;amp;gt;&amp;amp;gt;14);&lt;br /&gt;
 			index+=dindex;&lt;br /&gt;
 			*samples++ = buf[p];&lt;br /&gt;
 		}&lt;br /&gt;
 		return n;&lt;br /&gt;
 	}&lt;br /&gt;
 	return numsamples;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // pitch 를 올리는 결과를 출력하는 플러그인&lt;br /&gt;
 int modify_samples5(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)&lt;br /&gt;
 {&lt;br /&gt;
 	int pitch=180;&lt;br /&gt;
 &lt;br /&gt;
 	int rlen =numsamples*bps/8*nch;&lt;br /&gt;
 	int index=0, x;&lt;br /&gt;
 	int n; &lt;br /&gt;
 	int dindex; &lt;br /&gt;
 &lt;br /&gt;
 	pitch = 100000/pitch;&lt;br /&gt;
 	n=(numsamples*pitch)/1000;&lt;br /&gt;
 	dindex=(numsamples&amp;amp;lt;&amp;amp;lt;14)/n;&lt;br /&gt;
 	if (pitch_buffer_len &amp;amp;lt; rlen) &lt;br /&gt;
 	{&lt;br /&gt;
 		pitch_buffer_len = rlen;&lt;br /&gt;
 		GlobalFree(pitch_buffer);&lt;br /&gt;
 		pitch_buffer=GlobalAlloc(GMEM_FIXED,rlen);&lt;br /&gt;
 	}&lt;br /&gt;
 	if (bps == 16 &amp;amp;amp;&amp;amp;amp; nch == 2)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *buf=pitch_buffer;&lt;br /&gt;
 		memcpy(buf,samples,rlen);&lt;br /&gt;
 		for (x = 0; x &amp;amp;lt; n; x ++)&lt;br /&gt;
 		{&lt;br /&gt;
 			int p=(index&amp;amp;gt;&amp;amp;gt;14)&amp;amp;lt;&amp;amp;lt;1;&lt;br /&gt;
 			index+=dindex;&lt;br /&gt;
 			samples[0] = buf[p];&lt;br /&gt;
 			samples[1] = buf[p+1];&lt;br /&gt;
 			samples+=2;&lt;br /&gt;
 		}&lt;br /&gt;
 		return n;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (bps == 16 &amp;amp;amp;&amp;amp;amp; nch == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *buf=pitch_buffer;&lt;br /&gt;
 		memcpy(buf,samples,rlen);&lt;br /&gt;
 		for (x = 0; x &amp;amp;lt; n; x ++)&lt;br /&gt;
 		{&lt;br /&gt;
 			int p=(index&amp;amp;gt;&amp;amp;gt;14);&lt;br /&gt;
 			index+=dindex;&lt;br /&gt;
 			*samples++ = buf[p];&lt;br /&gt;
 		}&lt;br /&gt;
 		return n;&lt;br /&gt;
 	}&lt;br /&gt;
 	return numsamples;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 이 플러그인은 voice removal.&lt;br /&gt;
 int modify_samples2(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)&lt;br /&gt;
 {&lt;br /&gt;
 	int x = numsamples;&lt;br /&gt;
 	if (bps == 16)&lt;br /&gt;
 	{&lt;br /&gt;
 		short *a = samples;&lt;br /&gt;
 		if (nch == 2) while (x--)&lt;br /&gt;
 		{&lt;br /&gt;
 			int l, r;&lt;br /&gt;
 			l = a[1]-a[0];&lt;br /&gt;
 			r = a[0]-a[1];		&lt;br /&gt;
 			if (l &amp;amp;lt; -32768) l = -32768;&lt;br /&gt;
 			if (l &amp;amp;gt; 32767) l = 32767;&lt;br /&gt;
 			if (r &amp;amp;lt; -32768) r = -32768;&lt;br /&gt;
 			if (r &amp;amp;gt; 32767) r = 32767;&lt;br /&gt;
 			a[0] = l;&lt;br /&gt;
 			a[1] = r;&lt;br /&gt;
 			a+=2;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	return numsamples;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 static BOOL CALLBACK pitchProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)&lt;br /&gt;
 {&lt;br /&gt;
 	if (uMsg == WM_INITDIALOG)&lt;br /&gt;
 	{&lt;br /&gt;
 		SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETRANGEMAX,0,18);&lt;br /&gt;
 		SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETRANGEMIN,0,-18);&lt;br /&gt;
 	    SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETPOS,1,1);&lt;br /&gt;
 	    SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_SETPOS,1,0);&lt;br /&gt;
 		{&lt;br /&gt;
 			char str[123];&lt;br /&gt;
 			wsprintf(str,&amp;quot;%s%d%%&amp;quot;,g_pitch&amp;amp;gt;100?&amp;quot;+&amp;quot;:&amp;quot;&amp;quot;,g_pitch-100);&lt;br /&gt;
 			SetDlgItemText(hwndDlg,IDC_BOOGA,str);&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	if (uMsg == WM_VSCROLL)&lt;br /&gt;
 	{&lt;br /&gt;
 		HWND swnd = (HWND) lParam;&lt;br /&gt;
 		if (swnd == GetDlgItem(hwndDlg,IDC_SLIDER1))&lt;br /&gt;
 		{&lt;br /&gt;
 			g_pitch = -SendDlgItemMessage(hwndDlg,IDC_SLIDER1,TBM_GETPOS,0,0)+100;&lt;br /&gt;
 			{&lt;br /&gt;
 				char str[123];&lt;br /&gt;
 				wsprintf(str,&amp;quot;%s%d%%&amp;quot;,g_pitch&amp;amp;gt;100?&amp;quot;+&amp;quot;:&amp;quot;&amp;quot;,g_pitch-100);&lt;br /&gt;
 				SetDlgItemText(hwndDlg,IDC_BOOGA,str);&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>