Updates from mortp 댓글 스레드 토글 전환 | 키보드 단축키

  • mortp June 7, 2013 1:35 am 퍼머링크 | 응답  

    몰라, giy!

     
  • mortp June 26, 2012 12:15 am 퍼머링크 | 응답  

    아날로그/디지털 혼재회로 

    에 대한 자료들을 찾아둔 것을 공유합니다.

    저도 이것을 찾았을 당시 시간이 촉박해서 잘 읽어보지는 못했지만 도움이 될 듯 합니다.

    885

    디지털혼재회로의설계

     
  • mortp May 14, 2012 1:11 am 퍼머링크 | 응답  

    공지가 늦었습니다.

    5/10 목요일 모임 잘 마쳤습니다.
    시간 : 18:00~21:00
    장소 : 신촌 토즈본점
    참가인원:13명

     
  • mortp May 8, 2012 9:23 pm 퍼머링크 | 응답  

    5/10 모임공지입니다.

    시간 : 18:00 ~ 21:00
    장소 : 신촌 토즈본점(13인 예약)
    장소후원 : 구글코리아

    18:00 ~ 19:30 SC기초실습반
    19:30 ~ 21:00 초심자를 대상으로한, OOP(Object Oriented Programming)의 기본과 개념 – 정승기씨

    + 토스트 12인분

     
  • mortp May 3, 2012 11:53 pm 퍼머링크 | 응답  

    오늘 모임 잘 마쳤습니다 시간 18:30~21:00 장소 신촌… 

    오늘 모임 잘 마쳤습니다.
    시간 : 18:30~21:00
    장소 : 신촌 토즈본점
    참가인원:14명

     
  • mortp May 2, 2012 11:26 am 퍼머링크 | 응답  

    5월 3일 목요일, 모임공지입니다.

    시간 : 18:30~21:30(18:00시가 아니라 18:30 입니다. 장소 사정으로 늦추어 졌으니 확인하세요.)

    장소 : 토즈 신촌본점, (신촌전철역 3번출구로 나와 50m직진)
    http://toz.co.kr/booth/JB_Booth/booth_jb_basicinfo.asp?idx=2

    장소후원 : 구글코리아

    모임내용 :

    • 기초실습반
    • 정식형의 코딩팁에 관한 발표
    • 회의
     
  • mortp April 26, 2012 2:47 pm 퍼머링크 | 응답
    태그: , ,   

    백년만의 글쓰기 

    이병무 선생님 특강때의 두서없는 필기를 공유합니다.

    제대로 알고있지 못했던 것 등, 개인적으로 필요했던 부분만 적어두었습니다.

    특강은 개인적으로 너무 좋았구요.

    그러나, 전혀 정리되어 있지 않으니 섣불리 스크롤하지 마세요!

     

    ================================================

    20120421

    <이병무 선생님 특강>

     

    <array와 list의 차이> : 둘 모두 순서가 중요한 collection

    ~ar = Array.new(3);

    ~ar.add(1); //넣을 수 있는 요소의 수에 제한이 있다

     

    ~ls = List.new;

    ~ls.add(1); //List는 원래 요소의 수에 제한이 없다.

     

    *array를 list처럼 쓰는 방법

    ~ar = ~ar.add(1);

     

    처음부터 갯수를 정해놓을 때에는 .newClear; 를 쓰는 것이 좋다.

     

     

    <반복과 관련된 메소드>

    그 중에 .do

    3.do({“hi”.postln}); //postln은 postln의 ‘receiver를 post 창에 줄바꿔 찍어라’는 명령

    3.do{| idx | idx.postln;}; //0, 1, 2까지 찍어주고, 마지막으로 receiver인 3을 찍는다.

     

     

    <반복을 이용한 소리만들기>

    Server.local.boot;

     

    {SinOsc.ar(440, mul: 0.3)}.play(s);

    {SinOsc.ar(440, mul: 0.3)}.play(Server.local);

    10.do{| idx | {SinOsc.ar(400*(idx+1), mul: 0.03)}.play;};

    [0, 1, 4, 7].do{| i, j | i.postln; j.postln;}; // i는 0, 1, 4, 7. j는 0, 1, 2, 3

     

    FreqScope.new(400, 300);

    s.scope;

     

    <Dictionary>: 순서가 없는 collection

     

    d = {“hi dic”.postln}

    a = Dictionary[\a -> d, \b -> 20];

    a.at(\a).value;

    \a가 숫자일 수도 있지만 거대한 펑션일 수도 있다.

     

     

    IdentityDictionary

    : Environment는 IdentityDictionary의 subclass다.

     

    Event

    : Environment의 subclass다. 소리를 내기 위한 속성들을 지니고 있는 일종의 IdentityDictionary.

    (freq: 1000, amp: 0.5).play; //고로 이것도 dictionary의 속성을 물려받았다.

     

     

    <Server 만들기>

     

    a = Server.new(“jongro”, NetAddr(“127.0.0.1”, 10000)) //port number는 아무거나 써도 좋지만 두 가지는 예약되어 있다.

    server port : 57110

    Server.internal.addr.port; //0

    Server.local.addr.port; //local host 는 주소가 있으나, internal 은 주소가 없다. 외부에서 명령을 주어 소리를 만드는 등의 일은 모두 localhost 서버에서 이루어 져야 한다.

    lang port : 57120

    NetAddr.langPort; //57120. 이것은 재부팅시마다 달라질 수 있다.

     

    Other applications sending messages to SuperCollider should distinguish between sending messages to the server or the language. Server messages are documented in the Server Command Reference and should be sent to the server’s port – s.addr.port – which is 57110 by default. Messages sent to the server will not be processed by any OSCresponder in the language.

    Messages from external clients that should be processed by OSCresponders must be sent to the language port, 57120 by default. Use NetAddr.langPort to confirm which port the SuperCollider language is listening on.

     

    외부에서 sc로 오는 메시지는 그것이 server(scsynth)로 가는 것인지, client(sclang)로 가는 것인지 구분되어야 한다. server로 직접 보내지는 메시지는 57110포트를 통해서, internal 이 아닌 localhost 서버로 보내지며, 이는 Server command 형태가 되어야 한다. 반면 client(sclang)으로 보내지는 메시지는 57120포트를 통해서 보내지며 이 둘(scsynth와 sclang)은 메시지를 주고받는 객체로서는 서로 영향받지 않는다.

     

    OSCresponder

    a.makeWindow; //서버 창을 만든다.

     

     

    *internal 서버에서 p를 누르면 노드의 상태를 보여주는 창이 뜬다.(3.5버전에서 추가된 훌륭한 기능)

    s.queryAllNodes; //같은 역할

     

    <Node>

    g = Group(s); //group 만들기

    r = Group(g); //group 안에 group 만들기

    {SinOsc.ar(mul: 0.5)}.play(target: g); //group g에 synth만들기

    {SinOsc.ar(mul: 0.5)}.play(target: r); //group r에 synth만들기

    nodeId로 synth를 제거하려면, s.sendMsg(\n_free, nodeId);

     

    <Bus>

    {In.ar(8, 1)}.play; // feedback!!!

    하드웨어에 연결된 버스(8 + 8) 이후 번호는 private bus라고 한다.

     

    {SinOsc.ar(mul: 0.5)}.play(s, 100);

    s.scope(2, 100); //number of channes, index

    {In.ar(100, 1) * SinOsc.ar(440, mul: 0.5)}.play(addAction: \addToTail);

    시그널은 head 에서 tail로 흐른다. 따라서 소스가 되는것이 위에, 그것을 받는것이 아래에 깔려야 한다.

     

    이 순서를 맞추기 위해서는,

    1) 실행 순서를 조절하거나,

    2) addAction의 속성을 주거나,

    3) head쪽, tail 쪽 그룹을 만들어 두고 소스는 head쪽 그룹에, 받는 쪽은 tail쪽 그룹에 넣어 생성하는 방법

    등이 있다.

     

     

    (크게보아서)<소리를 내는 두 가지 방법>

    1) 오실레이터 이용

    2) 버퍼에 녹음된 소리를 이용

    *오실레이터 역시 버퍼안에 특정 시그널 주기를 넣어두고 재생하는 것

     

    Buffer.freeAll; //존재하는 모든 버퍼를 free시킨다.

    b = Buffer.alloc(s, s.sampleRate * 4, 1);

    b.read(Platform.resourceDir +/+ “sounds/a11wlk01-44_1.aiff”, action:{|buf| {buf.plot}.defer; buf.play});

    b.plot;

     

    BufRateScale – samplerate converting의 역할

     

    <멀티 채널 셋팅>

    {[SinOsc.ar(300, mul: 0.4), SinOsc.ar(1000, mul: 0.2)]}.play;

    {SinOsc.ar([300, 1000], mul: 0.4)}.play;

    배열의 형태로 간단히 멀티 채널의 셋팅을 달리 할 수 있다.

    ({

    var sig;

    sig = PlayBuf.ar(1, b, BufRateScale.kr(b)*[0.5, -1], loop:1);

    LPF.ar(sig, 500);

    }.play;)

     

    <action, completionMsg>

    action은 function형식으로 써도 되지만, completionMsg는 Msg 형태로 주어야 한다.

    *function형태로 적되, .read 를 .readMsg 로 쓰면, function을 msg 타입으로 알아서 바꾸어 적용해 준다.

     

    a = Buffer.alloc(s, s.sampleRate * 2.0, 1, {| buf | buf.read(Platform.resourceDir +/+ “sounds/a11wlk01-44_1.aiff”)}); //안된다. function

    a = Buffer.alloc(s, s.sampleRate * 2.0, 1, {| buf | buf.readMsg(Platform.resourceDir +/+ “sounds/a11wlk01-44_1.aiff”)}); //된다. msg

    a = Buffer.alloc(s, s.sampleRate * 2.0, 1, [\b_read, a.bufnum, Platform.resourceDir +/+ “sounds/a11wlk01-44_1.aiff”]); //된다. msg

    a.free;

    a.plot;

    Buffer.freeAll

     

     

    <루틴>

    기본적으로 stream을 만들어 준다.

    (

    r = Routine{

     

    “first”.postln;

    1.yield;

     

    “second”.postln;

    2.yield;

     

    “third”.postln;

    3.yield;

     

    }

    )

     

    (

    q = Routine{

     

    “1st”.postln;

    1.yield;

     

    “2nd”.postln;

    2.yield;

     

    “3rd”.postln;

    3.yield;

     

    }

    )

     

     

    r.reset;

    r.next;  //Routine은, .next를 받으면 처음 .yield까지만, 다음 .next를 받으면 다음 yield까지만 일하는 스트림.

    r.play; //.play를 받으면 자동으로 처음부터 끝까지 진행한다. 그러나 .yield, .wait 의 receiver 만큼의 시간동안 중간에서 기다린다.

    *스트림(Stream) : .next를 받았을 때 값을 내보내는 연속적인 오브젝트. 아주 특별한 형태의 배열

     

    r.postln;

    r.asArray.at(1);

     

     

    <클럭(Clock)>

    sc에는 세 가지의 시계가 있다.

    SystemClock, AppClock, TempoClock

     

    SystemClock가 가장 정확하다.

    그러나 GUI에서는 AppClock이 시계로 쓰여야만 한다.

     

    *SystemClock, AppClock은 인스턴스를 만들 수 없다. 따라서 클래스 메소드를 이용해 사용한다.

     

    SystemClock.sched(0.0, {“hi”.postln}); //바로

    SystemClock.sched(2.0, {“hi”.postln}); //2초 후에

     

    (

    SystemClock.sched(0.0, {

    r.play;

    “first routine start”.postln;

    });

     

    SystemClock.sched(2.0, {

    q.play;

    “second routine start”.postln;

    });

    )

     

    r.reset; q.reset; //루틴 reset

     

    TempoClock은 인스턴스를 만들 수 있다.

    ->인스턴스를 만들어야 한다.

    t = TempoClock(2); //2는 1의 두 배 속도

     

    (

    t.sched(0.0, {

    r.play;

    “first routine start”.postln;

    });

     

    t.sched(5.0, {

    q.play;

    “second routine start”.postln;

    });

    )

    r.reset; q.reset;

    *GUI interface는 PD에서, 소리합성은 SC에서 하는 것을 연습해보자.

     
  • mortp February 29, 2012 9:54 pm 퍼머링크 | 응답  

    본의아니게 두 주 연속 슈콜의 허세적인 것에 대해서 얘기하게 됐는데요,
    음 때론 귀여운 허세도 필요하니까요 하하하

    클래스는 생각보다 어려운것도 아니고 거창한 것도 아닌데,
    초반 접근이 생소해서 혹은 너무 프로그래밍 적인 것으로만 여겨져서 잘 사용되지 않는것 같아요.

    지난주 사과님이 발표해주신 슈콜로 어플리케이션 만들기도 내용적으로는 클래스 만들기와 이어지는 것이었고, 또 슈콜을 개인화하거나 혹은 뭔가 만들어낸 것을 조금 단단한 개체로 정리해 두는데 유용한 방법이라고 생각되어 또 한번 허세를 부려봅니다 하하하. 제 생각에 다른 언어보다 SC에서의 클래스가 유독 좀 더 단단하고 독립적인 개체를 만들어 내는것 같아요.

    아무튼 내일도 허세좀 부려볼게요.

     
  • mortp February 29, 2012 9:45 pm 퍼머링크 | 응답
    태그: , , makingclass, , , writingclass   

    SC에서 클래스 만들기 

    <SC의 클래스만들기 규칙>

    Platform.systemExtensionDir;   // Extensions available to all users on the machine, .rtf가 아니라, .sc로 저장해서 여기에 넣으면 됩니다.

    home/library/applicationsupport/supercollider/extensions 에 저장 후 cmd + k

    0. 한글 주석 사용 불가

    1. Getter vs Setter

    <는 클래스 외부에서 변수의 값을 불러올 수 있게. (Getter)

    >는 클래스 외부에서 변수의 값을 변경할 수 있게. (Setter)

    <> 두개 동시에 가능

    2. classvar vs var

    classvar 는 클래스 차원에서 접근이 가능하고, (Cc.classvar이름)

    var는 인스턴스 차원에서만 접근이 가능하다. (a = Cc.new; a.var이름)

    3. ‘메소드’ =  ‘함수’라고 생각해도 무방.

    둘 모두 그 이름을 불렀을 때 수행될 일들을 적어놓는 곳.

    클래스에 대해 적용될 함수는 정의되는 이름앞에 *을 붙이고, 인스턴스에 대해 적용될 함수는 *를 붙이지 않는다.

    4. ^(꺾쇠)표시는 다른 언어에서의 ‘return’과 같은 의미.

    뒤따라 나오는 구문의 결과값을, 함수를 부른(실행하라고 명령한) 곳으로 돌려준다.

    5. 인스턴스 메소드와 클래스 메소드를 구분짓는 것은, SC(혹은 그것의 모태인 smalltalk)만의 특징인 듯.

    SC의 클래스 구조에는 별도의 생성자(Constructor)개념이 없고, 기본적으로 상속받게 되는 최상위의 Object 클래스의 메소드를 빌려 필요한 메모리 공간 등을 할당받는 구조로 보임. Object 클래스의 내용을 이용하는 일종의 생성자 개념.

    Object.new;

    //새로운 인스턴스를 할당한다. 어떤 클래스든 실제로 인스턴스를 만들어 내기 위해서는 이것이 꼭 필요하다.

    새로 정의되는 어떠한 클래스라도 그것을 실제 사용할 수 있는 인스턴스로 만들기 위해서는 위와같은 명령이 반드시 필요. 관습적으로 쓰여지는 아래와 같은 .new라는 메소드의 내용은 최소한 위와 같은 동작을 수행하기 위해서이다.

    *new{

    //new라는 이름으로 생성의 역할을 정의하는 것은 다른 클래스들과의 통일성으로보면 당연하지만 다른 이름이어도 상관 없을 듯.

    ^ super.new; //Object.new 를 하는것과 마찬가지.

    }

    여기에 클래스만의 특별한 초기화 조건을 덫붙이기 위해서는,
    Object.new와 동시에 수행될 인스턴스 함수를 정의하여 실행한다.

    *new{

    ^ super.new.init(500, 0.5, 0.7); //Object.new + 그로인해 만들어진 인스턴스.init(아규먼트에 각각 500, 0.5, 0.7)

    }

    init{arg f = 200, a = 1.0, p = 1.0; //init는 그저 initialize 역할임을 표기하기 위한 이름. 다른 이름이어도 상관 없음.

    var freq, amp, pan;

    freq = f;

    amp = a;

    pan = p;

    }

    6. 실습코드

    
    Mtr{
    
    // classvar
    
    var <>routine, <>bpm, <>amp, <>tick, <>synth, <>synthNode, <>intv;
    
    *new{| argbpm, argamp, argtick = 4, argsynth = \default |
    
    ^super.new.play(argbpm, argamp, argtick, argsynth);
    
    }
    
    
    
    play{| argbpm, argamp, argtick, argsynth |
    
    bpm = argbpm;
    
    amp = argamp;
    
    tick = argtick;
    
    synth = argsynth;
    
    routine = fork{
    
    inf.do{| i |
    
    if(i % tick == 0,
    
    {
    
    intv = 60000 / bpm; //millisecond
    
    synthNode = Synth.new(synth, [\freq, 700, \amp, amp]);
    
    },
    
    {synthNode = Synth.new(synth, [\amp, amp]);});
    
    ((intv/1000)/2).wait;
    
    synthNode.free;
    
    ((intv/1000)/2).wait;
    
    }
    
    };
    
    }
    
    
    
    stop{
    
    routine.stop;
    
    synthNode.free;
    
    }
    
    }
    
     
    • mortp 2월 29, 2012 9:59 오후 퍼머링크 | 응답

      엔터를 쳐도 줄간격이 안늘어나요 이런;;;

    • joynimm 3월 1, 2012 1:01 오전 퍼머링크 | 응답

      this 가 뭐라그랬져? ^ 는 리턴…
      요즘 느끼는 바는 sc 같은 oop에서는 class 작성을 배워두면 많이 유용할 듯합니다.

      • mortp 3월 1, 2012 2:18 오후 퍼머링크 | 응답

        this는,
        클래스메소드를 정의할 때 쓰면 클래스를,
        인스턴스메소드를 정의할 때 쓰면 인스턴스를 참조한다고 하네요.
        음.. super와 대비되는 개념으로 생각하면 될 것 같아요.

  • mortp February 23, 2012 8:13 pm 퍼머링크 | 응답  

    아래의 startup.rtf 파일 중, s.meter, freqscope, stethoscope 의 위치를 조절하는 부분은, 다른 수정이 필요하기 때문에 그냥 사용하면 에러가 발생합니다. 그래서 일단 주석처리 했습니다.

     
c
새 글 작성
j
다음 글/다음 댓글
k
이전 글/이전 댓글
r
응답
e
편집
o
댓글 표시/숨기기
t
상위로 가기
l
로그인하기
h
도움말 표시/숨기기
shift + esc
취소