JES는 이미지, 사운드 및 비디오를 프로그래밍 방식으로 수정할 수 있는 프로그램입니다. JES에는 Jython 언어를 배우는 데 도움이 되는 많은 내장 기능과 디버깅 도구가 있습니다.
JES를 사용하여 파일을 가져오면 별도의 창을 통해 해당 파일의 음파를 시각적으로 확인할 수 있습니다. 또한 특정 지점에서 이러한 음파의 진폭 값을 조작할 수도 있습니다. 이를 통해 사운드 파일을 편집하여 다양한 효과를 얻을 수 있습니다.
사운드 클립의 볼륨을 변경하는 방법
JES에서 이미지를 렌더링할 때 이미지에 포함된 개별 픽셀에 액세스할 수 있습니다. 각 픽셀의 빨강, 녹색, 파랑 색상 값을 편집하여 특정 이미지 처리 기술을 구현할 수 있습니다.
마찬가지로 사운드 파일에는 사운드 데이터의 작은 조각인 개별 “샘플”이 많이 포함되어 있습니다. 각 샘플의 진폭 값을 변경하여 가져온 사운드를 편집할 수 있습니다.
이 프로젝트에 사용된 코드는 MIT 라이선스에 따라 이 GitHub 리포지토리에서 사용할 수 있습니다.
⭐ 컴퓨터에서 JES 애플리케이션을 엽니다.
⭐ 변경하려는 볼륨을 입력으로 받는 changeVolume()이라는 함수를 새로 만듭니다:
def changeVolume(vol):
⭐ 함수 내에서 사용자에게 유효한 사운드 파일을 선택하라는 프롬프트를 엽니다. JES는 mp3 파일과 호환되지 않지만 WAV 파일은 계속 가져올 수 있습니다. 파일이 호환되는지 확인하기 위해 몇 가지 유효성 검사를 추가합니다.
file = pickAFile()
if file != None and file.endswith(".wav"):
# Code for valid file
else:
print("Invalid file selected. Please choose a valid WAV file.")
⭐ 선택한 파일이 유효하면 해당 파일에서 사운드 객체를 생성합니다:
sound = makeSound(file)
⭐ 사운드의 각 샘플을 반복합니다:
for i in range(0, getLength(sound)):
⭐ 사용자가 볼륨을 더 크게 높이는 함수에 들어갔는지 확인합니다. 그렇다면 내장된 getSampleValueAt() 함수를 사용하여 해당 인덱스에서 샘플 값을 가져옵니다. 진폭을 두 배로 늘려 볼륨을 높이고 setSampleValueAt()을 사용하여 새 값을 설정합니다:
if vol == 'up':
sampleVal = getSampleValueAt(sound, i)
setSampleValueAt(sound, i, sampleVal * 2)
⭐ 사용자가 볼륨을 더 부드럽게 만들기 위해 함수에 전달했는지 확인합니다. 그렇다면 해당 인덱스에서 샘플 값을 가져와 대신 2로 나누어 진폭을 줄입니다:
if vol == 'down':
sampleVal = getSampleValueAt(sound, i)
setSampleValueAt(sound, i, sampleVal / 2)
⭐ 탐색() 함수를 사용하여 사운드 탐색기 창을 엽니다:
explore(sound)
⭐ 프로그래밍 영역과 명령줄 사이에 있는 프로그램 로드 버튼을 클릭합니다. 메시지가 표시되면 파일을 저장합니다:
⭐ 명령줄에서 변경 볼륨() 함수를 실행하고, 함수에 “up”을 인수로 전달합니다:
changeVolume("up")
⭐ 파일 탐색기 창을 사용하여 유효한 사운드 파일로 이동합니다:
⭐ 새 창에서 전체 사운드 재생 버튼을 클릭합니다:
⭐ 명령줄에서 “down” 값을 인수로 사용하여 changeVolume()을 다시 실행하고 파일을 선택합니다:
changeVolume("down")
⭐ 탐색기 창에서 음파가 더 작아진 것을 볼 수 있습니다. 새 창에서 전체 사운드 재생 버튼을 클릭합니다:
사운드 클립을 리버스하는 방법
빈 사운드를 새로 만들고 원본 사운드의 각 샘플을 역순으로 새 사운드에 복사하여 사운드를 리버스할 수 있습니다.
⭐ 새 기능에서 사용자에게 WAV 파일을 선택하라는 메시지를 표시하고 파일이 유효한지 확인합니다:
def reverseSound():
file = pickAFile()
if file != None and file.endswith(".wav"):
# Code for valid file
else:
print("Invalid file selected. Please choose a valid WAV file.")
⭐ 선택한 파일에서 새 사운드 개체를 만듭니다:
sound = makeSound(file)
⭐ 내장된 makeEmptySound() 함수를 사용하여 새로운 빈 사운드 객체를 만듭니다. 이것은 원본 사운드와 동일한 수의 샘플로 구성됩니다. 각 샘플의 진폭 값은 0입니다:
newReversedSound = makeEmptySound(getLength(sound))
⭐ 새 빈 사운드 객체의 각 샘플을 반복합니다:
for i in range(0, getLength(newReversedSound)):
⭐ 해당 지점의 각 샘플에 대해 사운드의 반대쪽 끝에서 샘플을 가져옵니다. 예를 들어 샘플 길이가 100이고 현재 인덱스가 0이면 인덱스에서 샘플 값을 가져옵니다. 마찬가지로 현재 인덱스가 3이면 인덱스 96에서 샘플 값을 가져옵니다:
sampleVal = getSampleValueAt(sound, getLength(sound) - 1 - i)
⭐ 사운드의 반대쪽 끝에서 새 사운드의 현재 인덱스까지 샘플 값을 복사합니다:
setSampleValueAt(newReversedSound, i, sampleVal)
⭐ 새 반전된 사운드를 탐색합니다. 비교 목적으로 원본 사운드를 탐색할 수도 있습니다:
explore(sound)
explore(newReversedSound)
⭐ 프로그래밍 영역과 명령줄 사이에 있는 프로그램 로드 버튼을 클릭합니다. 메시지가 표시되면 파일을 저장합니다.
⭐ 명령줄을 사용하여 함수 실행:
reverseSound()
⭐ 탐색기 창을 사용하여 원본 사운드와 반전된 사운드를 확인합니다. 전체 사운드 재생 버튼을 클릭하여 차이점을 들어보세요:
두 사운드 클립을 함께 합치는 방법
두 사운드 클립을 함께 합치려면 사용자에게 두 개의 개별 WAV 파일을 선택하도록 요청할 수 있습니다. 두 사운드의 각 샘플을 새 사운드 개체에 복사합니다.
⭐ joinSounds()라는 새 함수를 만듭니다:
def joinSounds():
⭐ pickAFile() 함수를 사용하여 사용자에게 첫 번째 파일을 선택하라는 메시지를 표시합니다. 유효하지 않은 경우 오류 메시지를 인쇄합니다:
file1 = pickAFile()
if file1 == None or not file1.endswith(".wav"):
print("Invalid file selected. Please choose a valid WAV file.")
⭐ pickAFile() 함수를 다시 사용하여 사용자에게 두 번째 유효한 사운드 파일을 요청합니다:
file2 = pickAFile()
if file2 == None or not file2.endswith(".wav"):
print("Invalid file selected. Please choose a valid WAV file.")
⭐ 선택한 두 개의 사운드 파일에서 두 개의 사운드 객체를 생성합니다:
sound1 = makeSound(file1)
sound2 = makeSound(file2)
⭐ 두 사운드의 길이를 더하여 새로 결합된 사운드의 길이를 계산합니다.
newSoundLength = getLength(sound1) + getLength(sound2)
joinedSound = makeEmptySound(newSoundLength)
⭐ 첫 번째 사운드의 각 샘플을 반복하여 길이를 사용하여 새 빈 사운드 오브젝트를 만듭니다. 각 인덱스의 샘플 값을 새 사운드에 복사합니다:
for i in range(0, getLength(sound1)):
sampleVal = getSampleValueAt(sound1, i)
setSampleValueAt(joinedSound, i, sampleVal)
⭐ 두 번째 사운드의 각 샘플을 반복합니다. 각 인덱스의 샘플 값을 첫 번째 사운드 뒤의 새 사운드에 복사합니다:
for i in range(0, getLength(sound2)):
sampleVal = getSampleValueAt(sound2, i)
endOfFirstSound = getLength(sound1) - 1
setSampleValueAt(joinedSound, endOfFirstSound + i, sampleVal)
⭐ 탐색() 함수를 사용하여 사운드를 탐색합니다:
explore(joinedSound)
⭐ 프로그래밍 영역과 명령줄 사이에 있는 프로그램 로드 버튼을 클릭합니다. 메시지가 표시되면 파일을 저장합니다.
⭐ 명령줄을 사용하여 함수 실행:
joinSounds()
⭐ 새 창을 사용하여 결합된 사운드를 확인하고 전체 사운드 재생 버튼을 클릭하여 사운드를 들어보세요:
JES를 사용하여 사운드 파일 가져오기 및 편집하기
이제 사운드 파일을 가져오고 JES를 사용하여 편집하는 방법을 이해했습니다. JES에는 훨씬 더 고급 사운드 편집을 할 수 있는 다양한 내장 기능이 있습니다.
JES 도움말 창을 사용하여 사용 가능한 다른 기능에 대해 자세히 알아볼 수 있습니다.