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)

이 글도 확인해 보세요:  Vite로 React 앱을 설정하는 방법

⭐ 사용자가 볼륨을 더 부드럽게 만들기 위해 함수에 전달했는지 확인합니다. 그렇다면 해당 인덱스에서 샘플 값을 가져와 대신 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) 

이 글도 확인해 보세요:  React Native에서 Flexbox를 사용하는 방법

⭐ 사운드의 반대쪽 끝에서 새 사운드의 현재 인덱스까지 샘플 값을 복사합니다:

 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)

이 글도 확인해 보세요:  Rust의 제네릭 형식 알아보기

⭐ 탐색() 함수를 사용하여 사운드를 탐색합니다:

 explore(joinedSound) 

⭐ 프로그래밍 영역과 명령줄 사이에 있는 프로그램 로드 버튼을 클릭합니다. 메시지가 표시되면 파일을 저장합니다.

⭐ 명령줄을 사용하여 함수 실행:

 joinSounds() 

⭐ 새 창을 사용하여 결합된 사운드를 확인하고 전체 사운드 재생 버튼을 클릭하여 사운드를 들어보세요:

JES를 사용하여 사운드 파일 가져오기 및 편집하기

이제 사운드 파일을 가져오고 JES를 사용하여 편집하는 방법을 이해했습니다. JES에는 훨씬 더 고급 사운드 편집을 할 수 있는 다양한 내장 기능이 있습니다.

JES 도움말 창을 사용하여 사용 가능한 다른 기능에 대해 자세히 알아볼 수 있습니다.

By 이지원

상상력이 풍부한 웹 디자이너이자 안드로이드 앱 마니아인 이지원님은 예술적 감각과 기술적 노하우가 독특하게 조화를 이루고 있습니다. 모바일 기술의 방대한 잠재력을 끊임없이 탐구하고, 최적화된 사용자 중심 경험을 제공하기 위해 최선을 다하고 있습니다. 창의적인 비전과 뛰어난 디자인 역량을 바탕으로 All Things N의 잠재 독자가 공감할 수 있는 매력적인 콘텐츠를 제작합니다.