본문 바로가기
프로그래밍

사운드를 재생하기

by 건우아빠유리남편 2009. 7. 9.
반응형

 

 

이번 프로그램은 XNA로 사운드를 재생하는 프로그램입니다.

 

사운드리소스 작성

 

XNA에서 사용하는 사운드리소스는 wave등의 소재를 XACT, XNA용으로 변환할 필요가 있다

 

1.     스타트 메뉴로부터 Microsoft XNA Game Studio Express -> Microsoft Cross-Platform
Audio  Creation Tool(XACT)
을 선택한다.

 

2.     XACT 의 우측 트리의 Wave Banks 를 우클릭하여 New Wave Bank를 선택하여 Wave뱅크를 생성한다. 디폴트이름은 Wave Bank이므로 TestWaveBank따위로 변경해두면 좋습니다.

 

3.     XACT 의 우측 트리의 Sound Banks를 우클릭하여 New Sound Bank 를 선택하여 Sound뱅크를 생성한다. 디폴트 이름은 Sound Bank이므로 TestSoundBank따위로 변경해두면 좋습니다.

 

4.     변환한 Wave파일을 Wave뱅크의 윈도우에 드래그&드롭 하여 소재를 추가합니다. 2개 이상의 추가도 가능합니다.

 

5.     Wave뱅크 윈도우에 표시되어있는 소재를 Sound뱅크의 윈도우에 드래그&드롭 한다.
Sound
뱅크 윈도우에 표시되어있는 Cue Name 은 프로그램으로부터 조작대상을 지정하는 때에 이용한다.

 

6.     XACT 의 메뉴로부터 File->Save Project 를 선택하여 XACT프로젝트를 저장한다.
프로젝트 이름은 TestSound같은 거로 한다.

 

7.     XACT 의 메뉴로부터 File->Build를 선택하여 XACT프로젝트를 빌드한다.

 

8.     프로젝트를 저장하는 곳에 Win폴더와 Xbox폴더가 생성되어있다.
폴더 안의 파일은 XNA로 사운드를 재생할 때 사용한다.
xgs
파일(XACT Global Setting)
xwb
파일(XACT Wave Bank)
xsb
파일(XACT Sound Bank)

가 생성된다.

 

여기서 중요한것은 위의 파일을 프로젝트에 복사할때 복사 옵션에서 항상복사하기 Always Copy로 바꿔줘야 한다는 것..!

 

사운드리소스 추가

 

이번 프로그램에서는 사운드가 이용됩니다.

tests.xgs    Wave Bank.xwb  Sound Bank.xsb 를 프로젝트에 추가하여 출력 디렉토리에 카피를 항상 카피한다 로 변경한다.

 

사운드뱅크 클래스

 

2개 이상의 큐를 가지고 있습니다.

SoundBank (AudioEngine,String)

constructor

Cue GetCue(String)

큐를 얻어온다.

 

큐 클래스

큐 정보를 가지고 있습니다.

String Name

이름

bool IsCreated

생성이 되었는가 아닌가

bool IsPaused

일시 정지 중인가 아닌가

bool IsPlaying

재생 중인가 아닌가

bool IsPreparing

준비가 되었는가 아닌가

bool IsStopped

정지 중인가 아닌가

bool IsStopping

정지 처리중인가 아닌가

void Pause()

일시 정지

void Play()

재생

void Stop()

정지

 

WaveBank 클래스

2개 이상의 웨이브를 가지고 있습니다.

WaveBank(AudioEngine,String)

constructor

 

오디오엔진 클래스

오디오전체에 대한 정보를 가지고 있습니다.

AudioEngine(String)

constructor

AudioCategory GetCategory(String)

오디오카테고리 얻어오기

                     

오디오카테고리 구조체

오디오카테고리 정보를 가지고 있습니다.

String Name

이름

void Pause()

일시정지

void SetVolume(float)

볼륨지정(0.01.0)

void Stop()

정지

 

 

 

소스코드 편집하기

Game1.cs를 편집한다.

 

using System;

using System.Collections.Generic;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Audio;

using Microsoft.Xna.Framework.Content;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Input;

using Microsoft.Xna.Framework.Storage;

 

//사운드를 재생한다

namespace SoundEx

{

    public class Game1 : Microsoft.Xna.Framework.Game

    {

        //시스템

        private GraphicsDeviceManager graphics;

        private ContentManager content;

        private SpriteBatch spBatch;

        private Texture2D texture;

        private Texture2D texture1;

        private int width;

        private int height;

 

        //사운드

        private AudioEngine audioEngine; //오디오엔진

        private WaveBank waveBank;   //Wave뱅크

        private SoundBank soundBank;  //Sound뱅크

 

        //마우스

        private int x = 100; //X좌표

        private int y = 100; //Y좌표

        private ButtonState rightButton = ButtonState.Released;

        //왼쪽버튼 상태

 

        //속도

        private int dx = 1;

        private int dy = 1;

 

        private int z = 0;

        private int q = 0;

 

        //constructor

        public Game1()

        {

            graphics = new GraphicsDeviceManager(this);

            content = new ContentManager(Services);

 

            IsFixedTimeStep = true;

            TargetElapsedTime = new TimeSpan(500000);

        }

 

        //초기화

        protected override void Initialize()

        {

            //사운드 읽어오기

            audioEngine = new AudioEngine("tests.xgs");

            waveBank = new WaveBank(audioEngine, "Wave Bank.xwb");

            soundBank = new SoundBank(audioEngine, "Sound Bank.xsb");

 

            width = graphics.GraphicsDevice.Viewport.Width;

            height = graphics.GraphicsDevice.Viewport.Height;

 

            //초기화

            base.Initialize();

        }

 

        //그래픽스 컨텐츠 데리고 오기

        protected override void LoadGraphicsContent(bool loadAllContent)

        {

            if (loadAllContent)

            {

                spBatch = new SpriteBatch(graphics.GraphicsDevice);

                texture = content.Load<Texture2D>("imagine08");

                texture1 = content.Load<Texture2D>("ininIMG_2121");

                //←Assent Name 지정

            }

        }

 

        //그래픽스 컨텐츠 놓아주기

        protected override void UnloadGraphicsContent(bool unloadAllContent)

        {

            if (unloadAllContent == true)

            {

                content.Unload();

            }

        }

 

        //업뎃

        protected override void Update(GameTime gameTime)

        {

            //마우스 XY위치추적

            MouseState mouseState = Mouse.GetState();

            x = mouseState.X;

            y = mouseState.Y;

            Cue sound = null;

 

 

 

            //마우스왼쪽버튼 상태가 변경되었다면

            if (rightButton != mouseState.RightButton)

            {

                rightButton = mouseState.RightButton;

                //Enter 누르면

                if (mouseState.RightButton == ButtonState.Pressed)

                {

                    //사운드 재생

                    sound = soundBank.GetCue("a");

                    sound.Play();

 

                }

            }

 

 

            KeyboardState keyboardState = Keyboard.GetState();

            if (keyboardState.IsKeyDown(Keys.S))

                soundBank.GetCue("b").Play();

            if (keyboardState.IsKeyDown(Keys.Escape))

                Exit();

 

            //이동량(매초 400픽셀)

            int move = (int)(400 *

                (float)gameTime.ElapsedRealTime.TotalMilliseconds / 1000.0f);

 

            //이동

            z += dx * move;

            q += dy * move;

            if (z < 0 || width < z) dx = -dx;

            if (q < 0 || height < q) dy = -dy;

 

 

            //베이스 업뎃

            base.Update(gameTime);

        }

 

        //그리기

        protected override void Draw(GameTime gameTime)

        {

            //배경색

            graphics.GraphicsDevice.Clear(Color.Black);

 

            //텍스쳐

            spBatch.Begin();

           

            Vector2 pos1 = new Vector2(z - 200, q - 200);

 

            Vector2 pos = new Vector2(x - 100, y - 50); //좌표지정

           

            spBatch.Draw(texture1, pos1, Color.White);

            spBatch.Draw(texture, pos, Color.White);

 

            spBatch.End();

 

 

 

            //베이스그리기

            base.Draw(gameTime);

        }

    }

}

 

 

이렇게 해주니 대략 플래시의 그것과 비슷한 프로그램이 나왔네요.

 


반응형

'프로그래밍' 카테고리의 다른 글

그래프의 용어v2.0  (0) 2009.07.09
3D모델을 가져오기  (0) 2009.07.09
XNA Framework 정리  (0) 2009.07.09
데이타를 스토리지에 저장하기  (0) 2009.07.09
마우스 이벤트 처리하기  (0) 2009.07.09

댓글