책 Livewired, 골전도 헤드폰과 감각 증강

#reading #tech #diy

최근 책 Livewired를 읽었습니다. 뇌과학의 최신 연구를 기반으로 다양한 사례들을 소개시켜주는데 두뇌의 유연성, 강력함을 확인할 수 있습니다. 자연이 빚어낸 두뇌라는 소프트웨어는 다양한 환경 변화에 적응할 수 있습니다. 저자는 우리 두뇌와 신체의 관계를 포테이토헤드 에 빗대어 표현하는데 컴퓨터의 플러그앤플레이 장치처럼 우리의 감각기관과 운동기관을 자유롭게 추가하거나 제거하는 모델입니다. 포테이토헤드를 보면 감자로 된 머리에 얼굴의 각 부분과 팔 다리 등을 자유롭게 배치할 수 있습니다. 마찬가지로 자연은 영리한 전략을 택했는데 두뇌라는 유연한 소프트웨어를 장착시킴으로써 혹시 모를 다양한 상황에서도 생존을 추구할 수 있도록 했습니다. 예를 들어 후천적으로 시각 혹은 쳥력을 잃거나 다리 혹은 손을 못 쓰게 되는 경우에도 두뇌는 남은 자원에 집중하여 살아남는데 집중합니다. 태어날 때부터 앞다리를 사용하지 못하는 개는 두 다리로 걷는 법을 익히고 눈이 멀게된 사람은 소리로 세상을 보는 법을 익힙니다. 뜻하지 않은 변화는 돌연변이에서도 발생합니다. 돌연변이로 팔이 하나 더 생기거나 어떤 결함 혹은 의도치 않은 변화가 있어도 두뇌는 주어진 상황에서 최대한 적응하려고 노력합니다.

예전 첫 직장에서 웨어러블 장치를 접하고 연구할 기회가 있었는데 그때 구글 글래스를 처음 사용해 봤습니다. 구글에서도 사업을 접을만큼 대중적이지 않고 실패한 프로젝트였지만 당시 저는 그 개념에 매료되었습니다. 증강현실 Augmented Reality (요샌 혼합현실 Mixed Reality라고도 부르는 것 같네요) 은 현실에 하나의 레이어를 추가하여 사용자에게 현실 이상의 정보를 전달하는 것이었습니다. 구글 글래스의 경우 네모난 프리즘 같은 창에 사진을 보여주거나 메시지를 보여주는 것 등이 전부였지만 기술로 인간의 현실을 증강한다는 개념은 그때나 지금이나 크게 다르지 않습니다. 기술이 인간의 능력을 향상시키는 것은 미래의 일이 아닙니다. 신체를 다른 보조물로 대체하거나 신체에 또 다른 부가장치를 더해 인간 능력을 향상시키는 사이보그는 이미 우리 곁에 있습니다. 아니 우리 자신입니다. 몰리적으로 신체에 덧붙여두진 않았지만 우리 곁엔 스마트폰이 있습니다. 그리고 아마 스마트폰을 가진 대부분의 사람들은 스마트폰을 곁에 두고 그것도 살아가는 대부분의 시간동안 곁에서 떨어지지 않게 둡니다. 이 스마트폰은 거의 신체의 일부나 다름없습니다. 스마트폰은 나와 세계를 연결하는 통로가 되며 끝없는 지식으로의 접근 창구가 됩니다.

Livewired에서 감각을 다루는 부분도 흥미로운데 두뇌는 우리의 감각이 어디에서 어떤 장치에서 오는지 신경쓰지 않습니다. 다만 입력되는 신호로부터 패턴을 찾고 그 패턴을 이용할 방법을 찾는데 몰두합니다. 여기서 감각 증강 혹은 감각 대체가 가능한데 그 중 감각 증강은 인간이 느끼지 못하는 감각 채널을 추가하는 걸 말합니다. 이를테면 인간이 느끼지 못하는 적외선, 자외선 영역의 빛을 감지하는 센서를 이용하여 주변을 감각하고 그 감각신호를 피부에 붙인 돌기의 움직임으로 표현하면 이제 우린 더 넓은 스펙트럼의 빛을 감지하는 존재가 되는 겁니다. 앞선 글 중에서 Multi-sensory Programming 이란 주제를 다룬 일이 있습니다. 책 “일의감각” 에서 전문가가 작업물을 다룰 때 다양한 감각을 이용한다는 걸 보고 저 역시 그렇게 해보고 싶었던 것이죠. 이번엔 좀 더 일차적인 신호로 Multi-sensory Programing 프로젝트를 진행해봤습니다.

소프트웨어 엔지니어는 대부분의 작업을 코드를 편집하는 텍스트 에디터에서 진행합니다. 이 곳에서 작업물을 감지하는 감각을 추가하려고 합니다. 어떤 신호들이 있을까 고민하다가 두가지를 생각했습니다. 첫번째는 현재 작업 중인 문서의 총 라인 수 입니다. 어떤 문서는 전체 길이가 짧고 또 다른 문서는 전체 길이가 눈에 띄게 길 수도 있습니다. 두번째 신호는 전체 문서 중 현재 라인의 상대적인 위치입니다. 커서가 처음에 있는지 마지막에 있는지 중간에 있는지 등을 알려주는 것입니다. 이 신호들은 기존의 감각을 해치지 않은 채 사용자에게 전달되어야 합니다. 텍스트 에디터를 통해 작업할 때 대부분의 신호는 시각 신호입니다. 내용을 보고 키보드를 두들려 변화를 만들죠. 이때 추가로 이용할 수 있는 감각 채널은 청각 촉각 후각 등이 있는데 저는 청각을 택했습니다. Livewired에서는 촉각 채널이 추가로 이용하기 좋은 감각 채널이라 이야기했지만 촉각 채널을 이용하기 위해선 액추에이터를 활용한 추가 장치를 직접 만들어야 하는 번거로움이 있습니다.

텍스트 에디터로 저는 이맥스 Emacs를 사용하고 있는데 Emacs Lisp 이란 언어를 이용하여 에디터의 기능을 수정하거나 확장할 수 있습니다. 딱 저의 프로젝트에 적합한 에디터지요. 그리고 골전도 헤드폰을 하나 준비했습니다. 일하면서 사용하고 싶은데 귀를 막아버리면 주변 환경의 소리를 놓치고 동료와의 대화도 어려워 집니다. 골전도 헤드폰을 사용하면 주변 소리와 함께 프로그래밍 감각 신호를 같이 감지할 수 있습니다.

이제 작업을 시작해볼까요? 먼저 소리를 만들 방법을 찾아봅시다. Musical Programing을 위한 도구들이 있는데 SuperCollider, Sonic Pi 등이 있습니다. 하지만 이들 도구들을 사용하기 복잡하고 지금 프로젝트에 사용하기엔 기능이 과한 것 같아 단순히 커맨드라인에서 실행할 수 있는 대체재를 찾았습니다. 아래 명령을 사용하면 특정 주파수의 소리를 원하는 길이로 재생할 수 있습니다.

$ ffplay -f lavfi -i "sine=frequency=$1:duration=$2" -autoexit -nodisp 2>/dev/null

이제 텍스트 에디터의 기능을 확장해봅시다. 이맥스에서는 편집 창을 버퍼라는 이름으로 부릅니다. 편집 중인 버퍼가 바뀐 경우, 현재 버퍼의 총 라인 수를 셈하여 소리를 발생시킵니다. 주파수를 정하는 공식은 그냥 경험적으로 대강 정했습니다. 총 라인 수 소리는 0.5초 동안 발생시킵니다. 이어서 현재 커서의 위치를 나타내는 소리를 추가시켜 봅시다. 다행히 이맥스에서 적당한 Hook이 있었는데 사용자가 입력을 멈추고 Idle 상태가 특정 시간 지속되는 경우 발생하는 이벤트를 감지하여 훅을 실행해줍니다. 저는 1초로 설정하여 사용자가 입력을 멈추고 1초가 지나면 현재 커서의 위치를 소리로 표현합니다. 마지막 라인에 있다면 1000Hz의 소리를 발생시키고 처음 위치라면 300Hz 소리를 발생시킵니다. 그리고 이땐 0.1초의 지속시간으로 소리를 발생시켜 총 라인 수 소리와 구분할 수 있게 합니다.

(defun generate-tone (frequency duration)
  (start-process "generate-tone" "*Messages*"
                 "~/Bin/generate-tone.sh"
                 (number-to-string (+ 300 frequency))
                 (number-to-string duration)))

(defun generate-total-lines-tone()
  (let ((lines (count-lines (point-min) (point-max))))
    (when (> lines 10)
      (generate-tone lines 0.5))))

(defun generate-current-line-tone()
  (let* ((lines (count-lines (point-min) (point-max)))
         (current-line-number (line-number-at-pos))
         (freq (+ 100 (* 900 (/ (float current-line-number) lines)))))
    ;(message (number-to-string freq))
    (generate-tone freq 0.1)))

(add-hook 'window-selection-change-functions (lambda (frame) (generate-total-lines-tone)))
(add-hook 'window-buffer-change-functions (lambda (frame) (generate-total-lines-tone)))

(defvar last-timer-function-position 0)
(make-variable-buffer-local 'last-timer-function-position)

(defun current-line-changed()
  (unless (equal (line-number-at-pos) last-timer-function-position)
    (generate-current-line-tone))
  (setq last-timer-function-position (line-number-at-pos)))

(run-with-idle-timer 1 1 'current-line-changed)

자, 이것으로 새로운 감각 신호와 함께 프로그래밍을 할 수 있습니다. 현재 편집 중인 파일이 얼마나 큰 규모인지 느낄 수 있고 나의 커서가 전체 문서 중 어떤 위치에 있는지 감각할 수 있습니다. 하지만 하나 간과하기 쉬운 부분이 있습니다. 이런 새로운 감각이 유용하고 의미있게 활용되려면 절실함이 필요합니다. 두뇌는 중요하지 않은 신호는 무시하도록 설계되었기 때문에 의미를 담지 않은 신호는 그저 잡음에 불과합니다. 눈이 먼 사람은 왜 청각 신호와 촉각 신호가 예민해지는 걸까요? 그만큼 그 신호가 생존에 중요해지기 때문입니다. 과연 이번에 추가한 청각 신호, 작업물에 대한 힌트 Cue 가 도움이 될까요? 그건 지켜볼 일입니다.