Laden...

Forenbeiträge von Sheena Ingesamt 25 Beiträge

04.10.2006 - 21:32 Uhr

Hab es nun endlich hinbekommen ...

Habe die Wave-Datei also "per Hand" durch die Sinusfunktion geschrieben.

Hier mal der Code:


MemoryStream rec = new MemoryStream();	
int duration = 500;
int Samples = SamplesPerMS * duration; // Anzahl Samples

byte[] help = new byte[2];
double val;
for ( int i = 0; i < Samples; i++  )
{
	val = Math.Round(32000*Math.Sin((double)(Pi2*freq* (float)i*SampleDuration)));
	for(int a=0; a<2; a++)
	{
		help[a] = (byte)((int)val >> (a*8));
	}
			
       rec.WriteByte(help[0]); 
      rec.WriteByte(help[1]);
}

writeWave(); //Schreibt den Stream in eine Datei mit Wave-Header

Vielleicht kann es mal jemand gebrauchen...

Danke jedenfalls für die Hilfe.

MfG, Sheena

29.09.2006 - 18:26 Uhr

Hey, hier ist ja einiges passiert . Sorry, dass ich mich erst jetzt wieder melde, musste mich allerdings ausgiebig um meine Präsentation kümmern.

@Borg : Hmm, diese Idee ist mir auch gekommen. Ich bastel gerade daran. Danke also für den Code 😉 Passt auch ganz gut, da ich im Programm eh schon Wav-Dateien von Hand generiere.... Also an sich ist es auch schnell genug. Zur Zeit habe ich nur ein kleines Disposing-Problem, da ich die Datei noch freigeben muss, nachdem ich sie generiert habe und dann abspielen will - aber den Bug werd ich noch finden...

@Neotec: Puh, da brauch ich erstmal etwas um dahinter zu steigen. Aber vielen Dank für die Mühe die du dir gemacht hast. Wenn ich es geschafft habe, dass zu kapieren, werde ich es mal austesten.

Also nochmal danke für die Hilfe.

Schönes Wochenende, Sheena

25.09.2006 - 12:44 Uhr

Ja, so habe ich mir das jetzt auch gedacht. Und das mit dem Knacksern ist auch leider ein starkes Problem. Desweiteren habe ich das Problem, dass ich eine Fehlermeldung bekomme, wenn meine Wav-Datei die ich in den Soundbuffer lade kleiner als 0.15 Sekunden ist. Er bemeckert das der Buffer zu klein ist. Allerdings sind 0.15 Sekunden schon verdammt lang. Und durch die Verschiebung der Frequenz verändert sich demnach ja auch die Dauer.

Aber aus deinen Worten lese ich heraus, dass es wohl neben diesen zwei Ansätzen keine weiteren zu geben scheint.

Naja, trotzdem vielen Dank für deine Hinweise. Hab nicht gerade viele Tutorials für DirectSound gefunden die hilfreich sind, mal abgesehen von diesem hier http://www.pluralsight.com/wiki/default.aspx/Craig.DirectX/DirectSoundTutorialIndex.html

MfG, Sheena

25.09.2006 - 12:14 Uhr

Erstmal danke für deine Antwort!
Da habe ich mich wohl ungenau ausgedrückt...

Also Ziel des ganzen ist es Töne auszugeben. Diese sollen von 50 Hz bis ca. 1kHz variabel sein. Da auch Tonfolgen abgespielt werden sollen, müssen die Tonfragmente sehr klein sein, weil es sich sonst nach Treppe anhört und nicht nach Tonverlauf. Es ist allerdings mächtig uneffizient, wenn ich nun für 950 Frequenzen (1kHz-50 Hz = 950 Hz) jeweils eine Wave-Datei mit CoolEdit erstelle...

Die Beep-Funktion funktioniert ja auch ansich korrekt, allerdings ist zum einen der Ton alles andere als sauber und zum zweiten hört er sich sehr befremdlich an. Vielleicht gibt es ja auch eine Möglichkeit dies über die Soundkarte laufen zu lassen und nicht über die normalen Speaker?

Vielleicht habe ich mich jetzt etwas besser ausgedrückt...

MfG, Sheena

25.09.2006 - 09:36 Uhr

Hallo...

Ich habe da mal eine kleine Frage: Gibt es in der DirectX bzw. DirectSound-SDK eine Funktion die der Windows-Beep-Funktion ähnelt?

Ich versuche durch Übergabe von Frequenz und Dauer Töne zu erzeugen.
Bisher habe ich nur herausgefunden, dass das Abspielen einer Wave-Datei mit einer bestimmten Frequenzverzerrung möglich ist. Der Windows-Beep ermöglicht mir aber eine höhere Variabilität gerade was sehr kurze Töne angeht. Allerdings geht der Windows-Beep über die PC-Speaker und an den Ton muss man sich auch erst mal wieder gewöhnen. Zudem ist das Klanggemisch schon etwas wüst....

Kenn jemand da eine Alternative?
Oder gibt es da überhaupt eine? Zumindest bei meiner Suche fand ich bisher noch keine...

MfG, Sheena

31.07.2006 - 13:29 Uhr

Also den Fehler hab ich gefunden. 😁
Es liegt daran, dass die Main.cs zwei Resources-Dateien hat. Nur in einer sind die Daten für die Icons enthalten (Main.de.resx) in der anderen (Main.resx) nicht. Mit Copy-and-Paste lässt sich der Fehler dann leicht nachbessern. Aber warum werden zwei Ressourcen erstellt? Ich tippe man das hat was mit den Language-Packs zu tun, aber weswegen nur bei einer Datei im Projekt? Kann man das auch irgendwie abstellen oder manuell einstellen?

Schöne Grüße, Sheena

26.07.2006 - 17:52 Uhr

Hallöle...

Hab mal wieder etwas was mich mächtig verwirrt.

Vorneweg: Ich benutzte VS. NET 2003, auch den Installer von VS.

Also das Problem: Ich habe zwei Projekte die ich mit einem Installer verpacke.
Führe ich die Projekte in VS aus, sind alle Icons (Form und Buttons) okay. Nach der Installation mit dem Installer sind die Icons allerdings im Hauptfenster von Projekt 1 nicht da. Bei den anderen Fenstern von Projekt 1 und komplett bei Projekt 2 sind alle Icons korrekt da.

Woran liegt das?

Ich hab keine Ahnung. Ich tippe mal das liegt irgendwie an der InitialComponent()-Methode. Aber weswegen er das in der Entwicklungs-Umgebung richtig kompiliert und nach der Installation nicht (vor allen nur in einem Fenster und nicht in allen) verstehe ich absolut nicht.

Vielleicht kann mir mal jemand einen Tipp geben woran das liegen könnte. Ist etwas im Trüben-Fischen - ich weiß, aber vielleicht habt ihr ja trotzdem die hilfreichen Ideen.

Schöne Grüße, Sheena

26.07.2006 - 16:59 Uhr

Hi...Ich tippe mal, du wirst es schon hinbekommen haben, aber für die nächsten Suchenden hier ein Tipp. 😁

Hatte dieses lästige Problem auch. Auf meinem Rechner (egal ob mit Adobe PDF oder meinem Canon) druckte er A4 so wie es sein sollte. Allerdings auf den Rechnern meiner Testpersonen nicht. Hab dann ein wenig probiert. Also Erfolg zeigte dann komischerweise diese Variante :


private void PrintButton_Click(object sender, System.EventArgs e) {

printDialog.Document = printDocument;
DesignDocument();

System.Drawing.Printing.PaperSize paper = new System.Drawing.Printing.PaperSize("A4", 827,1169);
this.printDocument.DefaultPageSettings.PaperSize = paper;
printDialog.Document.DefaultPageSettings.PaperSize = paper;
this.printDocument.Print();

}


Wobei erst die printDialog-Zeile eine Veränderung gebracht hat...
Warum das so ist - keine Ahnung 😦. Ich tippe mal der Dialog legt sich über die "normalen" PageSettings und wird als Referenz genommen...

Hoffe das hilft....Allerdings übernehme ich keine Garantie! Wie das ganze funktioniert ist mir noch bei Weitem nicht klar. 🤔

Wenn jemand etwas mehr durchsieht, kann er (oder sie) mir das ja gern mal posten.

Schöne Grüße, Sheena

16.06.2006 - 11:26 Uhr

Schönen guten Morgen...

*lach* Wusste gar nicht das es sowas wie Profiler gibt. Finde ich ja klasse. Ich probier es bei Gelegenheit und Zeit mal aus.

Schöne Grüße, Sheena

15.06.2006 - 17:56 Uhr

N'Abend Herbivore...

Was ist dein eine Gruke? lach Gurke?
Also wenn's nicht bloß ein Vertipper ist dann kenn ich den nicht....
Aber ich weiß was du meinst!

Ich verstehe auch nicht, warum deine Grundstruktur so aus siehst, wie du schreibst. Du wolltst doch auf den Schirm zeichen. Dann sollte in der Schleife nur das Aktualisieren des Ausschnitt stehen und das Zeichnen im OnPaint

Das sollte eigentlich nur ein gröberer Überblick darstellen. Also im Grund ist es so, ich berechne für einen Ausschnitt (20ms) eine Grundfrequenz. Dann rufe ich eine Methode auf, die die Werte bei denen gezeichnet wird definiert und ein PictureBox.Invalidate() und PictureBox.Update() beinhaltet. So, auf meiner PictureBox habe ich ein PaintEventHandler gelegt. Sobald ich also PictureBox.Update() aufrufe gelangt er in PictureBox_Paint(...PaintEventArgs e). Darin steht dann der eigentliche Zeichenaufruf e.DrawLine(...). OnPaint() benutze ich eigentlich gar net. Ich hatte mal geschaut, in welche Funktionen ich hinein gerate und da kam ich nicht zu OnPaint(). Deswegen hab ich das auch net weiter betrachtet. Also das er explizit den Ausschnitt neuzeichnet, sieht man daran, dass ich Zeichenelemente die direkt auf dem PaintBox.Image gezeichnet werden, überblendet sind (in dem gewissen Ausschnitt)...

Oder macht der noch mehr, als ich ihn eigentlich machen lassen wollte?

Das ist sicher nicht notwendig!

Puh, das beruhigt mich.

So, ich mach jetzt erstmal Feierabend. Einen schönen Abend noch!
Gruß, Sheena

15.06.2006 - 12:06 Uhr

So richtig weiß ich auch net, weswegen es so lange dauert...Kurz zu meiner Problemstellung. Ich entwickle ein Tool, was per Headset-Mic Gesungenes aufnimmt, und in Echtzeit die Grundfrequenz ermittelt und graphisch darstellt. Im Grunde läuft es so ab:

solang daten da
{
Berechne Grundfrequenz;
Zeichne Grundfrequenz ein; (ca. 2 Pixel)
Aktualisiere Ausschnitt der neu eingezeichneten Grundfrequenz;
}

Wenn ich die Zeichenops (inklusive Aktualisieren) weglasse, ist der Algo auch schnell. Wenn ich während dem Zeichnen das Fenster nicht im Focus hab, und wieder draufklicke ist es auch sofort fertig. Also ich denke das was lange dauert ist dieses Aktualisieren und Zeichnen im Vordergrund. ICh muss ja wirklich jeden Wert zeichnen, und das Aktualisieren, damit ich dem Sänger ein Feedback gebe, in welchen Frequenzen er sich gerade befindet.

Ein Freund meinte, dass ich vielleicht für so etwas direkt auf der Grafikkarte arbeiten sollte, aber das ist (derzeit noch) ein Stück zu Heavy für mein Können..

Gruß, Sheena

12.06.2006 - 17:22 Uhr

Hallo erstmal wieder...

Also ich zeichne nicht direkt die WaveForm, sondern den Grundfrequenzverlauf, und das mit 50 Werten pro Sekunde. Dachte aber das wäre zuviel Information und unnötig zur Lösung. Meine Abtastrate ist auch nur 22kHz - aber das ist ja wurscht. Langsam bin ich mit dem zeichnen recht zufrieden, lässt mir zwar imer noch keine Zeit, noch andere Operationen zu tätigen, aber es kommt langsam in ein akzeptables Maß.

Also das mit dem GUI-Thread und dem Zeichnen war mir in dem Sinne noch nicht bekannt. Da schließe ich mich meinem "Vor-Poster" an: Man lernt immer wieder was neues. =) =)

Jedernfalls vielen Dank für die Hilfe - hat mich um einiges weiter gebracht. thumpsup

Also bis zu meinem nächsten Problemchen.

Ganz liebe Grüße, Sheena

12.06.2006 - 09:20 Uhr

Hallöle...

So, hab da mal mit dem EventHandler umgesetzt. Also es ist definitiv schneller, aber noch nicht ausreichend. Aber danke erstmal für den Tipp....Der Algorithmus der die Daten zum zeichnen liefert ist schnell genug, würde es etwas vielleicht bringen, wenn ich das zeichnen in einen Thread packe? Also die Daten kommen schnell genug - ohne Zeichnen ist der Algorithmus in 0.2s durch. Beim darstellen der WaveForm einer 7s langen Datei braucht er allerdings gute 11s... Das kann also nur am zeichnen liegen. Hat jemand vielleicht die ein oder andere Idee das Zeichnen schneller hinzukriegen? Also das mit dem aktualisierten Ausschnitt funktioniert jedenfalls schon mal - aber noch nicht ausreichend genug.

So, danke im Vorraus für eventuelle Tipps.

Liebe Grüße, Sheena

08.06.2006 - 11:20 Uhr

*g* Das hatte ich verstanden. Aber wenn die Lösung mit dem Paint-EventHandler schneller ist, kann ich das ja mal ausprobieren...

Grüße, Sheena

08.06.2006 - 10:07 Uhr

Also ich benutze derzeit noch Variante 1 also Graphics.FromImage()... Gut, dann werd ich mal nen Paint-EventHandler basteln und drüber legen.

Danke für die Tipps...

🙂 Grüße, Sheena

08.06.2006 - 09:30 Uhr

Hallöle Herbivore!

Heißt also ich muss mir einen Paint-EventHandler basteln. Und darf nicht nur mit blossen Paint(-Line etc.)-Aufrufen arbeiten?

Grüße, Sheena

06.06.2006 - 16:47 Uhr

Danke für die schnellen Antworten.

Hab es mal mit Invalidate() und Update() probiert. Sehr viel schneller scheint es nicht zu sein. Kann aber auch an meinem Berechnungsalgorithmus liegen. Muss ich mal schauen... Trotzdem danke, die Überladungen hab ich völlig übersehen...

Zu ClipRectangle: Also ich benutze keinen Paint-Eventhandler, aber ich weiß ja, wo ich zeichne, und da ich nur Linien zeichne ist es kein Problem das passende Rectangle zu lokalisieren.

Jedenfalls vielen Dank.

LG, Sheena

06.06.2006 - 11:27 Uhr

Hallöle...

Hab mal 'ne Frage: Gibt es eine Möglichkeit nur einen Ausschnitt einer PictureBox zu aktualisieren? Ich programmiere eine Anwendung, die in realtime Mikrofoneingaben als Waveform zeichnet. Und das Zeichnen dauert definitiv zu lang. Nach jeden gezeichneten Wert Refreshe ich die PictureBox. ich glaube das dauert zu lang - die ganze PictureBox neu zuzeichnen. Sind ja imer nur kleine Ausschnitte die sich ändern.

Hat jemand eine Idee, wie ich das Realisieren kann? Sozusagen nur ein gewähltes Rechteck in der PictureBox zu refreshen. Da ich mir das Graphikobjekt der PictureBox hole, gibt es vielleicht ne Möglichkeit nur das Graphikobject zu aktualisieren? Also mit Invalidate() und Update() kam ich nie weit....

Bin für jeden Tipp dankbar.

Liebe Grüße, Sheena

06.06.2006 - 11:17 Uhr

Hallöle...

Also ich hab sowas bereits programmiert. Allerdings für Luftpistole. Hab es im Rahmen meines Praktikum bei der ETeX AG gemacht. War noch ein wenig buggy, aber funzte eigentlich. Bei Interesse bei der ETeX (www.etex.de) melden - nicht wundern, das Projekt ist nicht offiziell auf der Homepage ausgeschrieben, aber auf Anfrage kriegt ihr sicher 'ne Auskunft. So mal grob beschrieben, wie ich es gemacht habe. Scheiben scannen, die Löcher sind dann als Weiße Kreise zu sehen. Dann mit Kantendetectionsfiltern die Ringe ermitteln. So, als Orientierung für die Position der Löcher habe ich die Ringe genommen. Und dann mit Größen/Längenverhältnissen auf die "Punktzahl" geschlossen. Wie gesagt funktioniert. Das Programm hat zusätzlich 'ne Datenbank (SQL) dran, um auch als Vereinssoftware gut eingesetzt zu werden, und hat eine Verbindung zu WinTFS um das noch besser hinzukriegen. Wie gesagt, ist für LP ausgelegt, aber bei Anfrage, kommt Chef vielleicht auf die Idee, das für andere Disziplinen auszuweiten.... Hab es nicht so schwer gemacht, sowas zusätzlich einzubinden. Achso, Prog ist in Java, aber natürlich als Exe ausführbar...

Hoffe das bringt einige Interessenten zu 'ner Lösung.

Achso, zu der Idee, von den Randseiten auf die Position der Einschüsse zu schliessen: Die Idee hatte ich auch, leider haben die Druck-Betriebe eine Toleranz. Somit sind die Positionen der Ringe nicht auf jeder Scheibe hundertprozentig gleich, und das macht schon viel aus, wenn Ringe angerissen werden, oder eben nicht. Also damit kommt man nicht weit.

Viel Erfolg, Grüße Sheena

19.04.2006 - 14:46 Uhr

Hallöle.

Ich hab ein kleines Problem. Wenn die Elemente in meiner Listview zuviele werden, erscheint die vertikale Scrollbar. Allerdings würde ich es gern haben, das die Anordung weiterhin in einer Reihe bleibt, also die HScrollBar erscheint. Da ich in dieser ListView mit Drag'n' Drop arbeite erscheint mir die horizontale Variante als die bessere.
So nun die Fragen: Kann man das einstellen? Wenn ja wo?

Sicher könnte ich eine zusätzliche ScrollbBar hinzufügen und die Auto-Scroll-Funktion des ListView ausschalten aber vielleicht muss ich ja doch nicht zur Kirche ums Dorf...

Danke im Vorraus!

Gruß, Sheena

14.04.2006 - 11:45 Uhr

Hallöle erstmal...

Womöglich hätte mir OnPaint() geholfen, aber beim Nachforschen über diese Variante habe ich gelesen, dass dies nicht sonderlich gut wäre, da ja nicht stest und ständig neugezeichnet werden muss. Trotzdem danke, hab mir jetzt mein Scroll sozusagen selbst geschrieben. Da alle meine Elemente auf der x-Achse nacheinander angeordnet sind, zeichne ich halt nur die Elemente die im Bild drin wären wenn ich scrolle. Kurz gesagt, ich zeichne nur den Auschnitt der Listen-Elemente die zu zeichnen wären.
Wahrscheinlich etwas umständlicher, aber funktioniert erstmal.
Trotzdem danke für's mitdenken - werd' wohl noch ein wenig üben müssen, mich klar auszudrücken 😁

Schöne Ostern, Sheena

13.04.2006 - 10:45 Uhr

Tachchen....

Nein, ich meinte das so, das ich normal scrolle, und das Bild sich verschiebt. Die Offset-Werte zu bekommen kriege ich hin, aber ich muss die halt an's Bild übergeben. Und die Frage ist: Wie übergebe ich den Offset ans Bild ???

MfG, Sheena

12.04.2006 - 19:49 Uhr

Hallo...

Erstmal danke für die schnelle Antwort.

Leider ist das nicht das was ich suche. Zumindest nicht exakt. Ich müsste die PictureBox für 1000x1000 Pixel groß halten, aber nur ca 400 x700 px anzeigen. Im Grunde fehlt mir ja nur noch der Step das Bild "greifen" zu können, um dies dann innerhalb der PictureBox navigieren zu können.

Trotzdem danke - vielleicht fällt dir oder jemand anderem noch etwas ein, was mir helfen könnte.

MfG, Sheena

11.04.2006 - 22:44 Uhr

Hallöle...

Bin Anfänger mit C# - also reißt mir bitte nicht den Kopf ab, wenn meine Frage zu trivial ist. 🙂
Ich habe folgendes Problem:
Ich benutze eine PictureBox (Name PaintBox) um einen Zeichenfeld zu haben. Davon hole ich mir ein Graphic-Objekt (mit g = this.PaintBox.Image). Darauf zeichne ich. Funktioniert erstmal. So, ich habe ein Zeichenblatt was ca. 1000x 1000 Pixel groß ist, das muss natürlich nicht angezeigt werden, also ist die PaintBox nur 720 x 400 Pixel. Um die gesamten Inhalt des Zeichenblattes einsehen zu können, wollte ich nun Scrollbalken verwenden. Hab sie mit der PictureBox verbunden und jeweils einen ScrollEventHandler angewendet. In dem ScrollHandler müsste dann die Verschiebe-Aktion durchgeführt werden. Den Wert um den ich schiebe bekomme ich vom Balken - das ist klar, aber

  • wie kann ich das Bild innerhalb des Sichtbereiches verschieben?

mit this.PaintBox.Left = e.newValue (für Horizontal) verschiebe ich die ganze PictureBox, und nicht das Bild in der PictureBox.

Was mache ich falsch?

Wäre für jeden Hinweis dankbar.

MfG, Sheena

05.04.2006 - 15:38 Uhr

Hallo.

Hab heute das gleiche Problem gehabt. Vielleicht kann dir meine Lösungsvariante auch helfen.

Ich habe eine Liste von Elementen. Die einzelnen Elemente werden in einem ListView in der richtigen Reihenfolge angezeigt. Wenn ich nun das reine Drag'n'Drop-Verfahren angewandt hatte, wurde das verschobene Element immer an das Ende der ListView geschoben. Hab ich mir allerdings die Elemente der ListView ausgeben lassen, wurde die gewünschte (korrekte) Reihenfolge ausgegeben. Ich bin jetzt den umständlichen Weg gegangen. Ich habe die Liste zusätzlich geändert (also zu verschiebendes Element entfernen und an Zielposition einfügen), anschließend mein ListView geleert und neu mit den Elementen der Liste bestückt.

Ist sicher umständlich, aber funktioniert.

Solltest du 'ne clevere Lösung finden, wäre es cool, wenn du es im Forum posten könntest.

Schönen Tach noch, Sheena