Archive for the ‘programmering’ Category

Datorreparation

11/08/2020

Jag hjälpte idag min hustru med att kopiera bilder från telefonen till hennes bärbara dator. Då jag öppnade datorn för att börja kopieringen märkte jag att datorns skal vid gångjärnen till bildskärmen glipare rätt duktigt. Från sidan kunde man se att centralenhetens två halvor öppnade sig med mer än fem millimeter vid bakkanten … inte bra. Orsaken var att sex stycken skruvar inte längre hade grepp om gångjärnet då bottenplattans skruvfesten hade tryckts in d.v.s. skruvarna drog inte längre ihop plattorna eftersom det mothåll skruvhuvudena borde ligga mot var borta (de hade brutits sönder och små plastbitar låg inne i datorn.

IMGP7528

Fig. 1  Den fixade datorn är av märket Acer. Jag har set motsvarande problem i flera andra datorer d.v.s. det beskrivna felet är vanligt och inte kopplat specifikt till just den här datorn.

Det ovan beskrivna problemet är rätt vanligt på portabla datorer eftersom påfrestningarna på skruvar och de komponenter skruvarna säkrar är stora till följd av att bildskärmens infästning förutom att den skall vara rörlig även måste ha så stor friktion att skärmen hålls i önskat läge.

Om problemet inte åtgärdas kommer något av följande problem som kan vara besvärlga att åtgärda att dyka upp:

  • Datorns bottenplatta spricker och en reparation blir besvärlig eftersom det är svårt att limma stora tunna plastkomponenter.
  • Kablarna till bildskärmen skadas vilket är värsta fall leder till att datorn slutar fungera då man släpper ut röken den kör på (All elektronik kör på rök vilket bevisas av att då röken släpps ut så fungerar apparaten inte längre 😉 ) .
  • Skärmens infästning blir så glapp att den inte hålls i rätt läge.

IMGP7525

Fig. 2  Det finns ingenting kvar av de ytor mot vilka skruvhuvudena har legat. De metalliska ytor man skymtar hör till den komponent mot vilken baksidan är fäst. Hålet genom vilket skruven skall spännas mot framsidans metallinsättning är helt enkelt större än skruvens huvud till följd av skada.

Efter lite funderande kom jag fram till att jag kunde konstruera insättningar i hålen som med superlim kunde fästas mot bottenplattan. För att insättningen skulle fästa bättre gjorde jag den aningen konisk vilket i viss mån bör förhindra att delen av skruvkraften dras loss.

Programmet som skapar skruvadaptern är mycket enkelt.  Genom en aningen konisk cylindrisk komponent  cylinder(r1=2.55,r2=2.35,h=3.5,$fn=64) borras ett hål för en 2.6 mm skruv translate([0,0,-1])cylinder(r=1.35,h=10,$fn=64) . Jag råkade ha lämpliga tillräckligt långa skruvar i miljonlådan som kunde kapas till önskade längder. De exakta dimensionerna ner till en tiodels millimeter är svåra att uppnå i ett steg för så här små komponenter. Vid utskrift tenderar lite plast att pressas ut åt sidorna vilket gör hål något mindre än vad de teoretiskt borde vara och komponentens ytterdimensioner brukar vara något större än önskat.

Jag skrev ut en första version som visade sig har för litet skruvhål och längden på pluggen visade sig vara onödigt stor efter provning mot den skadade dastorn. Jag ändrade designen en aning och fick de komponenter jag behövde. Utskriftstid för sex stycken pluggar var mellan tre och fyra minuter.

// Acer skruvadapter för skadade skruvhål

// Programspråket är OpenScad

difference(){
  cylinder(r1=2.55,r2=2.35,h=3.5,$fn=64);
  translate([0,0,-1])cylinder(r=1.35,h=10,$fn=64);
}

Notera att programmet ovan skapar endast en plugg. Jag kan importera många pluggar till utskriftsprogrammet. I examplet nedan skriver jag ut sex pluggar parallellt.

Bilden nedan är tagen från bildskärmen medan skrivaren skriver ut. Ju rödare komponenten är desto varmare är den d.v.s. de ljusröda områdena är de senast utskrivna.

Bottenplattan, de rundade områden (blå) som pluggarna står på är en hjälpkonstruktion som håller pluggarna på plats medan utskrift sker. Bottenplanet skärs bort innan pluggarna används.

Acer_insert

Fig. 3  Utskriftsprogrammet visar hur komponenterna ser ut för tillfället.

IMGP7527_part

Fig. 4  Den färdiga komponenten. Den svarta pluggen limmas i hålen (fig. 2) så att skruven som i detta läge är för lång skruvas fast och pluggen hålls i korrekt läge. Efter att limmet torkat kapas skruven till önskad längd genom att klippa av den med en Abico-tång. Skruven har dimensionen 2.6 mm. Rutnätets storlek är 7 mm.

Konklusion

En enkel reparation som verkar ha lyckats perfekt. Slutresultatet är sannolikt att datorn kan användas ytterligare något år innan den kommer till sin vägs ände.

 

 

Att ”hacka” GarageBand (del 2)

02/04/2020

I den första delen av den här artikelserien diskuterade olika inspelningsprogram för Windows, Mac och Linux. Eftersom det finns Mac-användare i spelmanslaget så verkar GarageBand vara ett möjligt relativt enkelt program som kunde användas för utspridd inspelning av olika låtar så att de olika medlemmarna i spelmanslaget spelar in olika spår som sedan kombineras.

En känd begränsning som GarageBand har är att det är möjligt att importera MIDI till GarageBand men programmet tillåter inte export av MIDI. Ett problem är då att det kan vara besvärligare att modifiera existerande bas- och andra slingor i programmet än om man använde ett annat program bättre lämpat för just detta ändamål.

Programmet GbConverter, ett enkelt övningsarbete

Programmet GarageBand hanterar internt MIDI men exporterar inte spår eller delar av spår som midi. Detta är sannolikt ett medvetet marknadsföringsval.

GarageBand är ett gratisprogram som kan laddas ner från Apple store. Till programmet kan dessutom laddas ner ett rätt stort paket med ljud för Midi-instrument och låtslingor. Totalt bortåt 15GB färdiga ljud och slingor finns tillgängliga utan kostnad.  Trots att det finns mängder av slingor så hör en stor del till kategorin ”pop” vilket inte är speciellt intressant för ett spelmanslag som spelar traditionell, främst nordisk, folkmusik. Nya slingor, som passar bättre till folkmusik, borde alltså skapas. GarageBands oförmåga att exportera slingor som MIDI-filer gör att det är svårare att ”stjäla” och modifiera existerande slingor. Modifikation av en MIDI-fil  kan rätt enkelt göras i MuseScore som är ett notskriftsprogram med öppen källkod d.v.s. ”gratis”.  Orsaken till att export av MIDI saknas är sannolikt att GarageBand har en storebror med i princip samma användargränssnitt men med utökad funktionalitet bl.a. export av MIDI. Storebror heter Logic Pro som naturligtvis klarar av att exportera MIDI-filer.

Skärmavbild 2020-04-01 kl. 11.30.35

Bilden visar utt urklipp från GarageBand där jag har importerat en sekvens grundackord från MuseScore i form av en MIDI-fil. Jag har i GarageBand klippt spåret i fyra delar (ackorden C, F, G och slutackord C). Antag nu t.ex. att jag vill ha tillgång till motsvarande eventuellt något modifierade slingor också i tretakt (vanligt i nordisk folkmusik) och i de vanligaste tonarterna C-, G-, D-, A-dur … I MuseScore har jag bra kontroll över transponering och kan enkelt lägga till rytmfigurer. Att modifiera melodislingor eller MIDI track i GarageBand kan göras men det är jobbigare än att använda en noteditor.

MIDI-export kan trots begränsningen i GarageBand göras rätt enkelt genom att utgå från GarageBands melodislingor (loop) som är lagrade i filer av typen .aif . Då man Googlar på detta filformat så hittar man t.ex. följande information:

Data format

En AIFF fil är uppdelad på ett antal block (chunk). Varje block idetifieras genom ett block ID (chunk ID) som som kallas FourCC. FourCC har sina rötter i Amiga datorns (i saligt minne) filformat. FourCC är en unik serie på fyra tecken som identifierar innehållet i ett block. Det MIDI-block vi plockar ut ur .aif filen börjar med teckensekvensen ‘MHdr’.

En AIFF fil kan innehålla följande blocktyper:

  • Ett allmänt block (måste finnas). Common Chunk
  • Ljuddatablock (måste finnas). Sound Data Chunk
  • Utmärkning. Marker Chunk
  • Instrumentblock. Instrument Chunk
  • Kommentarblock. Comment Chunk
  • Namnblock. Name Chunk
  • Författare block. Author Chunk
  • Copyright block. Copyright Chunk
  • Annoteringsblock. Annotation Chunk
  • Audio inspelningsblock. Audio Recording Chunk
  • MIDI datablock. MIDI Data Chunk
  • Applikationsblock. Application Chunk
  • ID3-block. ID3 Chunk

Vi ser att filen innehåller ljuddata (okomprimerad i princip .WAV) samt en hel del annan information. Det vi är intresserade av ligger nära slutet d.v.s. vi hittar ett MIDI-datablock.

Vi googlar vidare och hittar en beskrivning på hur en MIDI-fil är uppbyggd. MIDI-blocket börjar med rubriken ‘MHdr’ och MIDI-blocket avslutas med  ‘CHS’. För att en MIDI-fil skall kunna läsas in i ett program behövs ytterligare kodsekvensen ’00’, ‘FF’, ‘2F’ och ’00’ som hexadecimala tal. Sekvensen anger att MIDI-filen är slut.

För att plocka ut MIDI ur en GarageBand .aif fil behöver vi alltså skriva ett program som läser .aif-filen och söker efter ‘MHdr’ samt ‘CHS’. Om dessa markörer hittas så skrivs hela området mellan makörerna (inklusive markörerna) till en fil som avslutas med kodsekvensen ’00’, ‘FF’, ‘2F’ och ’00’ (notera att sekvensen bestå av en Amiga fourCC kod). Ett enkelt program i t.ex. programmeringsspråket Python med denna funktionalitet kan hackas ihop mycket snabbt men det måste då köras i en terminal från kommandoraden. För att programmet skall se ut som en normal Mac applikation så måste det ha ett matchande grafiskt användargränssnitt.

Skärmavbild 2020-04-01 kl. 12.43.19

Konversionsverktyget GbConverter skrivet i Lazarus (Pascal).

Att skriva i Lazarus (Pascal)

Programmeringsprojektet inleds genom att projektet namnges i vårt fall GbConverter. Då projektet skapas så väljer man samtidigt vilket bibliotek som används vid bygge av användargränssnittet. Jag använder det nyare Cocoa eftersom nyare versioner av macOs kommer att använda Cocoa vilket bör ge längre livslängd på programmet eftersom den gamla varianten långsamt fasas ut då nyare versioner av operativsystemet lanseras.

Jag startar Lazarus (Version 2.0.6) som jag tidigare hade installerat, installationen hör inte till denna artikelserie. Projektet är GbConverter.

Jag börjar med att fundera ut vilka grundkomponenter, fönster och fönsterkomponenter, jag behöver. Jag identifierar följande komponenter:

  • Ett huvudfönster som heter GbConverter och som är det användaren normalt kommer att se.
  • På huvudfönstret lägger jag en kortfattad instruktion.
  • Jag behöver ett katalognamn för den plats dit den extraherade midifilen skall skrivas.
  • Jag behöver ett filnamn för den extraherade midifilen.
  • Jag behöver ett fönster som visar konversionsprocessen och som ger information om eventuella fel.
  • En knapp öppnar en väljare för destinationskatalog.
  • En knapp väljer filen som skall konverteras.

Jag behöver ett fönster som beskriver programmet. Detta fönster kopplas till den standardmenu som skall finnas på varje programs Menurad överst på skärmen då programmet kör och är aktivt.

I den här versionen av programmet öppnar jag ett separat fönster för val av fil som skall konverteras. Detta görs som ett experiment för att se hur kommunikation mellan fönster kan göras. I en senare version av programmet plockar jag antagligen bort detta fönster eftersom en filvalsdialog lika väl kan anropas direkt från huvudfönstret.

Skärmavbild 2020-04-01 kl. 23.19.45

Lazarus programmeringsomgivning där de tre fönstren har ritats upp med hjälp av en fönstereditor.  Dessa fönster och komponenterna i fönstren kommer att generera tre pascal källkodsfiler  unit1_GbConverter, Unit1 samt Unit2. Då fönstren + komponenterna skapas så skapas samtidigt skelettkod i ovanstående moduler (unit1_GbConverter, Unit1 samt Unit2). Det är nu programmerarens uppgift att skriva kod inne i de färdiga tomma procedurer som skapats. Ett enkelt exempel:

Knappen <Set up ‘mid’ destination> skall hämta namnet på den katalog till vilken den utplockade MIDI-filen skall skrivas. Detta hanteras så att då man klickar  <Set up ‘mid’ destination> så förstår programmet automatiskt att det skall anropa proceduren (skelettet):

procedure TForm1.Button3Click(Sender: TObject);
Begin
end;

Jag öppnar då ett annat fönster som öppnar en fildialog som ger stigen till den katalog jag vill skriva till. Jag behöver lägga till följande:

procedure TForm1.Button3Click(Sender: TObject);
Begin
  Form2.ShowModal;
  LabeledEdit1.Text := Form2.midPath;
end;

Den första raden Form2.ShowModal; öppnar fönster nummer två (Form2). Den andra raden jag skriver LabeledEdit1.Text := Form2.midPath; kopierar text från det nya fönstrets textområde till huvudfönstrets textområde.

På motsvarande sätt fyller jag stegvis i kod i övriga av Lazarus skapade procedurer som jag behöver. Programmet kan hela tiden kompileras och köras men om kod saknas så finns naturligtvis ingen funktionalitet och det kommer i det färdiga programmet att finnas procedurer som har skapats automatiskt men som inte innehåller någon kod och som således är inaktiva. Intresserade läsare kan titta på källkoden till programmet som finns i zip-filen i slutet av artikeln.

Programmet innehåller en enda procedur som utför hela arbetet efter att man har definierat skrivkatalog, filnamn på fil som skall skrivas samt namnet på den fil som skall konverteras.

Koden är följande:

procedure extractMidi(filename:String);
var Ms:TMemoryStream;
Fs:TFileStream;
startMidi,endMidi,endCodeStart:Int64;
B : array of Byte;
fileSize : Integer;
pattern: TPatternArray;
begin
  Form1.Memo1.Lines.Add('Get contents of:'+filename);
  if not FileExists(filename) then Exit;
  destPath := Form1.LabeledEdit1.Text;
  if destPath='' then
  begin
    Form2.ShowModal;
    Form1.LabeledEdit1.Text := Form2.midPath;
    destPath :=Form2.midPath;
    Form1.Memo1.Lines.Add('Selected MIDI output destination:'+destPath);
  end;
  destFile := Form1.LabeledEdit2.Text;
  Form1.Memo1.Lines.Add('Set destPath to:'+destPath);
  Form1.Memo1.Lines.Add('Set destFile to:'+destFile);
  Form1.Memo1.Lines.Add('Set destFile to:'+destPath+'/'+destFile);
  if not DirectoryExists(destPath) then
  begin
    Form1.Memo1.Lines.Add('Error:'+destPath+' does not exist');
    Exit;
  end;
  if FileExists(destPath+'/'+destFile) then
  begin
    if DeleteFile(destPath+'/'+destFile) then
    begin
      Form1.Memo1.Lines.Add('Deleted old version of .mid file');
    end else
    begin
      Form1.Memo1.Lines.Add('Error: Could not delete old version of .mid file');
    end;
  end;
  Ms := TMemoryStream.Create;
  Ms.LoadFromFile(filename);
  filesize := Ms.Size;

  try
  Ms.Position := 0;
  Form1.Memo1.Lines.Add('Read Loop file.');
  Form1.Memo1.Lines.Add('Size='+IntToStr(fileSize));
  { Searching for 'MTrk' in the FileStream }
  pattern := StringToByteArray('MThd');
  startMidi := DoSearch(Ms,pattern);
  { Ensure we continue from 'MThd' forward }
  Ms.Seek(4,startMidi);
  pattern := StringToByteArray('CHS');
  endMidi := DoSearch(Ms,pattern);
  Form1.Memo1.Lines.Add('Looked for MIDI start=MThd, res='+IntToStr(startMidi));
  Form1.Memo1.Lines.Add('Looked for MIDI end=CHS, res='+IntToStr(endMidi));
  if (startMidi>0) and (endMidi>0) then
  begin
    Form1.Memo1.Lines.Add('Extract MIDI');
    //filePath := ExtractFilePath(filename);
    Form1.Memo1.Lines.Add('File path:'+destPath);
    Form1.Memo1.Lines.Add('Output File name:'+destPath+'/'+destFile);
    Fs := TFileStream.Create(destPath+'/'+ destFile, fmCreate);
    { Read into temporary buffer }
    SetLength(B,(endMidi-startMidi + 16));
    Ms.Position := startMidi;
    { We include the start and end codes (4=MTrk)(3=CHS)}
    Ms.Read(B[0],(endMidi-StartMidi+3));
    endCodeStart := endMidi-StartMidi+4;
    { Add MIDI end of track mark }
    B[endCodeStart]:= $00;
    B[endCodeStart+1]:= $FF;
    B[endCodeStart+2]:= $2F;
    B[endCodeStart+3]:= $00;
    { Write Buffer to FileStream }
    Fs.Write(B[0],(endMidi-StartMidi+3));
    Fs.Free;
  end else
  begin
    Form1.Memo1.Lines.Add('Invalid LOOP file, MThd and/or CHS not found.');
    Exit;
  end;
  finally
    Ms.Free;
  end;
end;

Programtexten bör vara relativt enkel att läsa. De första ca. 30-raderna är endast kontroll av möjliga fel d.v.s. kontroll att destinationskatalogen finns etc. Om filen som skall konverteras inte finns så ger programmet upp genast. Det egentliga arbetet börjar vid:

Ms.MemoryStream.Create;
Ms.LoadFromFile(filename);
filesize := Ms.Size;

Vi läser in hela .aif filen i maskinens minne. I mitt testfall är det ungefär 400 000 tecken eftersom aif-filen också innehåller ljuddata (WAV).  Alla rader som innehåller Form1.Memo … skriver till informationsfönstret så att man skall kunna se om något går fel. Dessa raders enda funktion är att informera om hur långt vi har kommit i konversionen och dessa rader kunde lämnas bort utan att programmets funktion ändras.

pattern := StringToByteArray('MThd');
startMidi := DoSearch(Ms, pattern);

Vi söker efter strängen som indikerar början på midi blocket.

Ms.Seek(4,startMidi);

Vi ställer en pekare så att vi fortsätter sökandet efter den hittade startpunkten. Det kunde annars, om vi skulle söka efter ‘CHS’ från början av filen,  hända att teckenserien vi härnäst söker efter ‘CHS’ kunde tänkas finnas i det redan avsökta området vilket skulle ge fel och eventuellt leda till mycket intressanta bieffekter då det funna blocket skall skrivas till skiva (sannolikt skulle krogrammet krascha och eventuellt skulle maskinen låsa sig). Därefter söker vi slutet på midifilen på motsvarande sätt.

pattern := StringToByteArray('CHS');
endMidi := DoSearch(Ms, pattern);

Om vi har hittat både en startpunkt och en endpunkt så antar vi att det som finns mellan dessa punkter är den MIDI-fil vi vill plocka ut.

Vi läser in MIDI-området i en temporär buffert som jag kallar B och som är tillräckligt lång för att rymma MIDI-filen.  Vi skapar en Fil-ström som vi senare använder för att skriva midifilen till skiva.

Fs := TFileStreamCreate(destPath+'/'+destFile);

Vi läser in midi-området i bufferten B innan vi skriver till skiva för vi vill modifiera filen en aning innan vi skriver den. Vi beräknar platsen i bufferten där midi-blocket är slut d.v.s. efter ‘CHS’ men så att ‘CHS’ också skrivs till skiva.

Ms.Read(B[0],(endMidi-startMidi+3);
endCodeStart := (endMidi-startMidi+4);

Vi lägger nu till stoppkoden som signalerar till något annat program som läser midifilen att midifilen är slut.

B[endCodeStart] := $00;
B[endCodeStart+1] := $FF;
B[endCodeStart+2] := $2F;
B[endCodeStart+3] := $00;

Slutligen skriver vi resultatet till skiva och är färdiga att börja behandla följande .aif fil.

Fs.Write(B[0],(endMidi-startMidi+8));
Fs.Free

Sökning i minnet

Att söka efter en textsträng i en s.k. binärfil är besvärligare än att söka i en normal textmassa. Sökning i en text kan göras med en mängd färdiga verktyg. Sökning i en binärfil blir mera komplicerad av att vilka tecken som helst kan förekomma också tecken som har specialbetydelse i en vanlig text och som kan få en sökfunktion att tappa bort sig. Sökningen görs med hjälp av en kort sökfunktion :

function DoSearch(Stream: TMemoryStream; Pattern: TPatternArray): Int64;
var
  idx :Integer;
begin
  result := -1;
  for idx := Stream.Position to Stream.Size - Length(Pattern) do
  begin
    if CompareMem(Strem.Memory + idx, @Pattern[0], Length(Pattern))
    then exit(idx);
  end;
end;

Wi söker alltså direkt i maskinens centralminne i en kopia på GarageBands aif fil vilket gör sökningen snabb också på en gammal och i princip långsam iMac som den jag har.

Det kan vara kul att titta på kostnaderna för de iMac-ar jag har satt upp för musikprojektet.

Den maskin jag skrivit programmet på är en 21,5 tums iMac från 2009 med 12 GB centralminne och 500 GB SSD hårdskiva. Totalpris ca. 100E efter minnesuppgradering och byte av en urgammal mekanisk hårdskiva som sannolikt sjöng på sista versen till SSD-skiva.

Anders, en god vän kör en 24 tums iMac årsmodell 2007 uppgraderad till maximalt 6GB centralminne med SSD hårdskiva. Pris totalt under 100E efter uppgradering … inköpt för 10E utan hårdskiva.

Det är intressant att notera att då jag inte spelar datorspel så fungerar båda maskinerna utmärkt utan att visa några som helst ålderskrämpor i form av störande tröghet gällande de program jag använder (Garageband, OpenOffice, Vebbläsare och Lazarus).

(Följande artikel beskriver hur det ”hackade” systemet används)

 

 

Musik med Corona, att ‘hacka’ GarageBand (del 1)

01/04/2020

Vårt spelmanslag ”Altra Volta” har inte spelat ihop på några veckor och något borde göras för att gruppen skall kunna fortsätta att spela utan risk för smitta.

Ett sätt att fortsätta med musikhobbyn är att t.ex. börja spela in vår repertoar men så att inspelningen görs stämma för stämma och instrument för instrument över nätet. Det är inte med dagens teknik möjligt att göra inspelning i en virtuell studio där de olika deltagarna sitter hemma och spelar ihop i realtid. Problemet är fördröjningarna i nätet. Man uppfattar inom telefoni att den maximala fördröjningen är ca. 400 ms vilket hörs som ett obehagligt ”eko” om man över telefon talar med en annan person i samma rum. Om man spelar i tempot 120 slag/minut så motsvarar en fördröjning på 400 ms nästan ett taktslags fördröjning vilket inte är acceptabelt. Min gissning är att fördröjningen borde fås ned till under 100 ms (1/10 s) för att fördröjningen inte skall störa i amatörsammanhang … yrkesmusiker störs antagligen av ännu mindre inexaktheter. Kanske jag med 5g teknik kan planera den virtuella studion i framtiden?

Inspelningsprogram

Det finns mängder av inspelningsprogram på olika plattformer.

Gratisprogrammet  Audacity fungerar rätt bra under Windows, Linux och på Mac … problemet är att det verkar finnas vissa fel då man skall lägga till externa spår till ett lokalt inspelat spår, fel som gör att programmet i vissa fall vägrar köra.

På Windows finns t.ex. programmet Cubase men jag har ingen praktisk erfarenhet av detta program.

Vill man betala för ett inspelningsprogram så finns t.ex. ProTools för både Windows och Mac men inte för Linux. ProTools verkar dock relativt komplicerat utgående från erfarenheterna med att hjälpa en vän som har gått över från Windows till Mac och ProTools. Väldigt jobbigt med ett kopieringsskyddat program som dessutom inte är helt billigt.

På en Mac finns programmet GarageBand som, trots vissa buggar, verkar fungera rätt pålitligt och samtidigt innehåller en rätt stor mängd effekter som dock främst verkar vara gjorda för popmusik och inte den typ av folkmusik vi spelar. Garageband verkade dock så intressant att jag köpte mig en 21,5 tums iMac från 2009 för 50 Euro (500 SEK). Efter byte av den mekaniska hårdskivan till SSD och uppgradering av minnet till 12 GByte (billigt) så fungerar maskinen utmärkt och är trevlig att jobba med. Ljudkortet jag använder och som fungerar väl både under Linux och i Macen är Behringers Uphoria UMC404HD. Jag kan spela in elektroniska (simulerade) instrument m,ed hjälp av ett elektroniskt keyboard av typen M-Audio KeyRig 25.

För att skriva noter använder jag programmet MuseScore som finns för Windows, Mac och Linux.

Användning av GarageBand

Jag har spelat in några stycken på GarageBand flerstämmigt. Inspelningen går till så att jag skapar ett akustiskt spår (track) på vilket jag spelar in t.ex. melodin med användning av metronom (som finns i programmet). Jag kan efter detta lyssna på det inspelade bandet och spela in en stämma i taget eventuellt på olika instrument. För denna typ av extremt enkel inspelning fungerar programmet utmärkt.Jag kan också spela in piano eller en rätt stor grupp MIDI-instrument med hjälp av keyboardet.

Om jag vill lägga till t.ex. kompslingor med gitarr eller bas så visar det sig att det finns väldigt lite slingor som inte är överdrivet ”pop”-iga. Ett intressant alternativ vore att helt enkelt modifiera någon eller några existerande slingor som passar bättre till nordisk folkmusik. Det går att skapa egna slingor i GarageBand men verktygen kunde vara bättre och det är relativt besvärligt att modifiera existerande slingor. Ett alternativ vore att modifiera MIDI-spår med något lämpligt program utanför GarageBand och därefter läsa in den modifierade musiken  tillbaka i GarageBand.

GarageBand problem

GarageBand tillåter inte export av MIDI men nog att MIDI läses in utifrån. Jag kan alltså inte läsa in t.ex. en GarageBand slinga i MuseScore, transponera, ändra tempo eller taktart etc. Hur skall det problemet lösas?

Det visar sig att GarageBand sparar sina slingor i filer av typen .aif . Dessa filer är binära d.v.s. det är inte möjligt att studera dem i en texteditor däremot kan man titta på dem i en såkallad HexEditor d.v.s. ett program som visar innehållet som Hexadecimal nummerkod parallellt med att tecken som är skrivbara visas i ett eget fält. Med hjälp av en HexEditor kan man se att en .aif sling från Garageband innehåller en komplett MIDI-fil sannolikt tillsammans med ljuddata för det instrument som slingan spelar.

Lite sökande på nätet visade att en MIDI-fil alltid startar med rubriken ‘MHdr’ (MidiHeader). Filslutet utmärks med ‘CHS’ samt ytterligare de hexadecimala tecknen ’00’, ‘FF’, ‘2F’ och ’00’. På nätet hittar man instruktioner för hur man t.ex. med en hexeditor kan plocka ut MIDI ur en fil geno att söka efter ‘MHdr’ och ‘CHS’. Försöker man läsa in en fil baserat på detta i GarageBand så låser sig systemet eftersom slutkoden saknas.

En midifiles upphyggnad finns beskriven här i detalj.

Problemet med modifiering av slingar löses alltså genom att skriva ett program i Pascal. Systemet inklusive ett grafiskt gränssnitt heter ‘Lazarus’. Programmeringen görs som man under antiken d.v.s. på 1990-talet skrev t.ex. i Visual Basic. Programmets användargränssnitt ritas i ewn grafisk editor som automatiskt genererar tom kod för de skapade elementen. Programmerarens uppgift blir då att lägga till kod i de olika komponenterna så att programmet får önskad funktion. Liksom alltid då man börjar skriva i ett nytt och okänt språk så är problemet att omgivningen och alla verktyg är okända. Jag börjar med att skriva ett program med ett enda fönster och t.ex. en enda tryckknapp.

Arbetsprocessen med det nya programmety blir då ungefär följande:

Alternativ 1

  • Skriv melodislingor på MuseScore och exportera dem till GarageBand

Inget konversionsprogram behövs i detta fall.

Alternativ 2

  • Sök upp en intressant slinga i Garageband
  • Läs in slingan i MuseScore efter konvertering i GbConverter
  • Modifiera slingan i MuseScore
  • Importera den modifierade slingan som MIDI till GarageBand

För att arbetet skall göras bekvämt så körs tre program parallellt d.v.s. GarageBand, MuseScore och GbConverter. Eventuellt kan man säga att fyra program används eftersom importering av en MIDI-fil till GarageBand görs så att man från filhanteraren drar midifilen till önskat spår i GarageBand.

En liten introduktion till GarageBand från nätet:

(Fortsättning: Programmet GbConverter skrivet i omgivningen Lazarus i Pascal).


Pointman's

A lagrange point in life

THE HOCKEY SCHTICK

Lars Silén: Reflex och Spegling

NoTricksZone

Lars Silén: Reflex och Spegling

Big Picture News, Informed Analysis

This blog is written by Canadian journalist Donna Laframboise. Posts appear Monday & Wednesday.

JoNova

Lars Silén: Reflex och Spegling

Climate Audit

by Steve McIntyre

Musings from the Chiefio

Techno bits and mind pleasers

Bishop Hill

Lars Silén: Reflex och Spegling

Watts Up With That?

The world's most viewed site on global warming and climate change

TED Blog

The TED Blog shares interesting news about TED, TED Talks video, the TED Prize and more.

Larsil2009's Blog

Lars Silén: Reflex och Spegling

%d bloggare gillar detta: