×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,101,745명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

초보자에서 이제 중수로 올라오며 갖가지 개인 프로잭트를 작성하다 곤경에 빠지게 되는 장소중 한 군데이다.

1
2
3
4
5
6
7
8
9
10
 
#include<MMSystem.h> // 배경음악 때문에 사용
 
 
 #pragma comment(lib,"Winmm.lib"// 배경음악
 
sndPlaySoundA("파일경로",SND_ASYNC | SND_NODEFAULT | SND_LOOP); 
 
 
 
Crocus

 

 

처음 시작하면 알게되는 흔한 bgm재생 라이브러리와 함수다.

 

이 함수는 wav파일만 지원하며, wav파일을 bgm으로 지정시 상당한 용량의 압박으로 인해 업로드하는데도 부담되고

 

프로그래밍에 걸림돌이 될 것이다.

 

그리고 이 함수를 이용하게되면, 배경음(bgm)과 효과음을 동시에 사용할 수 없다는 것이 단점중 단점이다.

 

그리하여 동시구현을 하는 법에 대하여 생각해 보았다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<stdio.h>
#include<Windows.h>
 
 
#pragma comment(lib, "winmm.lib")
#include "Mmsystem.h"
#include "Digitalv.h"
MCI_OPEN_PARMS m_mciOpenParms;
MCI_PLAY_PARMS m_mciPlayParms;
DWORD m_dwDeviceID;
MCI_OPEN_PARMS mciOpen;
MCI_PLAY_PARMS mciPlay;
 
int dwID;
 
 
int main()
{
 
 mciOpen.lpstrElementName = "mini_main.mp3"// 파일 경로 입력
 mciOpen.lpstrDeviceType = "mpegvideo";
 
 mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE,
  (DWORD)(LPVOID)&mciOpen);
 
 dwID = mciOpen.wDeviceID;
 
  mciSendCommand(dwID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, // play & repeat
     (DWORD)(LPVOID)&m_mciPlayParms);
 
 
/* mciSendCommandW(dwID, MCI_PAUSE, MCI_NOTIFY,
                (DWORD)(LPVOID)&m_mciPlayParms);     */// Pause
                                                
/* mciSendCommandW(dwID, MCI_RESUME, 0, NULL);       */// resume
 
/* mciSendCommandW(dwID, MCI_CLOSE, 0, NULL);        */// stop
 
}
 
Crocus

 

*** 이때 만약 아래 그림과 같이 빨간 밑줄이 뜨면서 진행이 되지 않는 경우도 있을 것이다. ***

 

 

***다음과 같이 해결하자. 상단 메뉴에 프로젝트 -> (가장 아래있는) 속성 -> 구성 속성 -> 문자 집합에서 ( 설정 안 함 ) 으로 설정한다. 그러면 해결될 것이다. ***

 

 

mci함수라는 녀석인데, 이 함수는 mp3를 지원한다.

 

여기서 간과하고 지나가는 사람들이 엄청 많으리라 예상한다. 왠만한 중수들은 mci에 대해서 찾아보곤 했을것이다. (음악구현을 위해)

 

그리하여 mp3지원하는 mci를 잘 쓰게 되고 하지만 두가지 음을 동시에 내는 법은 많이들 생각 못해 봤을 것이다.

 

********* mci 함수와 sndPlaySoundA 함수를 동시에 이용하라. *********

 

bgm은 작은 용량을 이용하도록 mci를 이용하여 연주시키고

 

효과음은 sndPlaySoundA 를 이용하여 연주시키면 엄청난 효과를 얻게된다.(효과음 자체가 용량이 작다.)

 

이 내용들 또한 두가지 소리를 구현하기에 고민이 많던 분들에게 도움이 될 것이다.

 

새로운 함수를 개발하는것이 아닌 기존의 함수들을 어떻게 이용하고 응용하는지가 중요하다는 것을 보여주고 싶은 바이다.

 

 

 

 

반응형
  1. 천재일까 2014.09.27 13:02

    08.MCI_OPEN_PARMS m_mciOpenParms;
    09.MCI_PLAY_PARMS m_mciPlayParms;
    10.DWORD m_dwDeviceID;
    11.MCI_OPEN_PARMS mciOpen;
    12.MCI_PLAY_PARMS mciPlay;
    13.
    14.int dwID;
    15.
    16.
    17.int main()
    18.{
    19.
    20. mciOpen.lpstrElementName = "mini_main.mp3"; // 파일 경로 입력
    21. mciOpen.lpstrDeviceType = "mpegvideo";
    22.
    23. mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE,
    24. (DWORD)(LPVOID)&mciOpen);
    25.
    26. dwID = mciOpen.wDeviceID;
    27.
    28. mciSendCommand(dwID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, // play & repeat
    29. (DWORD)(LPVOID)&m_mciPlayParms);
    30.
    31.
    32./* mciSendCommandW(dwID, MCI_PAUSE, MCI_NOTIFY,
    33. (DWORD)(LPVOID)&m_mciPlayParms); */// Pause
    34.
    35./* mciSendCommandW(dwID, MCI_RESUME, 0, NULL); */// resume
    36.
    37./* mciSendCommandW(dwID, MCI_CLOSE, 0, NULL); */// stop

    복붙실행해보았지만 아무 소리가 안들립니다
    물론 주석처리 지웟고요

    • 가누 2014.09.27 14:57 신고

      #include<stdio.h>
      #include<Windows.h>


      #pragma comment(lib, "winmm.lib")
      #include "Mmsystem.h"
      #include "Digitalv.h"
      MCI_OPEN_PARMS m_mciOpenParms;
      MCI_PLAY_PARMS m_mciPlayParms;
      DWORD m_dwDeviceID;
      MCI_OPEN_PARMS mciOpen;
      MCI_PLAY_PARMS mciPlay;

      int dwID;


      int main()
      {

      mciOpen.lpstrElementName = "mini_main.mp3"; // 파일 경로 입력
      mciOpen.lpstrDeviceType = "mpegvideo";

      mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_OPEN_TYPE,
      (DWORD)(LPVOID)&mciOpen);

      dwID = mciOpen.wDeviceID;

      mciSendCommand(dwID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, // play & repeat
      (DWORD)(LPVOID)&m_mciPlayParms);


      /* mciSendCommandW(dwID, MCI_PAUSE, MCI_NOTIFY,
      (DWORD)(LPVOID)&m_mciPlayParms); */// Pause

      /* mciSendCommandW(dwID, MCI_RESUME, 0, NULL); */// resume

      /* mciSendCommandW(dwID, MCI_CLOSE, 0, NULL); */// stop

      }
      이대로 붙여넣으시고 mini_main.mp3 파일을 자신이 소유하고 있는

      mp3파일명으로 수정해 보시면 될겁니다.(경로설정은 해주셔야됩니다.)

      그리고 이 함수는 mp3를 지원하는 함수입니다.

  2. 지나가던일인 2015.10.26 21:30

    사운드 동시재생 방법을 찾고있었는데
    손쉽게 해결했습니다 정말 감사합니다!!

  3. 만델라 2015.12.23 11:10 신고

    님껄로
    배경음과 효과음까지 동시에 구현했습니다.
    그런데요.
    효과음이 한번 이후론 다시 재생되지가 않습니다...
    이런 문제 없으셨나요?
    저는 지금 테트리스를 만드는중인데요
    테트리스 배경음은 반복 재생 시켜두면 되는데요 효과음은 한번씩 재생되게 해서
    동작마다 한번씩 재생되게 하려고 하는데.. .최초 한번 재생된 이후로는 뭔가 id값 같은게 죽기라도 하는것처럼 다음부터 재생이 안되는 문제가 있는데..
    어찌 해결 해야 할지 며칠째 MCI를 엄청 찾았는데 딱히 없네요...

    • 가누 2015.12.24 09:17 신고

      MCI로 배경음을 구현하시고 sndplay로 효과음을구현해보셧나요?

  4. 가누 2015.12.24 09:19 신고

    그래도 되지않으신다면 자작프로그래밍에 미니게임 콘솔버전 다운받아보시면 효과음 배경음 같이 구현해둔 코드가 있을것입니다. 참조해주시고 안되면 말씀해주세요ㅎㅎ

  5. 누랴 2017.04.10 01:09

    글 쓰신지 오래 되셨지만 지금 발견해 댓글을 남깁니다. 어떻게 콘솔 창에 bgm을 설정하지? < 가 난제였는데 명쾌하게 설명해주셔서 너무 감사합니다 :) 평안한 하루 되세요.

    • 가누 2017.04.10 04:56 신고

      잘 보고가신다니 제가 기분이 좋네요 ^^ 좋은 프로그램 만드세요 !

  6. BooKey 2017.06.01 12:03

    아! 이거 정말 도움이 되었습니다 감사해요

  7. 인간45 2017.06.11 18:04

    저는 그렇게 하면
    [Warning]comparison between pointer and integer
    테스트.c:(text+0x24): underfined reference to '_imp_sndPlaySoundA'
    [Error]Id returned 1 exit status
    라 고 에러가 납니다...
    어떡하죠?

    • 가누 2017.06.11 18:25 신고

      저한테 코드를 보내주실 수 있나요?
      kkw564@naver.com입니다

  8. 다즈 2018.02.11 18:49

    질문이 있습니다 한노래가 틀어지면 그노래만 반복이 되는데 씬이 넘어가거나 그러면 다른 노래를 틀고싶을때는 어떻게 해야 하나요?

    • 가누 2018.02.11 19:32 신고

      제가 그렇게 코딩해서그런데 그 부분은 직접 위 코드에서 분석해서 응용해보시는걸 추천드립니다.

    • 다즈 2018.02.11 20:40

      그럼 힌트라도 주실 수 있나요? 전혀 감이 안와서요 해제를 할려고 해도 오류가 자꾸 떠서 멘붕중이라 ㅠㅠ

    • 가누 2018.02.14 13:55 신고

      kkw564@naver.com 으로메일하나보내주실수있나요?

  9. ㅇㅇ 2018.10.14 23:34

    ㅁㄴㅇㅁㄴㅇ

  10. 의미불명 2019.06.06 15:42

    여러분 Sleep 함수 쓰면 해결됩니다.
    진작 그걸 알려주셨으면 편했을텐데;;

  11. sdasdf 2019.07.23 17:56

    △오오 맨 아래 부분에 쓰니까 나와요
    감사합니다ㅠㅠㅠ

  12. 광자검 2021.06.05 23:18

    큰 도움 받고 갑니다 감사합니다.