當兩個設備一起工作對時間有精確要求的時候,就需要在它們之間進行同步。同步是基於在兩個設備之間規定一個共同的時間參考。例如,你想將32軌的音頻信號錄在兩16軌磁帶機上,則這兩個磁帶機的磁帶傳送軸就需要鎖定在一起,這個過程就稱為同步。如果這兩個設備沒有進行同步,無論它們開始的時間多麽一致,也會由於兩設備機械結構的差異而産生時間漂移。
桌型音樂作統經常遇到的同步通常是在音序器(或音序軟件)與多軌錄音機之間進行的,同步的目的主要是將不同midi音色的聲音錄到單獨的音軌上。即使你使用一多任務型電腦(既是音序器,又是數字音頻錄音機),它本身也同樣存在同步問題。雖然以計算機為基礎的數字音頻設備比機械式磁帶錄音機要精確得多,但是如果缺少同步,也會出現一些問題。
當兩(或多)設備進行同步的時候,其中一稱為主機(以其內部送的時間碼為),而其它的則稱為從機。在衹有一從機的時候,同步信號可直接由主機送給從機,這時,從機的時鐘方式要打到“外部時鐘方式”(external clock mode)。有多從機時,則需一個專門産生同步信號的設備作為主機,以便多從機進行同步。
同步信號分為姓种种氏類型,其用途也是不一樣的。midi時鐘是較為簡單的同步信號之一。在midi規定中,定義由主機通過midi綫傳送的時鐘字節為24ppq(每四分音符的時鐘點),同時還規定樂麯的開始、停止、繼續等命令。使用這些命令,兩音序器可以很容易地進行同步。用戶可以通過一條midi綫,將主機上的操作傳送到從機上,使從機能夠很好地和主機同步。(從理論上講應該是這樣的,但實際操作時會遇到一些預想不到的問題。)
你也許已經註意到,midi時鐘和樂麯的速度是有關係的。當主機的樂麯速度加快,每秒內所送的midi時鐘點也會增加,這時從機的樂麯速度也會增加。另外一種同步信號是根絶對時間編碼而成的——它包含小時、分、秒等信息,最常用的這時間碼被稱做smpte(即英文電影電視工程師協會——society of motion picture and television engineers的縮寫)。smpte碼將時間分為小時、分、秒、幀和位。在使用smpte碼時,幀頻率是經常用到的一個選項,經常使用的幀頻率為24,25或30fps(每秒幀數)。衹有在主機和從機都選擇相同的幀頻率時,才能很好同步。
smpte碼是一種音頻信號,很容易錄在磁帶或硬盤上。由於midi電纜所傳送的midi信號為數字信號,所以smpte碼不能通過midi綫直接傳輸。但是mtc碼(即英文midi時間碼——midi time code的縮寫)則能將smpte碼編譯成midi格式,能通過midi綫進行傳送。在這裏需要註意的是smpte和mtc碼並不送開始、結束等命令,且也不會改變樂麯的速度。它們提供的是以分、秒來計算的絶對時間參考,而不是小節、拍的參考。所以如果在多軌機錄茶几軌,你又改變音序器中樂麯的速度,那麽再錄時,就會出現錯位現象,即使多軌機已經錄受不了smpte同步信號經mtc與音序器很好地同步,也無濟於事。
對於數字音頻錄音來說,無論是midi信號還是smpte信號都不能提供足夠的精度。高精度的數字音頻錄音設備之間,往往需要使用被稱為字時鐘的同步信號來進行同步鎖定。其精度是和一個樣字頻率是一樣的——通常是每秒出現44.1或48次。如果要將數字音頻錄音機中的字時鐘同步信號轉換成smpte或其它時鐘碼時,則需要一個專門的硬件設備來完成。
編程方面的同步 Synchronous programming
同步就是協同步調,按預定的先次序進行運行。如:你說完,我再說。
“同”字從字上容易理解為一起動作。
其實不是,“同”字應是指協同、協助、互相配。
如進程、綫程同步,可理解為進程或綫程A和B一塊配,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。
所謂同步,就是在出一個功能調用時,在沒有得到結果之前,該調用就不返,同時其它綫程也不能調用這個方法。按照這個定義,其實絶大多數函數都是同步調用(例如sin, isdigit等)。但是一般而言,我們在說同步、異步的時候,特指那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 SendMessage。該函數送一個消息給某個窗口,在對方處理完消息之前,這個函數不返。當對方處理完畢以,該函數把消息處理函數所返的 LRESULT值返給調用者。
在多綫程編程當面表面反面方面正面迎面滿面封面地面路面世面平面斜面前面下面四面十面一面洗心革面方方面面面貌面容面色面目面面俱到,一些敏感數不允許被多個綫程同時訪問,此時就使用同步訪問技術,保證數在任何時刻,最多有一個綫程訪問,以保證數的完整性。在Java當面表面反面方面正面迎面滿面封面地面路面世面平面斜面前面下面四面十面一面洗心革面方方面面面貌面容面色面目面面俱到,通過synchornized 進行同步的保證。比如
class MyTest {
private static final Object lock = new Object();
public static synchronized void test(){ // 同步的方法
}
public void test2(){
synchronized(lock){ // 方法級同步,也可以使用this實現對象級同步 }
}
}