반응형


이전부터
어떻게 하면 사용자들이 쉽게 연주를 할 수 있을것인가에 대해 생각해왔다.
음악을 만든다는것은 어찌보면 쉬울수도 어찌보면 어려울 수도 있기 때문이다.

쉽다고 생각하게 된것은,
기존 기성가요의 경우 일정한 코드패턴을 반복시켜주며 진행되는 연주가 대부분이고,
드럼 룹, 베이스 등등 다 일정한 코드패턴하에 진행된다.

어렵다고 생각하는것은
이러한 코드패턴을 사용자들이 쉽게 알 수 없다는 것이고,
따라하기 정도는 되지만,
창조의 영역의 들어서기에는 많은 시간을 투자하여야 한다는 점에 있다.

그리하여, 뮤직쉐이크처럼 미리 코드와 패턴을 제공해 주고
자동으로 퀀타이징 되는 방식이 적당하다 생각한다.

이러한 방식을 아이폰과 같은 휴대용 장치로 올려준다면 어떨까 라는
생각에서 위 리모트를 이용하여 장소에 구애받지않는
Low-cost Instrument를 생각하게 되었다.
아직은 100%완성이 되지않아
미완으로 남아버리긴 하여 아쉽기도 하지만,
아직 끝난건 아니니깐..

다음 소개할 기사는 아이폰을 이용해서 오케스트라 연주를 하였다는 기사이다.
내가 추구하는 방향과 잘 맞는것 같아 스크랩 해왔다.

"이제 악기는 더이상 장소나, 특정악기에 한 음으로 한정되어서는 안된다.
그리고 새로운 연주방식을 도입하여야 할것이며
단순하고 쉬워야 한다."

이것이 내가 생각하는 미래의 악기다.
어렵지 않다 생각한다.

꼭 완성해 봐야지!!^^ 
-TA2K-
다음글은 엘리스온(http://aliceon.net) 에서 가져왔답니다.
%%
Technology: Stanford's iPhone Orchestra



시쳇말로 요즘 대세(?)인 아이폰 이야기 입니다.
스마트폰이 국내 핸드폰 판매 1위를 차지 하다니요. 여러가지 시사하는 점이 있겠지만 통신사들이나 모바일 콘텐츠 제작에 있어서 여러가지 긍정적인 효과를 주고 있다는 점은 부정할 수 없는 사실이겠지요.

그 아이폰을 이용한 연주가 있어서 소개합니다. 스텐포드의 아이폰 오케스트라 라고 하네요.



조금 우습게 보이기도 하지만 모두들 진지하게 임하는 모습이 그럴듯 하지요?
아이폰이 다른 '핸드폰'과 다른것은
이러한 아이폰의 개방성을 활용한 다양한 시도가 가능하다는 것이겠지요.

(물론, 애플의 패쇄성을 모른다는 이야기는 아니죠. 더하면 더했지 절대 오픈되어 있는 곳은 아니지요 ^_^)



하지만 흥미로운건 이렇게 유저 스스로가 무언가를 만들어 간다는 구조입니다.
아마도 아이폰 열풍의 바탕에는 이러한 '패쇄적 개방성'이 사용자의 충성도를 높인다는 점이 있지 않나 싶네요.



아무리 아이폰 아이폰 해도 결국 기계일 뿐입니다. 결국 어떤 사람이 어떻게 활용하냐에 따라서 꼭 필요한 물건이 될 수도, 24개월 할부의 시계가 될 수도 있겠지요. 앞으로 다양한 곳에서 활용되는 아이폰의 진화(!)를 기대해 봅니다. ^_^
반응형
반응형

예전부터 관심이 많았던 부분이였던 복잡성 (complexity)

매체의 홍수는 곧 정보의 범람으로 이어지고 있는 현재상황에 대하여

나는 어떠한 시선으로 이것을 바라보아야 하고,
또한 어떻게 방법을 제시할수 있을까 라는 고민에 사로잡혀 있었다.

그러던 도중 복잡계 개론이라는 책을 접하게 되었고,

이것을 한 장씩 정독해 보려한다.

이곳에 글을 쓰는 이유는 
책을 다 읽고 시간이 지난후
나의 생각이 어떠했으며, 어떻게 이것을 흡수하고 인지하였는지 궁금해하는 
내 스스로의 호기심에서 시작하는 것이다. 

그럼 시작해보자^0^


우선 책을 보자마자 표지에서 부터
프로세싱으로 코딩하여 만들어 보았던 랜덤한 원들의 조합으로 이뤄진 표지가 눈에 들어왔다.


우선 복잡한이란 말뜻의 의미부터 알고 가야할것같다.

우리가 알고있는것과 다소 차이가 있을수 있기때문

Complex vs Complicated
의 차이에서 혼돈이 올수 있을것 같다.
저자는 이곳에서 스웨터를 예로들어 '복잡한' 것을 설명한다.

즉 함께 엮임으로 해서 혼란스러워 보이지만 나름의 질서정연한 상황이 있는것을
복잡성 이라고 하고 있다.

그에 반해  Complicated는 뒤죽박죽 질서가 없어 복잡함을 뜻하는 말이다.

그러며 저자는


그럼 현상의 다이내믹스가 복잡해지는 이유는 무엇일까?
첫째, 현상에 관여하는 개체의 종류와 수가 많다는 점
(자동차 산업- 포디즘(Fordism-컨베이어 시스템)에서 도요타의 메스 커스터마이제이션(Mass Custumization)
=>다양한 고객만족이 시장서 살아남는 생존의 키워드가 되었다)

둘째, 현상에 관여하는 개체들 각각의 행동을 지배하는 법칙을 잘 알지 못한다는 점
(영화산업 마케팅-  영화흥행의 가장중요한 요소로 시나리오와 배급규모 및 시기 를 들고 있다는것, 흥행보증 수표 배우라 해도 실패할 가능성이 높다는 점)

셋째, 현상에 관여하는 개체들이 서로 다양한 영향을 주고받으며 적응해 간다는 점이다.
(자동차회사- 자동차의 부품들을 생산하는것은 자동차 회사가 아닌 협력업체로 부터 납품을 받아온 것이다.)

그렇다면 복잡한 현상에 어떻게 접근해야 할것인가에 질문에 친절히 답해주었다.
그러며 복잡함 속에 질서가 있다 는 멋진 말을 해준다.
(안해줬으면 힘들었을듯...ㅡ.ㅡ)

그러면서 복잡한 현상의 규칙성의 예로 거듭제곱법칙을 이야기 한다.

리히터와 구텐베르크 법칙이 있다.
이것은 지진의 에너지가 10배가 될 떄마다 그 발생빈도는 1/10로 줄어든다는 사실을 발혀낸 법칙이다.

이것에 로그를 취해 주면 거듭제곱의 법칙에 따르고 있는 그래프가 쨔잔 하고 완성되게 된다.
즉 아무런 법칙이 없을것 같던 지진에도 이러한 법칙이 있었다는 것이다.

 이 뿐 아니라 상위 20%고객이 매출의 80%를 창출한다는 80:20법칙도, 면화이 가격변동 분포도(가장오래된 거래기록이 남아있는것이 면화라네요), 한국과 일본의 도시분포도등등등등등~~~ 적용된다고 합니다.


다음으로는 복잡계와 복잡성이 무엇인지 알아보도록 하자.
여기에 '창발'이라는 단어가 등장한다.
(영어로는 emergence이다.)
복잡계는 수많은 구성요소들로 이루어져 있고, 이들 구성요소들은 독립적으로 존재하는것이 아니라 다양한 인터렉션을 이루고 있다. 그결과 구성요소를 따로따로 놓고 봤을떄 특성과는 사뭇 다른 거시적인 새로운 현상과 질서가 나타난다. 이 새로운 질서의 출현을 창발이라고 하며, 이로인해 나타나는 질서적인 현상을 창발현상이라고 한단다.
(길지만 이해하셨는지...)

그리하여 창발이 일어날때 비로소 복잡계(Complex System)라고 할 수 있다.
창발의 예로 월드컵에서 보여준 빨간색의 표상이다. 월드컵응원때 모두들 빨간색을 중심으로 응원하고 나고 보니
붉은색의 대한 이년적 편견까지 극복할 정도의 새로운 질서가 출현하게 됬다. 이것을 창발이라고 한다.

복잡계는
첫째, 상호작용하는 많은 구성요소를 가지고있고
둘째, 복잡계 구성요소들의 상호작용은 흔히 비선형 적이다.
(극히 작은 요동도 구성요소들 사이를 전파해 나가며 증폭되 커다란 영향을 미칠수 있다)
셋째, 복잡계 구성요소들의 상호작용은 흔히 되먹임고리(Feedback loop)를 형성하게 된다.
넷째, 복잡계는 열린시스템이며 그 경계가 불분명 하다.
다섯째, 복잡계 구성요소는 또 다른 복잡계이며 종종 끊임없이 적용해 나간다.

복잡계를 축척증가에 다른 복잡성의 감소와 창발로 본 그래프가 있다.
(생략)

복잡성의 감소=질서출현
창발이 일어난다는 것이다.

이로써 1장의 내용이끝난다.
반응형
반응형


설명은 다음에요^^;
바빠서.ㅡㅠ
반응형
반응형
다음은 MaxLink에 대한 설명

1. 다운로드 받은 후 요래 작업을 해주어야 함

:: MaxLink 0.34 installation instructions for Windows XP ::

:: For Processing ::

   Drag the "Library-MaxLink" folder into your Processing examples folder
      (C:\Program Files\processing-xxxx\examples\).
       
   Drag the "maxlink" folder into your Processing libraries folder
      (C:\Program Files\processing-xxxx\libraries\).


:: For Max/MSP 4.5+ ::

   Drag the "jk" folder into the C:\Program Files\Common Files\Cycling '74\java\classes folder.
       
   Drag the "p5-sketches" folder into the C:\Program Files\Common Files\Cycling '74\ folder.   
               
   Add the line

      max.dynamic.jar.dir "C:\Program Files\Common Files\Cycling '74\p5-sketches"

      to your max.java.config.txt file (in C:\Program Files\Common Files\Cycling '74\java\).

max.dynamic.jar.dir "/Library/Application Support/Cycling '74/p5-sketches"

->이렇게 해줌됨!!


Restart both apps. 

If you have a firewall running, enable network traffic on port 7474.

Check out the Processing examples from File:Sketchbook:Examples:Library-MaxLink.  Corresponding Max patches can be found in the "example max patches" folder.

It is no longer necessary to copy files into each sketch's code folder -- just add the library from the Processing application from Sketch:Import Library:maxlink.


More info: http://jklabs.net/maxlink/

2. 테스트



그림을 보면
mxj jk link color_sketch 3 0   ->max/map부분

MaxLink link = new MaxLink(this,"color_sktch"); ->processing 부분

느낌오지~예?
다 주는데로 퍼먹는것보다 생각한번 해보는것도 좋지예~?

반응형
반응형

Future works로 남겨두었던 여러 부분들이 해결되었따~

핸드북이 없어서 해결하지 못했던 부분들이였는데,

힌트를 얻고 해결~!!

화재쪽두 어느정도 틀이 있는데,
시간이 없어서 투자를 할수가 없네.

자세한 공식은 나중에 업댓하죠~
반응형
반응형


초두의 관심사였던 Vst연동!!!!!

의외로 쉬웠당.
그림은 MAX/MSP와 내가 좋아하는 EP 연결한 모습


핵심은

vst~패쳐

이곳에 plug Msg박스를 연동해주면 되는거 였음.


이곳에서 몇가지만 들여다 보자

The vst~ object loads a real-time VST plug-in and uses its audio processing in MSP. Some plug-ins have their own editing window, which is visible when you double-click on the object. Otherwise, double-clicking on the object displays a default parameter editing window. The number of signal inputs and outputs default to 2, but the number required by the plug-in may be less than that. If you want to specify a larger number of inputs and outputs, you can supply them as optional arguments

-MIDIEVENT-
note: the midievent message produces an error until the audio is turned on for the first time


아웃렛을 한번 살펴보죠




이거는 인렛


뭐를 이렇게 많이 인풋할수있는지...ㅡ.ㅡㅋ

반응형
반응형
Processing 라이브러리

Tween
Description
This class creates a basic tween, which automatically tracks a number from 0 to 1 over time. A Tweened number can be used within Processing to control an animation between two states. A Tween is given a time duration in seconds or frames, and optionally an easing function.
Example
import megamu.shapetween.*;

Tween ani;
void setup(){
  ani = new Tween(this, 2, Tween.SECONDS, Shaper.COSINE);
}

void draw(){
  background(255);
  ellipse(ani.time()*width, ani.position()*height, 4, 4);
}
Constructor
중뷁정의 보세염~!
Tween( parent, duration )
Tween( parent, duration, durationType )
Tween( parent, duration, durationType, easing )
Parameters
parent
PApplet: typically use "this"
duration
float: tween duration in seconds unless you've set durationType to FRAMES
durationType
boolean: Tween.SECONDS or Tween.FRAMES (smoother)
easing
Shaper function used for animation easing. See setEasing() for details.
Methods
time()
Returns the current time
position()
Returns the current shaped position
isTweening()
Returns true if the tween is playing
start()
Begins a tween from 0
end()
Forces the end of the tween, setting time to 1
pause()
Haults playing
resume()
Resumes playing
reverse()
Causes the tween to reverse direction
seek()
Seeks to a specific time
setDuration()
Sets the duration of this tween
setEasing()
Sets the current easing shape function
setEasingMode()
Sets the current easing mode, such as ease in or ease out
noEasing()
Removes any easing shape function
setPlayMode()
Sets the play mode
repeat()
Causes the tween to repeat playing after it ends
noRepeat()
Turns off repeating for a tween
getEasing()
Returns the current easing shape function
playCount()
Returns the number of plays since start if set to repeat
speed()
Returns the relative speed of this Tween
force()
Returns the relative force of this Tween
tick()
Advances the tween one step, advanced use
Public Variables
timeScale
Modifys the speed at which all tweens move
Related
Shaper

반응형
반응형

공부한거 까먹을까봐 내가 그냥 이해하기 쉽게만 정리해놓았음



import megamu.shapetween.*;
import oscP5.*;
import netP5.*;
import processing.opengl.*;

import foetus.*;
import processing.core.*;
import processing.core.PApplet.RegisteredMethods;

import java.util.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;

// Messages:
// "/Gradient/TopColor" iii
// "/Gradient/BottomColor" iii

public Foetus f;

FoetusParameter m_TopR;
FoetusParameter m_TopG;
FoetusParameter m_TopB;
FoetusParameter m_BotR;
FoetusParameter m_BotG;
FoetusParameter m_BotB;
 //파라미터 형식   (파라미터, value, 주소, 태그)
void setup()
{
  // When run as a synth, setup() is never called!->신스돌때 셋업 함수 절대 호출안되염!
  // put the necessary initialization code in a method named initializeFoetus().->그니깐 초기화 코드 가능하면 이니셜라이즈풰투스에 하셈
  // The necessary Processing initialization calls are called by Mother, and so should be left out from
  // initializeFoetus(). ->프로세싱 초기화는 머더에 의해 불려진뎅.
  // Finally, for the synth to work as a processing sketch within the PDE, call initializeFoetus() from within
  // setup().
->신스가 일하게 하기위해선 이니셜라이즈페투스를 셋업서 포함하여 호출해야함

  size(400, 300, OPENGL);
  frameRate(24);

  initializeFoetus();
//->바로 여기서!
}

void initializeFoetus()
{
  noStroke();

  // Instantiate foetus object here
  f = new Foetus(this);
//이걸 전화기라고 생각하련다

  // Register messages that synth responds to (see OSC documentation)
  // This is here done automatically by the FoetusParameter constructors.

  m_TopR = new FoetusParameter(f, 1.0, "/TopRed",  "f");
  m_TopG = new FoetusParameter(f, 0, "/TopGreen",  "f");
  m_TopB = new FoetusParameter(f, 0, "/TopBlue",        "f");
  m_BotR = new FoetusParameter(f, 0, "/BotRed",  "f");
  m_BotG = new FoetusParameter(f, 0, "/BotGreen",  "f");
  m_BotB = new FoetusParameter(f, 0, "/BotBlue",  "f");
//각각의 알쥐비를 가져다줄 전화기들
}

void draw()
{
  pushMatrix();
  
  beginShape(QUADS);
   
  fill(m_TopR.getValue()*255, m_TopG.getValue()*255, m_TopB.getValue()*255);
//각각의 값을 가져와 *255를 해주면 색깔로 표현이 되겠지여~
  vertex(0, 0);
  vertex(width - 1, 0);
  
  fill(m_BotR.getValue()*255, m_BotG.getValue()*255, m_BotB.getValue()*255);
  vertex(width - 1, height - 1);
//원래 가로세로 길이에서 -1만큼 작게 네모를 그리넹~>
  vertex(0, height - 1);

  endShape();
   
  popMatrix();
}

/**
 * This method is called when an OSC message is received by the synth.
 */
//리씨브 받는곳
void oscEvent(OscMessage theOscMessage)
{
//주소확인
  if (theOscMessage.checkAddrPattern("/TopRed") == true)
  {
    /* check if the typetag is the right one. */
//태그가 이게 맞으면 일을하셈
    if (theOscMessage.checkTypetag("f"))
    {
      m_TopR.setValue(theOscMessage.get(0).floatValue());
      return;
    }
  }
  else if (theOscMessage.checkAddrPattern("/TopGreen") == true)
  {
    /* check if the typetag is the right one. */
    if (theOscMessage.checkTypetag("f"))
    {
      m_TopG.setValue(theOscMessage.get(0).floatValue());
      return;
    }
  }
  else if (theOscMessage.checkAddrPattern("/TopBlue") == true)
  {
    /* check if the typetag is the right one. */
    if (theOscMessage.checkTypetag("f"))
    {
      m_TopB.setValue(theOscMessage.get(0).floatValue());
      return;
    }
  }
  else if (theOscMessage.checkAddrPattern("/BotRed") == true)
  {
    /* check if the typetag is the right one. */
    if (theOscMessage.checkTypetag("f"))
    {
      m_BotR.setValue(theOscMessage.get(0).floatValue());
      return;
    }
  }
  else if (theOscMessage.checkAddrPattern("/BotGreen") == true)
  {
    /* check if the typetag is the right one. */
    if (theOscMessage.checkTypetag("f"))
    {
      m_BotG.setValue(theOscMessage.get(0).floatValue());
      return;
    }
  }
  else if (theOscMessage.checkAddrPattern("/BotBlue") == true)
  {
    /* check if the typetag is the right one. */
    if (theOscMessage.checkTypetag("f"))
    {
      m_BotB.setValue(theOscMessage.get(0).floatValue());
      return;
    }
  }
}

반응형

+ Recent posts