효과음의 평균 db이 서로 달라 별도의 프로그램으로 조절해야하는 불편함이 있어 이 문제를 해결하기 위해 unity editor에서 wav 파일의 db을 손쉽게 조절할 수 있는 tool을 만들어 배포합니다.
📺 미리 보기
💬 서론
- 이 기능은 Github에 업로드 되어있습니다.
- Unity Editor 2021.3.5f1 및 2022.3.7f1에서 테스트 되었습니다.
⚒️ 구현
- 이 Tool은 WAV. 파일을 읽고, 가장 큰 데시벨을 기준으로 지정한 데시벨에 대해 상대적으로 소리의 크기를 조절하여 파일을 작성하는 방법으로 구현하였습니다.
- 전체 스크립트가 아닌 핵심 일부 부분만 간단히 다루겠습니다.
private float GetMaxDB()
{
if (mAudioClip == null)
{
return 0f;
}
float[] samples = new float[mAudioClip.samples * mAudioClip.channels];
mAudioClip.GetData(samples, 0);
// Find the highest decibel value
mMaxDb = -Mathf.Infinity;
for (int i = 0; i < samples.Length; i++)
{
float sample = Mathf.Abs(samples[i]);
float db = 20.0f * Mathf.Log10(sample);
if (db > mMaxDb)
{
mMaxDb = db;
}
}
return mMaxDb;
}
- WAV 파일 중 모든 채널에 대하여 가장 큰 데시벨을 리턴하여 저장합니다.
- 이 값은 다음으로 설정할 데시벨의 상대적으로 데시벨을 올리거나, 내리는것에 대한 계산할 수 있도록 합니다.
private (float[], int, int) ProcessAndExport()
{
int sampleRate = mAudioClip.frequency;
int channels = mAudioClip.channels; // Get the channel count from the original WAV file
float[] samples = new float[mAudioClip.samples * channels];
mAudioClip.GetData(samples, 0);
// Calculate the multiplier to adjust the decibel value
float dbDifference = (-mTargetDb) - mMaxDb;
float multiplier = Mathf.Pow(10.0f, dbDifference / 20.0f);
// Adjust the decibel value by multiplying the multiplier to all samples
for (int i = 0; i < samples.Length; i++)
{
samples[i] *= multiplier;
}
// Export as WAV format
return (samples, channels, sampleRate);
}
- mTargetDb(설정할 데시벨)에 대하여 상대적으로 dbDifference를 구하여 설정할 데시벨로 계산한 후 샘플, 채널, 샘플레이트 값을 리턴합니다.
private void SaveWav(string path, float[] samples, int channels, int sampleRate)
{
using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create)))
{
// Write the WAV header
writer.Write(new char[4] { 'R', 'I', 'F', 'F' });
writer.Write(36 + samples.Length * 2);
writer.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' });
writer.Write(16);
writer.Write((ushort)1);
writer.Write((ushort)channels);
writer.Write(sampleRate);
writer.Write(sampleRate * 2 * channels);
writer.Write((ushort)(2 * channels));
writer.Write((ushort)16);
writer.Write(new char[4] { 'd', 'a', 't', 'a' });
writer.Write(samples.Length * 2);
// Write WAV data
foreach (float sample in samples)
{
writer.Write((short)(sample * 32767.0f));
}
}
}
- 샘플, 채널, 샘플레이트를 이용하여 실제 파일로 작성하는 코드입니다.
- 바이너리라이터에서 WAV 포맷에 대한 헤더를 작성한 후 샘플을 작성하여 파일을 생성합니다.
✅ 사용 방법
- 위 Github 페이지에서 다운로드 받을 수 있습니다.
- 또는 아래 첨부파일에서 unitypackage를 다운로드 받아서 사용할 수 있습니다.
- Tools/Bonnate/WAV Easy Volume Editor을 선택합니다.
- 창이 열린 상태에서 Project 창에서 WAV. 파일을 선택합니다.
- Target Decibel 입력란에 설정할 데시벨을 입력합니다.
- 입력된 데시벨이 이 WAV. 파일에서 가장 큰 데시벨로 설정됩니다.
- 데시벨 입력 란 우측의 파란색 듣기 버튼을 누르면 현재 설정된 데시벨의 소리 크기로 소리르 들어볼 수 있습니다.
- 예시로, 데시벨을 -9로 설정한 후 Process and Replace 버튼을 누르면 현재 선택된 파일이 수정되며 inspector에서 파형의 변화가 나타난것을 볼 수 있습니다.
- _Backup 폴더 안에 수정 전 원본 파일이 저장되어 원본 파일 누락에 대한 위험을 보호할 수 있습니다.
🕹️ Unity Affiliate
- Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.
- 아래 배너의 에셋들은 '실시간 무료 에셋 랭킹'을 나타냅니다.
'unity tools & functions' 카테고리의 다른 글
.OBJ 파일을 쉽게 수정하는 Tool (MeshWiz 1.0) (0) | 2023.09.22 |
---|---|
[유니티] Edit 모드에서 물리를 이용해 오브젝트 배치 (0) | 2023.09.17 |
[유니티] 에셋의 이름을 편리하게 변경 (0) | 2023.09.15 |
[유니티] 중복 Enum ID 업데이트 툴 (0) | 2023.07.12 |
[유니티] 엑셀(excel) 파일 읽기, json으로 변환하여 사용 (0) | 2023.07.03 |